From 8ab77058be3ea9f13bd5e0f324627aa50d733a1b Mon Sep 17 00:00:00 2001 From: pkanwar Date: Sun, 21 May 2017 10:22:02 -0700 Subject: [PATCH 001/265] Radio Interface changes to allow the modem to query the framework for the key. We will now pass the ImsiEncryptionInfo object which includes mnc/mcc. BUG: 35606429 Test: manual Change-Id: Iae18382f1f244be6a756a47753f0345e1925ca4a --- radio/1.1/Android.mk | 38 ++++++++++++++++++++++++++++++++++++++ radio/1.1/IRadio.hal | 16 +++------------- radio/1.1/types.hal | 20 ++++++++++++++++++++ 3 files changed, 61 insertions(+), 13 deletions(-) diff --git a/radio/1.1/Android.mk b/radio/1.1/Android.mk index 305b6618ba..21c4a6aeaa 100644 --- a/radio/1.1/Android.mk +++ b/radio/1.1/Android.mk @@ -74,6 +74,25 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) +# +# Build types.hal (ImsiEncryptionInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/ImsiEncryptionInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.ImsiEncryptionInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + # # Build types.hal (NetworkScanRequest) # @@ -342,6 +361,25 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) +# +# Build types.hal (ImsiEncryptionInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/ImsiEncryptionInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.ImsiEncryptionInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + # # Build types.hal (NetworkScanRequest) # diff --git a/radio/1.1/IRadio.hal b/radio/1.1/IRadio.hal index b3e21e7b58..ea9b96f676 100644 --- a/radio/1.1/IRadio.hal +++ b/radio/1.1/IRadio.hal @@ -34,23 +34,13 @@ interface IRadio extends @1.0::IRadio { * switch and everytime the framework receives a new certificate. * * @param serial Serial number of request. - * @param carrierKey Carrier specific key to be used for encryption. It must - * be opaque to the framework. This is the byte-stream representation - * of the key. This is an external encoded form for the key used when - * a standard representation of the key is needed outside the Java - * Virtual Machine, as when transmitting the key to some other party. - * The key is encoded according to a standard format - * (such as X.509 SubjectPublicKeyInfo or PKCS#8), and is returned using - * the getEncoded method. - * @param keyIdentifier This is an opaque value we're given by the carrier - * and is returned to the carrier. This is used by the server to - * help it locate the private key to decrypt the permanent identity. + * @param message ImsiEncryptionInfo as defined in types.hal. + * * * Response callback is * IRadioResponse.setCarrierInfoForImsiEncryptionResponse() */ - oneway setCarrierInfoForImsiEncryption(int32_t serial, vec carrierKey, - string keyIdentifier); + oneway setCarrierInfoForImsiEncryption(int32_t serial, ImsiEncryptionInfo imsiEncryptionInfo); /** * Set SIM card power state. diff --git a/radio/1.1/types.hal b/radio/1.1/types.hal index 245d96c00b..bdd0338d97 100644 --- a/radio/1.1/types.hal +++ b/radio/1.1/types.hal @@ -162,3 +162,23 @@ struct NetworkScanResult { RadioError error; // The error code of the incremental result vec networkInfos; // List of network information as CellInfo }; + +struct ImsiEncryptionInfo { + string mcc; // MCC of the Carrier. + string mnc; // MNC of the Carrier. + vec carrierKey; // Carrier specific key to be used for encryption. It must + // be opaque to the framework. This is the byte-stream + // representation of the key. This is an external encoded + // form for the key used when a standard representation of + // the key is needed outside the Java Virtual Machine, as + // when transmitting the key to some other party. + // The key is encoded according to a standard format + // (such as X.509 SubjectPublicKeyInfo or PKCS#8), and is + // returned using the getEncoded method as defined on the + // java.security.Key interface. + string keyIdentifier; // This is an opaque value we're given by the carrier + // and is returned to the carrier. This is used by the server to + // help it locate the private key to decrypt the permanent + // identity. + int64_t expirationTime; // date-time in UTC when the key will expire. +}; From d84109482013f5d0920f87636861f070f04c7a80 Mon Sep 17 00:00:00 2001 From: Steve Paik Date: Tue, 6 Jun 2017 10:24:53 -0700 Subject: [PATCH 002/265] Add support of generating fake events via emulator Bug: 62358398 Test: Python scripts can enable fake events Change-Id: Id933ae59fc4d763572b88f58367a3aef0af52b6b --- .../impl/vhal_v2_0/EmulatedVehicleHal.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp index fe34a3f610..4800cd8054 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp @@ -61,10 +61,11 @@ VehicleHal::VehiclePropValuePtr EmulatedVehicleHal::get( StatusCode EmulatedVehicleHal::set(const VehiclePropValue& propValue) { if (propValue.prop == kGenerateFakeDataControllingProperty) { - return handleGenerateFakeDataRequest(propValue); - }; - - if (mHvacPowerProps.count(propValue.prop)) { + StatusCode status = handleGenerateFakeDataRequest(propValue); + if (status != StatusCode::OK) { + return status; + } + } else if (mHvacPowerProps.count(propValue.prop)) { auto hvacPowerOn = mPropStore->readValueOrNull(toInt(VehicleProperty::HVAC_POWER_ON), toInt(VehicleAreaZone::ROW_1)); @@ -176,6 +177,13 @@ bool EmulatedVehicleHal::isContinuousProperty(int32_t propId) const { } bool EmulatedVehicleHal::setPropertyFromVehicle(const VehiclePropValue& propValue) { + if (propValue.prop == kGenerateFakeDataControllingProperty) { + StatusCode status = handleGenerateFakeDataRequest(propValue); + if (status != StatusCode::OK) { + return false; + } + } + if (mPropStore->writeValue(propValue)) { doHalEvent(getValuePool()->obtain(propValue)); return true; From b2c12d664d18f9876df95be02b65353cf3c5e2a1 Mon Sep 17 00:00:00 2001 From: sqian Date: Wed, 7 Jun 2017 13:54:28 -0700 Subject: [PATCH 003/265] Add logs for some vts tests that running results seem not stable. Test: adb shell Change-Id: I417bcc4789d0c0904eb40905c2f7b4005074be3b --- radio/1.0/vts/functional/radio_hidl_hal_misc.cpp | 14 +++++++++----- radio/1.0/vts/functional/radio_hidl_hal_voice.cpp | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp index 5f319bc36d..a2e76a87b3 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp @@ -184,7 +184,7 @@ TEST_F(RadioHidlTest, setBandMode) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + EXPECT_EQ(radioRsp->rspInfo.error, RadioError::NONE); } } @@ -216,7 +216,7 @@ TEST_F(RadioHidlTest, setPreferredNetworkType) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + EXPECT_EQ(radioRsp->rspInfo.error, RadioError::NONE); } } @@ -441,6 +441,7 @@ TEST_F(RadioHidlTest, setCdmaSubscriptionSource) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { + std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::SIM_ABSENT || radioRsp->rspInfo.error == RadioError::SUBSCRIPTION_NOT_AVAILABLE); } @@ -649,6 +650,7 @@ TEST_F(RadioHidlTest, setRadioCapability) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { + std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || radioRsp->rspInfo.error == RadioError::INVALID_STATE); @@ -667,6 +669,7 @@ TEST_F(RadioHidlTest, startLceService) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { + std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::RADIO_NOT_AVAILABLE || radioRsp->rspInfo.error == RadioError::LCE_NOT_SUPPORTED || radioRsp->rspInfo.error == RadioError::INTERNAL_ERR); @@ -742,7 +745,7 @@ TEST_F(RadioHidlTest, setAllowedCarriers) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + EXPECT_EQ(radioRsp->rspInfo.error, RadioError::NONE); } /* Reset back to no carrier restriction */ @@ -756,7 +759,7 @@ TEST_F(RadioHidlTest, setAllowedCarriers) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + EXPECT_EQ(radioRsp->rspInfo.error, RadioError::NONE); } } @@ -772,7 +775,7 @@ TEST_F(RadioHidlTest, getAllowedCarriers) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + EXPECT_EQ(radioRsp->rspInfo.error, RadioError::NONE); } } @@ -822,6 +825,7 @@ TEST_F(RadioHidlTest, setSimCardPower) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { + std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); } diff --git a/radio/1.0/vts/functional/radio_hidl_hal_voice.cpp b/radio/1.0/vts/functional/radio_hidl_hal_voice.cpp index 95d00e32fc..b2ffcce39c 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_voice.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_voice.cpp @@ -365,6 +365,7 @@ TEST_F(RadioHidlTest, sendCDMAFeatureCode) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { + std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || radioRsp->rspInfo.error == RadioError::NONE || From 9095dc8e417473ff073419b1cc1cc0659c5bd58b Mon Sep 17 00:00:00 2001 From: Asaf Rosenfeld Date: Fri, 2 Jun 2017 15:10:14 -0700 Subject: [PATCH 004/265] Adding an index for Vms Layer Subtype Will rename ID to type in another CL so messages include Type and Subtype instead of Id and subtype. Test: All VMS tests are adjusted and pass. Bug:b/37627272 Change-Id: I039f952ff944605ca46a8f6f6f484aac830fc46e --- automotive/vehicle/2.1/types.hal | 3 +++ 1 file changed, 3 insertions(+) diff --git a/automotive/vehicle/2.1/types.hal b/automotive/vehicle/2.1/types.hal index 7be611c55b..d22f77fae2 100644 --- a/automotive/vehicle/2.1/types.hal +++ b/automotive/vehicle/2.1/types.hal @@ -620,6 +620,9 @@ enum VmsSimpleMessageIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { /* The version of the VMS layer. */ VMS_LAYER_VERSION = 2, + + /* The layer type as defined in the vms protocol */ + VMS_LAYER_SUB_TYPE = 3, }; /* From 2fb2eeaf3644fe69330b5417cc55456658b0d2d2 Mon Sep 17 00:00:00 2001 From: sqian Date: Fri, 9 Jun 2017 16:04:14 -0700 Subject: [PATCH 005/265] Fix vts tests: - setCdmaSubscriptionSource - nvReadItem - nvWriteItem - nvWriteCdmaPrl - getHardwareConfig - sendEnvelope - sendTerminalResponseToSim Will update .hal file seperately. Test: adb shell Bug: 35671595 Bug: 35800570 Change-Id: I651af50f122f37721778b1088df40fa6e12ac6e4 --- radio/1.0/vts/functional/radio_hidl_hal_misc.cpp | 13 +++++++------ radio/1.0/vts/functional/radio_hidl_hal_stk.cpp | 14 +++++++++++--- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp index 463dba391d..f96529660f 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp @@ -442,8 +442,9 @@ TEST_F(RadioHidlTest, setCdmaSubscriptionSource) { if (cardStatus.cardState == CardState::ABSENT) { std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::SIM_ABSENT || - radioRsp->rspInfo.error == RadioError::SUBSCRIPTION_NOT_AVAILABLE); + ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::SIM_ABSENT || + radioRsp->rspInfo.error == RadioError::SUBSCRIPTION_NOT_AVAILABLE || + radioRsp->rspInfo.error == RadioError::NONE); } } @@ -509,7 +510,7 @@ TEST_F(RadioHidlTest, nvReadItem) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::NONE); } } @@ -528,7 +529,7 @@ TEST_F(RadioHidlTest, nvWriteItem) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::NONE); } } @@ -545,7 +546,7 @@ TEST_F(RadioHidlTest, nvWriteCdmaPrl) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::NONE); } } @@ -599,7 +600,7 @@ TEST_F(RadioHidlTest, getHardwareConfig) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::NONE); } } diff --git a/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp b/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp index 345747bdb0..6ff033032e 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp @@ -34,8 +34,10 @@ TEST_F(RadioHidlTest, sendEnvelope) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { + std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(CheckGeneralError() || - radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS); + radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || + radioRsp->rspInfo.error == RadioError::NONE); } // Test with sending random string @@ -49,8 +51,10 @@ TEST_F(RadioHidlTest, sendEnvelope) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { + std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(CheckGeneralError() || - radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS); + radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || + radioRsp->rspInfo.error == RadioError::NONE); } } @@ -70,7 +74,10 @@ TEST_F(RadioHidlTest, sendTerminalResponseToSim) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - EXPECT_EQ(RadioError::NONE, radioRsp->rspInfo.error); + std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; + ASSERT_TRUE(CheckGeneralError() || + radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || + radioRsp->rspInfo.error == RadioError::NONE); } serial = GetRandomSerialNumber(); @@ -85,6 +92,7 @@ TEST_F(RadioHidlTest, sendTerminalResponseToSim) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { + std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS); } From 491fe84c2d51f5d08f93a7e2bbbe58f403d07359 Mon Sep 17 00:00:00 2001 From: Andrew Scull Date: Mon, 12 Jun 2017 16:38:46 +0100 Subject: [PATCH 006/265] Weaver: functional VTS tests Bug: 37530412 Test: VtsHalWeaverV1_0TargetTest Change-Id: I6309acac45321b221c885cb10ca30bf653aa23ab --- weaver/1.0/vts/functional/Android.bp | 36 ++ .../functional/VtsHalWeaverV1_0TargetTest.cpp | 336 ++++++++++++++++++ weaver/Android.bp | 1 + 3 files changed, 373 insertions(+) create mode 100644 weaver/1.0/vts/functional/Android.bp create mode 100644 weaver/1.0/vts/functional/VtsHalWeaverV1_0TargetTest.cpp diff --git a/weaver/1.0/vts/functional/Android.bp b/weaver/1.0/vts/functional/Android.bp new file mode 100644 index 0000000000..9b0ff6df31 --- /dev/null +++ b/weaver/1.0/vts/functional/Android.bp @@ -0,0 +1,36 @@ +// +// Copyright (C) 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. +// + +cc_test { + name: "VtsHalWeaverV1_0TargetTest", + defaults: ["hidl_defaults"], + srcs: ["VtsHalWeaverV1_0TargetTest.cpp"], + shared_libs: [ + "libbase", + "liblog", + "libcutils", + "libhidlbase", + "libhidltransport", + "libnativehelper", + "libutils", + "android.hardware.weaver@1.0", + ], + static_libs: ["VtsHalHidlTargetTestBase"], + cflags: [ + "-O0", + "-g", + ], +} diff --git a/weaver/1.0/vts/functional/VtsHalWeaverV1_0TargetTest.cpp b/weaver/1.0/vts/functional/VtsHalWeaverV1_0TargetTest.cpp new file mode 100644 index 0000000000..372d78715b --- /dev/null +++ b/weaver/1.0/vts/functional/VtsHalWeaverV1_0TargetTest.cpp @@ -0,0 +1,336 @@ +/* + * Copyright (C) 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. + */ + +#include + +#include + +#include + +using ::android::hardware::weaver::V1_0::IWeaver; +using ::android::hardware::weaver::V1_0::WeaverConfig; +using ::android::hardware::weaver::V1_0::WeaverReadStatus; +using ::android::hardware::weaver::V1_0::WeaverReadResponse; +using ::android::hardware::weaver::V1_0::WeaverStatus; +using ::android::hardware::Return; +using ::android::sp; + +const std::vector KEY{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; +const std::vector WRONG_KEY{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +const std::vector VALUE{16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; +const std::vector OTHER_VALUE{0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 255, 255}; + +struct WeaverHidlTest : public ::testing::VtsHalHidlTargetTestBase { + virtual void SetUp() override { + weaver = ::testing::VtsHalHidlTargetTestBase::getService(); + ASSERT_NE(weaver, nullptr); + } + + virtual void TearDown() override {} + + sp weaver; +}; + +/* + * Checks config values are suitably large + */ +TEST_F(WeaverHidlTest, GetConfig) { + WeaverStatus status; + WeaverConfig config; + + bool callbackCalled = false; + auto ret = weaver->getConfig([&](WeaverStatus s, WeaverConfig c) { + callbackCalled = true; + status = s; + config = c; + }); + ASSERT_TRUE(ret.isOk()); + ASSERT_TRUE(callbackCalled); + ASSERT_EQ(status, WeaverStatus::OK); + + EXPECT_GE(config.slots, 16u); + EXPECT_GE(config.keySize, 16u); + EXPECT_GE(config.valueSize, 16u); +} + +/* + * Gets the config twice and checks they are the same + */ +TEST_F(WeaverHidlTest, GettingConfigMultipleTimesGivesSameResult) { + WeaverConfig config1; + WeaverConfig config2; + + WeaverStatus status; + bool callbackCalled = false; + auto ret = weaver->getConfig([&](WeaverStatus s, WeaverConfig c) { + callbackCalled = true; + status = s; + config1 = c; + }); + ASSERT_TRUE(ret.isOk()); + ASSERT_TRUE(callbackCalled); + ASSERT_EQ(status, WeaverStatus::OK); + + callbackCalled = false; + ret = weaver->getConfig([&](WeaverStatus s, WeaverConfig c) { + callbackCalled = true; + status = s; + config2 = c; + }); + ASSERT_TRUE(ret.isOk()); + ASSERT_TRUE(callbackCalled); + ASSERT_EQ(status, WeaverStatus::OK); + + EXPECT_EQ(config1, config2); +} + +/* + * Gets the number of slots from the config and writes a key and value to the last one + */ +TEST_F(WeaverHidlTest, WriteToLastSlot) { + WeaverStatus status; + WeaverConfig config; + const auto configRet = weaver->getConfig([&](WeaverStatus s, WeaverConfig c) { + status = s; + config = c; + }); + ASSERT_TRUE(configRet.isOk()); + ASSERT_EQ(status, WeaverStatus::OK); + + const uint32_t lastSlot = config.slots - 1; + const auto writeRet = weaver->write(lastSlot, KEY, VALUE); + ASSERT_TRUE(writeRet.isOk()); + ASSERT_EQ(writeRet, WeaverStatus::OK); +} + +/* + * Writes a key and value to a slot + * Reads the slot with the same key and receives the value that was previously written + */ +TEST_F(WeaverHidlTest, WriteFollowedByReadGivesTheSameValue) { + constexpr uint32_t slotId = 0; + const auto ret = weaver->write(slotId, KEY, VALUE); + ASSERT_TRUE(ret.isOk()); + ASSERT_EQ(ret, WeaverStatus::OK); + + bool callbackCalled = false; + WeaverReadStatus status; + std::vector readValue; + uint32_t timeout; + const auto readRet = weaver->read(slotId, KEY, [&](WeaverReadStatus s, WeaverReadResponse r) { + callbackCalled = true; + status = s; + readValue = r.value; + timeout = r.timeout; + }); + ASSERT_TRUE(readRet.isOk()); + ASSERT_TRUE(callbackCalled); + ASSERT_EQ(status, WeaverReadStatus::OK); + EXPECT_EQ(readValue, VALUE); + EXPECT_EQ(timeout, 0u); +} + +/* + * Writes a key and value to a slot + * Overwrites the slot with a new key and value + * Reads the slot with the new key and receives the new value + */ +TEST_F(WeaverHidlTest, OverwritingSlotUpdatesTheValue) { + constexpr uint32_t slotId = 0; + const auto initialWriteRet = weaver->write(slotId, WRONG_KEY, VALUE); + ASSERT_TRUE(initialWriteRet.isOk()); + ASSERT_EQ(initialWriteRet, WeaverStatus::OK); + + const auto overwriteRet = weaver->write(slotId, KEY, OTHER_VALUE); + ASSERT_TRUE(overwriteRet.isOk()); + ASSERT_EQ(overwriteRet, WeaverStatus::OK); + + bool callbackCalled = false; + WeaverReadStatus status; + std::vector readValue; + uint32_t timeout; + const auto readRet = weaver->read(slotId, KEY, [&](WeaverReadStatus s, WeaverReadResponse r) { + callbackCalled = true; + status = s; + readValue = r.value; + timeout = r.timeout; + }); + ASSERT_TRUE(readRet.isOk()); + ASSERT_TRUE(callbackCalled); + ASSERT_EQ(status, WeaverReadStatus::OK); + EXPECT_EQ(readValue, OTHER_VALUE); + EXPECT_EQ(timeout, 0u); +} + +/* + * Writes a key and value to a slot + * Reads the slot with a different key so does not receive the value + */ +TEST_F(WeaverHidlTest, WriteFollowedByReadWithWrongKeyDoesNotGiveTheValue) { + constexpr uint32_t slotId = 0; + const auto ret = weaver->write(slotId, KEY, VALUE); + ASSERT_TRUE(ret.isOk()); + ASSERT_EQ(ret, WeaverStatus::OK); + + bool callbackCalled = false; + WeaverReadStatus status; + std::vector readValue; + const auto readRet = + weaver->read(slotId, WRONG_KEY, [&](WeaverReadStatus s, WeaverReadResponse r) { + callbackCalled = true; + status = s; + readValue = r.value; + }); + ASSERT_TRUE(callbackCalled); + ASSERT_TRUE(readRet.isOk()); + ASSERT_EQ(status, WeaverReadStatus::INCORRECT_KEY); + EXPECT_TRUE(readValue.empty()); +} + +/* + * Writing to an invalid slot fails + */ +TEST_F(WeaverHidlTest, WritingToInvalidSlotFails) { + WeaverStatus status; + WeaverConfig config; + const auto configRet = weaver->getConfig([&](WeaverStatus s, WeaverConfig c) { + status = s; + config = c; + }); + ASSERT_TRUE(configRet.isOk()); + ASSERT_EQ(status, WeaverStatus::OK); + + if (config.slots == std::numeric_limits::max()) { + // If there are no invalid slots then pass + return; + } + + const auto writeRet = weaver->write(config.slots, KEY, VALUE); + ASSERT_TRUE(writeRet.isOk()); + ASSERT_EQ(writeRet, WeaverStatus::FAILED); +} + +/* + * Reading from an invalid slot fails rather than incorrect key + */ +TEST_F(WeaverHidlTest, ReadingFromInvalidSlotFails) { + WeaverStatus status; + WeaverConfig config; + const auto configRet = weaver->getConfig([&](WeaverStatus s, WeaverConfig c) { + status = s; + config = c; + }); + ASSERT_TRUE(configRet.isOk()); + ASSERT_EQ(status, WeaverStatus::OK); + + if (config.slots == std::numeric_limits::max()) { + // If there are no invalid slots then pass + return; + } + + bool callbackCalled = false; + WeaverReadStatus readStatus; + std::vector readValue; + uint32_t timeout; + const auto readRet = + weaver->read(config.slots, KEY, [&](WeaverReadStatus s, WeaverReadResponse r) { + callbackCalled = true; + readStatus = s; + readValue = r.value; + timeout = r.timeout; + }); + ASSERT_TRUE(callbackCalled); + ASSERT_TRUE(readRet.isOk()); + ASSERT_EQ(readStatus, WeaverReadStatus::FAILED); + EXPECT_TRUE(readValue.empty()); + EXPECT_EQ(timeout, 0u); +} + +/* + * Writing a key that is too large fails + */ +TEST_F(WeaverHidlTest, WriteWithTooLargeKeyFails) { + WeaverStatus status; + WeaverConfig config; + const auto configRet = weaver->getConfig([&](WeaverStatus s, WeaverConfig c) { + status = s; + config = c; + }); + ASSERT_TRUE(configRet.isOk()); + ASSERT_EQ(status, WeaverStatus::OK); + + std::vector bigKey(config.keySize + 1); + + constexpr uint32_t slotId = 0; + const auto writeRet = weaver->write(slotId, bigKey, VALUE); + ASSERT_TRUE(writeRet.isOk()); + ASSERT_EQ(writeRet, WeaverStatus::FAILED); +} + +/* + * Writing a value that is too large fails + */ +TEST_F(WeaverHidlTest, WriteWithTooLargeValueFails) { + WeaverStatus status; + WeaverConfig config; + const auto configRet = weaver->getConfig([&](WeaverStatus s, WeaverConfig c) { + status = s; + config = c; + }); + ASSERT_TRUE(configRet.isOk()); + ASSERT_EQ(status, WeaverStatus::OK); + + std::vector bigValue(config.valueSize + 1); + + constexpr uint32_t slotId = 0; + const auto writeRet = weaver->write(slotId, KEY, bigValue); + ASSERT_TRUE(writeRet.isOk()); + ASSERT_EQ(writeRet, WeaverStatus::FAILED); +} + +/* + * Reading with a key that is loo large fails + */ +TEST_F(WeaverHidlTest, ReadWithTooLargeKeyFails) { + WeaverStatus status; + WeaverConfig config; + const auto configRet = weaver->getConfig([&](WeaverStatus s, WeaverConfig c) { + status = s; + config = c; + }); + ASSERT_TRUE(configRet.isOk()); + ASSERT_EQ(status, WeaverStatus::OK); + + std::vector bigKey(config.keySize + 1); + + constexpr uint32_t slotId = 0; + bool callbackCalled = false; + WeaverReadStatus readStatus; + std::vector readValue; + uint32_t timeout; + const auto readRet = + weaver->read(slotId, bigKey, [&](WeaverReadStatus s, WeaverReadResponse r) { + callbackCalled = true; + readStatus = s; + readValue = r.value; + timeout = r.timeout; + }); + ASSERT_TRUE(callbackCalled); + ASSERT_TRUE(readRet.isOk()); + ASSERT_EQ(readStatus, WeaverReadStatus::FAILED); + EXPECT_TRUE(readValue.empty()); + EXPECT_EQ(timeout, 0u); +} diff --git a/weaver/Android.bp b/weaver/Android.bp index bbb3e4bac0..33f70ebae2 100644 --- a/weaver/Android.bp +++ b/weaver/Android.bp @@ -1,4 +1,5 @@ // This is an autogenerated file, do not edit. subdirs = [ "1.0", + "1.0/vts/functional", ] From 02b9cbaa85b08fba5dffba54a003258ec3b445a3 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Tue, 13 Jun 2017 09:34:30 -0700 Subject: [PATCH 007/265] Implement getProperties_1_1 for broadcast radio 1.1 default implementation. Bug: b/36863239 Bug: b/38167547 Test: instrumentation Change-Id: I129ff7c1a1e6a4711b6352dd6f22d16a324066f3 --- broadcastradio/1.1/default/BroadcastRadio.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/broadcastradio/1.1/default/BroadcastRadio.cpp b/broadcastradio/1.1/default/BroadcastRadio.cpp index 68c9b93870..d65fe6d63b 100644 --- a/broadcastradio/1.1/default/BroadcastRadio.cpp +++ b/broadcastradio/1.1/default/BroadcastRadio.cpp @@ -115,9 +115,17 @@ exit: return Void(); } -Return BroadcastRadio::getProperties_1_1(getProperties_1_1_cb _hidl_cb __unused) -{ - return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION); +Return BroadcastRadio::getProperties_1_1(getProperties_1_1_cb _hidl_cb) { + radio_hal_properties_t halProperties; + V1_1::Properties properties = {}; + + LOG_ALWAYS_FATAL_IF(mHwDevice == nullptr, "HW device is not set"); + int rc = mHwDevice->get_properties(mHwDevice, &halProperties); + LOG_ALWAYS_FATAL_IF(rc != 0, "Couldn't get device properties"); + Utils::convertPropertiesFromHal(&properties.base, &halProperties); + + _hidl_cb(properties); + return Void(); } Return BroadcastRadio::openTuner(const BandConfig& config, bool audio, From 322a326ea4e7d37fbaa524428269ed24b6e68744 Mon Sep 17 00:00:00 2001 From: Asaf Rosenfeld Date: Fri, 16 Jun 2017 14:48:21 -0700 Subject: [PATCH 008/265] Adding Publisher ID to VMS HAL messages Test: all tests were adjusted and pass Change-Id: I4514b14d298d8464c0aabf62286529e5da2cda96 --- automotive/vehicle/2.1/types.hal | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/automotive/vehicle/2.1/types.hal b/automotive/vehicle/2.1/types.hal index d22f77fae2..2d1aa465c4 100644 --- a/automotive/vehicle/2.1/types.hal +++ b/automotive/vehicle/2.1/types.hal @@ -585,20 +585,26 @@ enum VmsMessageType : int32_t { /** A client publishes a data packet. */ DATA = 3, - /* A client declaring layers offering. */ + /** A client declaring layers offering. */ OFFERING = 4, - /* Requesting the list of available layers. */ + /** Requesting the list of available layers. */ AVAILABILITY_REQUEST = 5, - /* Returning the list of available layers. */ + /** Returning the list of available layers. */ AVAILABILITY_RESPONSE = 6, + /** Sending to the HAL the current list of the available layers. */ + AVAILABILITY_CHANGE = 7, + /** Requesting layers that have subscribers. */ - SUBSCRIPTION_REQUEST = 7, + SUBSCRIPTIONS_REQUEST = 8, /** Returning layers that have subscribers. */ - SUBSCRIPTION_RESPONSE = 8, + SUBSCRIPTIONS_RESPONSE = 9, + + /** Sending to the HAL the current list of the subscribed layers. */ + SUBSCRIPTIONS_CHANGE = 10, }; /** @@ -630,11 +636,14 @@ enum VmsSimpleMessageIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { * value properties */ enum VmsOfferingMessageIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { + /* The ID assigend to the publisher by the VMS core. */ + PUBLISHER_ID = 1, + /* The number of VMS layer dependencies. */ - VMS_NUMBER_OF_LAYERS_DEPENDENCIES = 1, + VMS_NUMBER_OF_LAYERS_DEPENDENCIES = 2, /* The first index that contain dependencies */ - FIRST_DEPENDENCIES_INDEX = 2, + FIRST_DEPENDENCIES_INDEX = 3, }; /** From b7ae92bacbb83e3ca2c55efaa1ccb38422d4de8d Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Thu, 15 Jun 2017 15:59:12 +0530 Subject: [PATCH 009/265] bug fix: configure output port frame dimensions frame dimensions are configured for input port but not output port. As a result in qcom encoder components, the encoded image is getting downsized to default dimensions configured for output port. This is now corrected. Test: make vts -j30 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 && vts-tradefed run commandAndExit vts --skip-all-system-status-check --primary-abi-only --skip-preconditions --module VtsHalMediaOmxV1_0Test -l INFO Bug: 62669756 Change-Id: Ib38006edbc82427d322632534ca78d78c5f30eff --- .../VtsHalMediaOmxV1_0TargetVideoEncTest.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp index cd6eaf5632..f6bc93a627 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp @@ -521,12 +521,15 @@ void getLatency(sp omxNode, OMX_U32 portIndex, uint32_t* latency) { // Set Default port param. void setDefaultPortParam(sp omxNode, OMX_U32 portIndex, OMX_VIDEO_CODINGTYPE eCompressionFormat, + OMX_U32 nFrameWidth, OMX_U32 nFrameHeight, OMX_U32 nBitrate, OMX_U32 xFramerate) { android::hardware::media::omx::V1_0::Status status; OMX_PARAM_PORTDEFINITIONTYPE portDef; status = getPortParam(omxNode, OMX_IndexParamPortDefinition, portIndex, &portDef); EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + portDef.format.video.nFrameWidth = nFrameWidth; + portDef.format.video.nFrameHeight = nFrameHeight; portDef.format.video.nBitrate = nBitrate; portDef.format.video.xFramerate = xFramerate; portDef.format.video.bFlagErrorConcealment = OMX_TRUE; @@ -1028,6 +1031,9 @@ void encodeNFrames(sp omxNode, sp observer, } else if (msg.data.eventData.event == OMX_EventError) { EXPECT_TRUE(false) << "Received OMX_EventError, not sure why"; break; + } else if (msg.data.eventData.event == OMX_EventDataSpaceChanged) { + // TODO: how am i supposed to respond now? + std::cout << "[ ] Info ! OMX_EventDataSpaceChanged \n"; } else { ASSERT_TRUE(false); } @@ -1234,8 +1240,8 @@ TEST_F(VideoEncHidlTest, EncodeTest) { // Configure output port uint32_t nBitRate = 512000; - setDefaultPortParam(omxNode, kPortIndexOutput, eCompressionFormat, nBitRate, - xFramerate); + setDefaultPortParam(omxNode, kPortIndexOutput, eCompressionFormat, + nFrameWidth, nFrameHeight, nBitRate, xFramerate); setRefreshPeriod(omxNode, kPortIndexOutput, 0); unsigned int index; @@ -1319,6 +1325,11 @@ TEST_F(VideoEncHidlTest, EncodeTestBufferMetaModes) { setupRAWPort(omxNode, kPortIndexInput, nFrameWidth, nFrameHeight, 0, xFramerate, eColorFormat); + // Configure output port + uint32_t nBitRate = 512000; + setDefaultPortParam(omxNode, kPortIndexOutput, eCompressionFormat, + nFrameWidth, nFrameHeight, nBitRate, xFramerate); + // CreateInputSurface EXPECT_TRUE(omx->createInputSurface( [&](android::hardware::media::omx::V1_0::Status _s, From c525408c60373cb86fa5ffaa8dabb0945ab41716 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Wed, 21 Jun 2017 12:57:02 -0700 Subject: [PATCH 010/265] Remove toString methods in Vehicle HAL. These methods are already generated by HIDL, but this is only now being realized. Test: methods no longer conflict Change-Id: I522630267beb7f87713a0a54c1ecb38077dc1b4e --- .../2.0/default/tests/VehicleHalTestUtils.h | 48 ------------------- 1 file changed, 48 deletions(-) diff --git a/automotive/vehicle/2.0/default/tests/VehicleHalTestUtils.h b/automotive/vehicle/2.0/default/tests/VehicleHalTestUtils.h index 28e1a5a557..2a064175a7 100644 --- a/automotive/vehicle/2.0/default/tests/VehicleHalTestUtils.h +++ b/automotive/vehicle/2.0/default/tests/VehicleHalTestUtils.h @@ -222,54 +222,6 @@ inline std::string vecToString(const hidl_vec& vec) { return ss.str(); } -inline std::string toString(const VehiclePropValue &v) { - std::stringstream ss; - ss << "VehiclePropValue {n" - << " prop: " << hexString(v.prop) << ",\n" - << " areaId: " << hexString(v.areaId) << ",\n" - << " timestamp: " << v.timestamp << ",\n" - << " value {\n" - << " int32Values: " << vecToString(v.value.int32Values) << ",\n" - << " floatValues: " << vecToString(v.value.floatValues) << ",\n" - << " int64Values: " << vecToString(v.value.int64Values) << ",\n" - << " bytes: " << vecToString(v.value.bytes) << ",\n" - << " string: " << v.value.stringValue.c_str() << ",\n" - << " }\n" - << "}\n"; - - return ss.str(); -} - -inline std::string toString(const VehiclePropConfig &config) { - std::stringstream ss; - ss << "VehiclePropConfig {\n" - << " prop: " << hexString(config.prop) << ",\n" - << " supportedAreas: " << hexString(config.supportedAreas) << ",\n" - << " access: " << enumToHexString(config.access) << ",\n" - << " changeMode: " << enumToHexString(config.changeMode) << ",\n" - << " configFlags: " << hexString(config.configFlags) << ",\n" - << " minSampleRate: " << config.minSampleRate << ",\n" - << " maxSampleRate: " << config.maxSampleRate << ",\n" - << " configString: " << config.configString.c_str() << ",\n"; - - ss << " areaConfigs {\n"; - for (size_t i = 0; i < config.areaConfigs.size(); i++) { - const auto &area = config.areaConfigs[i]; - ss << " areaId: " << hexString(area.areaId) << ",\n" - << " minFloatValue: " << area.minFloatValue << ",\n" - << " minFloatValue: " << area.maxFloatValue << ",\n" - << " minInt32Value: " << area.minInt32Value << ",\n" - << " minInt32Value: " << area.maxInt32Value << ",\n" - << " minInt64Value: " << area.minInt64Value << ",\n" - << " minInt64Value: " << area.maxInt64Value << ",\n"; - } - ss << " }\n" - << "}\n"; - - return ss.str(); -} - - } // namespace V2_0 } // namespace vehicle } // namespace automotive From 1bb4cc080b25adfbc7765b9035dca822cb7414d0 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Thu, 22 Jun 2017 13:53:12 +0530 Subject: [PATCH 011/265] bug fix: pass comp name information to port reconfiguration at all calls This is a follow up for 553f633762ef748d04717c3cc4b4dbfecb203620 commit Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Test -l INFO Bug: 62893665 Change-Id: Ic979964bff9c2240e9d9469238882efa86467399 --- .../audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp index fe67cb9b2e..031584bc67 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp @@ -568,7 +568,8 @@ void waitOnInputConsumption(sp omxNode, sp observer, android::Vector* iBuffer, android::Vector* oBuffer, OMX_AUDIO_CODINGTYPE eEncoding, - OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput) { + OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, + AudioDecHidlTest::standardComp comp) { android::hardware::media::omx::V1_0::Status status; Message msg; int timeOut = TIMEOUT_COUNTER; @@ -580,7 +581,7 @@ void waitOnInputConsumption(sp omxNode, sp observer, if (status == android::hardware::media::omx::V1_0::Status::OK) { EXPECT_EQ(msg.type, Message::Type::EVENT); portReconfiguration(omxNode, observer, iBuffer, oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, msg); + kPortIndexInput, kPortIndexOutput, msg, comp); } // status == TIMED_OUT, it could be due to process time being large // than DEFAULT_TIMEOUT or component needs output buffers to start @@ -789,7 +790,7 @@ TEST_F(AudioDecHidlTest, DecodeTest) { (int)Info.size(), compName); eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput); + kPortIndexInput, kPortIndexOutput, compName); testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); EXPECT_EQ(timestampUslist.empty(), true); // set state to idle @@ -933,7 +934,7 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { compName); eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput); + kPortIndexInput, kPortIndexOutput, compName); testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); @@ -949,7 +950,7 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { compName, false); eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput); + kPortIndexInput, kPortIndexOutput, compName); testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); @@ -1034,7 +1035,7 @@ TEST_F(AudioDecHidlTest, SimpleEOSTest) { (int)Info.size(), compName, false); eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput); + kPortIndexInput, kPortIndexOutput, compName); testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); From a77ed50c15fbbe70b93eac0c5d03e633491ff303 Mon Sep 17 00:00:00 2001 From: Shawn Willden Date: Fri, 16 Jun 2017 08:18:06 -0600 Subject: [PATCH 012/265] Test import of a EC P-521 key. This failure is also diagnosed by CTS, but it should be validated in VTS as well. Merged-In: Ia7654ff8813942fbca9dfa838337e9de5839a9e2 Bug: 33945114 Test: adb shell data/nativetests64/VtsHalKeymasterV3_0TargetTest/VtsHalKeymasterV3_0TargetTest Change-Id: Ia7654ff8813942fbca9dfa838337e9de5839a9e2 --- .../functional/keymaster_hidl_hal_test.cpp | 101 ++++++++++++------ 1 file changed, 70 insertions(+), 31 deletions(-) diff --git a/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp b/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp index 570e33fe88..218c520d68 100644 --- a/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp +++ b/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp @@ -247,34 +247,47 @@ string bin2hex(const hidl_vec& data) { return retval; } -string rsa_key = hex2str("30820275020100300d06092a864886f70d01010105000482025f3082025b" - "02010002818100c6095409047d8634812d5a218176e45c41d60a75b13901" - "f234226cffe776521c5a77b9e389417b71c0b6a44d13afe4e4a2805d46c9" - "da2935adb1ff0c1f24ea06e62b20d776430a4d435157233c6f916783c30e" - "310fcbd89b85c2d56771169785ac12bca244abda72bfb19fc44d27c81e1d" - "92de284f4061edfd99280745ea6d2502030100010281801be0f04d9cae37" - "18691f035338308e91564b55899ffb5084d2460e6630257e05b3ceab0297" - "2dfabcd6ce5f6ee2589eb67911ed0fac16e43a444b8c861e544a05933657" - "72f8baf6b22fc9e3c5f1024b063ac080a7b2234cf8aee8f6c47bbf4fd3ac" - "e7240290bef16c0b3f7f3cdd64ce3ab5912cf6e32f39ab188358afcccd80" - "81024100e4b49ef50f765d3b24dde01aceaaf130f2c76670a91a61ae08af" - "497b4a82be6dee8fcdd5e3f7ba1cfb1f0c926b88f88c92bfab137fba2285" - "227b83c342ff7c55024100ddabb5839c4c7f6bf3d4183231f005b31aa58a" - "ffdda5c79e4cce217f6bc930dbe563d480706c24e9ebfcab28a6cdefd324" - "b77e1bf7251b709092c24ff501fd91024023d4340eda3445d8cd26c14411" - "da6fdca63c1ccd4b80a98ad52b78cc8ad8beb2842c1d280405bc2f6c1bea" - "214a1d742ab996b35b63a82a5e470fa88dbf823cdd02401b7b57449ad30d" - "1518249a5f56bb98294d4b6ac12ffc86940497a5a5837a6cf946262b4945" - "26d328c11e1126380fde04c24f916dec250892db09a6d77cdba351024077" - "62cd8f4d050da56bd591adb515d24d7ccd32cca0d05f866d583514bd7324" - "d5f33645e8ed8b4a1cb3cc4a1d67987399f2a09f5b3fb68c88d5e5d90ac3" - "3492d6"); +string rsa_key = hex2str( + "30820275020100300d06092a864886f70d01010105000482025f3082025b" + "02010002818100c6095409047d8634812d5a218176e45c41d60a75b13901" + "f234226cffe776521c5a77b9e389417b71c0b6a44d13afe4e4a2805d46c9" + "da2935adb1ff0c1f24ea06e62b20d776430a4d435157233c6f916783c30e" + "310fcbd89b85c2d56771169785ac12bca244abda72bfb19fc44d27c81e1d" + "92de284f4061edfd99280745ea6d2502030100010281801be0f04d9cae37" + "18691f035338308e91564b55899ffb5084d2460e6630257e05b3ceab0297" + "2dfabcd6ce5f6ee2589eb67911ed0fac16e43a444b8c861e544a05933657" + "72f8baf6b22fc9e3c5f1024b063ac080a7b2234cf8aee8f6c47bbf4fd3ac" + "e7240290bef16c0b3f7f3cdd64ce3ab5912cf6e32f39ab188358afcccd80" + "81024100e4b49ef50f765d3b24dde01aceaaf130f2c76670a91a61ae08af" + "497b4a82be6dee8fcdd5e3f7ba1cfb1f0c926b88f88c92bfab137fba2285" + "227b83c342ff7c55024100ddabb5839c4c7f6bf3d4183231f005b31aa58a" + "ffdda5c79e4cce217f6bc930dbe563d480706c24e9ebfcab28a6cdefd324" + "b77e1bf7251b709092c24ff501fd91024023d4340eda3445d8cd26c14411" + "da6fdca63c1ccd4b80a98ad52b78cc8ad8beb2842c1d280405bc2f6c1bea" + "214a1d742ab996b35b63a82a5e470fa88dbf823cdd02401b7b57449ad30d" + "1518249a5f56bb98294d4b6ac12ffc86940497a5a5837a6cf946262b4945" + "26d328c11e1126380fde04c24f916dec250892db09a6d77cdba351024077" + "62cd8f4d050da56bd591adb515d24d7ccd32cca0d05f866d583514bd7324" + "d5f33645e8ed8b4a1cb3cc4a1d67987399f2a09f5b3fb68c88d5e5d90ac3" + "3492d6"); -string ec_key = hex2str("308187020100301306072a8648ce3d020106082a8648ce3d030107046d30" - "6b0201010420737c2ecd7b8d1940bf2930aa9b4ed3ff941eed09366bc032" - "99986481f3a4d859a14403420004bf85d7720d07c25461683bc648b4778a" - "9a14dd8a024e3bdd8c7ddd9ab2b528bbc7aa1b51f14ebbbb0bd0ce21bcc4" - "1c6eb00083cf3376d11fd44949e0b2183bfe"); +string ec_256_key = hex2str( + "308187020100301306072a8648ce3d020106082a8648ce3d030107046d30" + "6b0201010420737c2ecd7b8d1940bf2930aa9b4ed3ff941eed09366bc032" + "99986481f3a4d859a14403420004bf85d7720d07c25461683bc648b4778a" + "9a14dd8a024e3bdd8c7ddd9ab2b528bbc7aa1b51f14ebbbb0bd0ce21bcc4" + "1c6eb00083cf3376d11fd44949e0b2183bfe"); + +string ec_521_key = hex2str( + "3081EE020100301006072A8648CE3D020106052B810400230481D63081D3" + "02010104420011458C586DB5DAA92AFAB03F4FE46AA9D9C3CE9A9B7A006A" + "8384BEC4C78E8E9D18D7D08B5BCFA0E53C75B064AD51C449BAE0258D54B9" + "4B1E885DED08ED4FB25CE9A1818903818600040149EC11C6DF0FA122C6A9" + "AFD9754A4FA9513A627CA329E349535A5629875A8ADFBE27DCB932C05198" + "6377108D054C28C6F39B6F2C9AF81802F9F326B842FF2E5F3C00AB7635CF" + "B36157FC0882D574A10D839C1A0C049DC5E0D775E2EE50671A208431BB45" + "E78E70BEFE930DB34818EE4D5C26259F5C6B8E28A652950F9F88D7B4B2C9" + "D9"); struct RSA_Delete { void operator()(RSA* p) { RSA_free(p); } @@ -2377,14 +2390,14 @@ TEST_F(ImportKeyTest, RsaPublicExponentMismatch) { /* * ImportKeyTest.EcdsaSuccess * - * Verifies that importing and using an ECDSA key pair works correctly. + * Verifies that importing and using an ECDSA P-256 key pair works correctly. */ TEST_F(ImportKeyTest, EcdsaSuccess) { ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder() .Authorization(TAG_NO_AUTH_REQUIRED) .EcdsaSigningKey(256) .Digest(Digest::SHA_2_256), - KeyFormat::PKCS8, ec_key)) + KeyFormat::PKCS8, ec_256_key)) << "(Possibly b/33945114)"; CheckKm0CryptoParam(TAG_ALGORITHM, Algorithm::EC); @@ -2400,6 +2413,32 @@ TEST_F(ImportKeyTest, EcdsaSuccess) { VerifyMessage(message, signature, params); } +/* + * ImportKeyTest.Ecdsa521Success + * + * Verifies that importing and using an ECDSA P-521 key pair works correctly. + */ +TEST_F(ImportKeyTest, Ecdsa521Success) { + ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder() + .Authorization(TAG_NO_AUTH_REQUIRED) + .EcdsaSigningKey(521) + .Digest(Digest::SHA_2_256), + KeyFormat::PKCS8, ec_521_key)) + << "(Possibly b/33945114)"; + + CheckKm0CryptoParam(TAG_ALGORITHM, Algorithm::EC); + CheckKm0CryptoParam(TAG_KEY_SIZE, 521U); + CheckKm1CryptoParam(TAG_DIGEST, Digest::SHA_2_256); + CheckKm2CryptoParam(TAG_EC_CURVE, EcCurve::P_521); + + CheckOrigin(); + + string message(32, 'a'); + auto params = AuthorizationSetBuilder().Digest(Digest::SHA_2_256); + string signature = SignMessage(message, params); + VerifyMessage(message, signature, params); +} + /* * ImportKeyTest.EcdsaSizeMismatch * @@ -2411,7 +2450,7 @@ TEST_F(ImportKeyTest, EcdsaSizeMismatch) { ImportKey(AuthorizationSetBuilder() .EcdsaSigningKey(224 /* Doesn't match key */) .Digest(Digest::NONE), - KeyFormat::PKCS8, ec_key)); + KeyFormat::PKCS8, ec_256_key)); } /* @@ -2430,7 +2469,7 @@ TEST_F(ImportKeyTest, EcdsaCurveMismatch) { ImportKey(AuthorizationSetBuilder() .EcdsaSigningKey(EcCurve::P_224 /* Doesn't match key */) .Digest(Digest::NONE), - KeyFormat::PKCS8, ec_key)) + KeyFormat::PKCS8, ec_256_key)) << "(Possibly b/36233241)"; } From a4f6751e49cca8cd1b673a3917c38ae0620754fc Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Mon, 24 Apr 2017 17:18:25 -0700 Subject: [PATCH 013/265] cas: add CAS hal Add CAS hal definitions and default service implementation. bug: 22804304 Change-Id: I0a89608fe75c5f3c5e6888f9b771305742760707 --- cas/1.0/Android.bp | 84 +++++++ cas/1.0/CasHal.mk | 192 +++++++++++++++ cas/1.0/ICas.hal | 122 ++++++++++ cas/1.0/ICasListener.hal | 28 +++ cas/1.0/IDescramblerBase.hal | 49 ++++ cas/1.0/IMediaCasService.hal | 68 ++++++ cas/1.0/default/Android.bp | 35 +++ cas/1.0/default/CasImpl.cpp | 205 ++++++++++++++++ cas/1.0/default/CasImpl.h | 103 ++++++++ cas/1.0/default/DescramblerImpl.cpp | 127 ++++++++++ cas/1.0/default/DescramblerImpl.h | 69 ++++++ cas/1.0/default/FactoryLoader.h | 229 ++++++++++++++++++ cas/1.0/default/MediaCasService.cpp | 112 +++++++++ cas/1.0/default/MediaCasService.h | 64 +++++ cas/1.0/default/SharedLibrary.cpp | 65 +++++ cas/1.0/default/SharedLibrary.h | 50 ++++ cas/1.0/default/TypeConvert.cpp | 92 +++++++ cas/1.0/default/TypeConvert.h | 41 ++++ .../android.hardware.cas@1.0-service.rc | 6 + cas/1.0/default/service.cpp | 50 ++++ cas/1.0/types.hal | 124 ++++++++++ cas/Android.bp | 6 + cas/native/1.0/Android.bp | 65 +++++ cas/native/1.0/IDescrambler.hal | 45 ++++ cas/native/1.0/types.hal | 90 +++++++ 25 files changed, 2121 insertions(+) create mode 100644 cas/1.0/Android.bp create mode 100644 cas/1.0/CasHal.mk create mode 100644 cas/1.0/ICas.hal create mode 100644 cas/1.0/ICasListener.hal create mode 100644 cas/1.0/IDescramblerBase.hal create mode 100644 cas/1.0/IMediaCasService.hal create mode 100644 cas/1.0/default/Android.bp create mode 100644 cas/1.0/default/CasImpl.cpp create mode 100644 cas/1.0/default/CasImpl.h create mode 100644 cas/1.0/default/DescramblerImpl.cpp create mode 100644 cas/1.0/default/DescramblerImpl.h create mode 100644 cas/1.0/default/FactoryLoader.h create mode 100644 cas/1.0/default/MediaCasService.cpp create mode 100644 cas/1.0/default/MediaCasService.h create mode 100644 cas/1.0/default/SharedLibrary.cpp create mode 100644 cas/1.0/default/SharedLibrary.h create mode 100644 cas/1.0/default/TypeConvert.cpp create mode 100644 cas/1.0/default/TypeConvert.h create mode 100644 cas/1.0/default/android.hardware.cas@1.0-service.rc create mode 100644 cas/1.0/default/service.cpp create mode 100644 cas/1.0/types.hal create mode 100644 cas/Android.bp create mode 100644 cas/native/1.0/Android.bp create mode 100644 cas/native/1.0/IDescrambler.hal create mode 100644 cas/native/1.0/types.hal diff --git a/cas/1.0/Android.bp b/cas/1.0/Android.bp new file mode 100644 index 0000000000..2251f119f5 --- /dev/null +++ b/cas/1.0/Android.bp @@ -0,0 +1,84 @@ +// This file is autogenerated by hidl-gen. Do not edit manually. + +filegroup { + name: "android.hardware.cas@1.0_hal", + srcs: [ + "types.hal", + "ICas.hal", + "ICasListener.hal", + "IDescramblerBase.hal", + "IMediaCasService.hal", + ], +} + +genrule { + name: "android.hardware.cas@1.0_genc++", + tools: ["hidl-gen"], + cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.cas@1.0", + srcs: [ + ":android.hardware.cas@1.0_hal", + ], + out: [ + "android/hardware/cas/1.0/types.cpp", + "android/hardware/cas/1.0/CasAll.cpp", + "android/hardware/cas/1.0/CasListenerAll.cpp", + "android/hardware/cas/1.0/DescramblerBaseAll.cpp", + "android/hardware/cas/1.0/MediaCasServiceAll.cpp", + ], +} + +genrule { + name: "android.hardware.cas@1.0_genc++_headers", + tools: ["hidl-gen"], + cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.cas@1.0", + srcs: [ + ":android.hardware.cas@1.0_hal", + ], + out: [ + "android/hardware/cas/1.0/types.h", + "android/hardware/cas/1.0/hwtypes.h", + "android/hardware/cas/1.0/ICas.h", + "android/hardware/cas/1.0/IHwCas.h", + "android/hardware/cas/1.0/BnHwCas.h", + "android/hardware/cas/1.0/BpHwCas.h", + "android/hardware/cas/1.0/BsCas.h", + "android/hardware/cas/1.0/ICasListener.h", + "android/hardware/cas/1.0/IHwCasListener.h", + "android/hardware/cas/1.0/BnHwCasListener.h", + "android/hardware/cas/1.0/BpHwCasListener.h", + "android/hardware/cas/1.0/BsCasListener.h", + "android/hardware/cas/1.0/IDescramblerBase.h", + "android/hardware/cas/1.0/IHwDescramblerBase.h", + "android/hardware/cas/1.0/BnHwDescramblerBase.h", + "android/hardware/cas/1.0/BpHwDescramblerBase.h", + "android/hardware/cas/1.0/BsDescramblerBase.h", + "android/hardware/cas/1.0/IMediaCasService.h", + "android/hardware/cas/1.0/IHwMediaCasService.h", + "android/hardware/cas/1.0/BnHwMediaCasService.h", + "android/hardware/cas/1.0/BpHwMediaCasService.h", + "android/hardware/cas/1.0/BsMediaCasService.h", + ], +} + +cc_library_shared { + name: "android.hardware.cas@1.0", + defaults: ["hidl-module-defaults"], + generated_sources: ["android.hardware.cas@1.0_genc++"], + generated_headers: ["android.hardware.cas@1.0_genc++_headers"], + export_generated_headers: ["android.hardware.cas@1.0_genc++_headers"], + vendor_available: true, + shared_libs: [ + "libhidlbase", + "libhidltransport", + "libhwbinder", + "liblog", + "libutils", + "libcutils", + ], + export_shared_lib_headers: [ + "libhidlbase", + "libhidltransport", + "libhwbinder", + "libutils", + ], +} diff --git a/cas/1.0/CasHal.mk b/cas/1.0/CasHal.mk new file mode 100644 index 0000000000..3cae6bf416 --- /dev/null +++ b/cas/1.0/CasHal.mk @@ -0,0 +1,192 @@ +# +# Copyright (C) 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. + + +######################################################################## +# Included by frameworks/base for MediaCas. Hidl HAL can't be linked as +# Java lib from frameworks because it has dependency on frameworks itself. +# + +intermediates := $(TARGET_OUT_COMMON_GEN)/JAVA_LIBRARIES/android.hardware.cas-V1.0-java_intermediates + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) +HIDL_PATH := system/libhidl/transport/base/1.0 + +# +# Build types.hal (DebugInfo) +# +GEN := $(intermediates)/android/hidl/base/V1_0/DebugInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(HIDL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hidl:system/libhidl/transport \ + android.hidl.base@1.0::types.DebugInfo + +$(GEN): $(HIDL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IBase.hal +# +GEN := $(intermediates)/android/hidl/base/V1_0/IBase.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(HIDL_PATH)/IBase.hal +$(GEN): PRIVATE_DEPS += $(HIDL_PATH)/types.hal +$(GEN): $(HIDL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hidl:system/libhidl/transport \ + android.hidl.base@1.0::IBase + +$(GEN): $(HIDL_PATH)/IBase.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +HIDL_PATH := hardware/interfaces/cas/1.0 + +# +# Build types.hal (HidlCasPluginDescriptor) +# +GEN := $(intermediates)/android/hardware/cas/V1_0/HidlCasPluginDescriptor.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(HIDL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.cas@1.0::types.HidlCasPluginDescriptor + +$(GEN): $(HIDL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Status) +# +GEN := $(intermediates)/android/hardware/cas/V1_0/Status.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(HIDL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.cas@1.0::types.Status + +$(GEN): $(HIDL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ICas.hal +# +GEN := $(intermediates)/android/hardware/cas/V1_0/ICas.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(HIDL_PATH)/ICas.hal +$(GEN): PRIVATE_DEPS += $(HIDL_PATH)/types.hal +$(GEN): $(HIDL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.cas@1.0::ICas + +$(GEN): $(HIDL_PATH)/ICas.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ICasListener.hal +# +GEN := $(intermediates)/android/hardware/cas/V1_0/ICasListener.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(HIDL_PATH)/ICasListener.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.cas@1.0::ICasListener + +$(GEN): $(HIDL_PATH)/ICasListener.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IDescramblerBase.hal +# +GEN := $(intermediates)/android/hardware/cas/V1_0/IDescramblerBase.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(HIDL_PATH)/IDescramblerBase.hal +$(GEN): PRIVATE_DEPS += $(HIDL_PATH)/types.hal +$(GEN): $(HIDL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.cas@1.0::IDescramblerBase + +$(GEN): $(HIDL_PATH)/IDescramblerBase.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IMediaCasService.hal +# +GEN := $(intermediates)/android/hardware/cas/V1_0/IMediaCasService.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(HIDL_PATH)/IMediaCasService.hal +$(GEN): PRIVATE_DEPS += $(HIDL_PATH)/ICas.hal +$(GEN): $(HIDL_PATH)/ICas.hal +$(GEN): PRIVATE_DEPS += $(HIDL_PATH)/ICasListener.hal +$(GEN): $(HIDL_PATH)/ICasListener.hal +$(GEN): PRIVATE_DEPS += $(HIDL_PATH)/IDescramblerBase.hal +$(GEN): $(HIDL_PATH)/IDescramblerBase.hal +$(GEN): PRIVATE_DEPS += $(HIDL_PATH)/types.hal +$(GEN): $(HIDL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.cas@1.0::IMediaCasService + +$(GEN): $(HIDL_PATH)/IMediaCasService.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + diff --git a/cas/1.0/ICas.hal b/cas/1.0/ICas.hal new file mode 100644 index 0000000000..08a92da19e --- /dev/null +++ b/cas/1.0/ICas.hal @@ -0,0 +1,122 @@ +/* + * Copyright (C) 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. + */ +package android.hardware.cas@1.0; + +import android.hardware.cas@1.0::types; + +/** + * ICas is the API to control the cas system and is accessible from both + * Java and native level. It is used to manage sessions, provision/refresh + * the cas system, and process the EMM/ECM messages. It also allows bi-directional, + * scheme-specific communications between the client and the cas system. + */ + +interface ICas { + /** + * Provide the CA private data from a CA_descriptor in the conditional + * access table to a CasPlugin. + * + * @param pvtData a byte array containing the private data, the format of + * which is scheme-specific and opaque to the framework. + * @return status the status of the call. + */ + setPrivateData(vec pvtData) generates (Status status); + + /** + * Open a session to descramble one or more streams scrambled by the + * conditional access system. + * + * @return status the status of the call. + * @return sessionId the id of the newly opened session. + */ + openSession() generates(Status status, HidlCasSessionId sessionId); + + /** + * Close a session. + * + * @param sessionId the id of the session to be closed. + * @return status the status of the call. + */ + closeSession(HidlCasSessionId sessionId) generates (Status status); + + /** + * Provide the CA private data from a CA_descriptor in the program map + * table to a session. + * + * @param sessionId the id of the session which the private data applies to. + * @param pvtData a byte array containing the private data, the format of + * which is scheme-specific and opaque to the framework. + * @return status the status of the call. + */ + setSessionPrivateData(HidlCasSessionId sessionId, vec pvtData) + generates (Status status); + + /** + * Process an ECM from the ECM stream for this session’s elementary stream. + * + * @param sessionId the id of the session which the ecm data applies to. + * @param ecm a byte array containing the ecm data. + * @return status the status of the call. + */ + processEcm(HidlCasSessionId sessionId, vec ecm) + generates (Status status); + + /** + * Process an in-band EMM from the EMM stream. + * + * @param emm a byte array containing the emm data. + * @return status the status of the call. + */ + processEmm(vec emm) generates (Status status); + + /** + * Send an scheme-specific event to the CasPlugin. + * + * @param event an integer denoting a scheme-specific event to be sent. + * @param arg a scheme-specific integer argument for the event. + * @param data a byte array containing scheme-specific data for the event. + * @return status the status of the call. + */ + sendEvent(int32_t event, int32_t arg, vec eventData) + generates (Status status); + + /** + * Initiate a provisioning operation for a CA system. + * + * @param provisionString string containing information needed for the + * provisioning operation, the format of which is scheme and implementation + * specific. + * @return status the status of the call. + */ + provision(string provisionString) generates (Status status); + + /** + * Notify the CA system to refresh entitlement keys. + * + * @param refreshType the type of the refreshment. + * @param refreshData private data associated with the refreshment. + * @return status the status of the call. + */ + refreshEntitlements(int32_t refreshType, vec refreshData) + generates (Status status); + + /** + * Release the descrambler instance. + * + * @return status the status of the call. + */ + release() generates (Status status); +}; diff --git a/cas/1.0/ICasListener.hal b/cas/1.0/ICasListener.hal new file mode 100644 index 0000000000..8ae6014d1c --- /dev/null +++ b/cas/1.0/ICasListener.hal @@ -0,0 +1,28 @@ +/* + * Copyright (C) 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. + */ +package android.hardware.cas@1.0; + +interface ICasListener { + /** + * Notify the listener of a scheme-specific event from the CA system. + * + * @param event an integer whose meaning is scheme-specific. + * @param arg an integer whose meaning is scheme-specific. + * @param data a byte array of data whose format and meaning are + * scheme-specific. + */ + onEvent(int32_t event, int32_t arg, vec data); +}; diff --git a/cas/1.0/IDescramblerBase.hal b/cas/1.0/IDescramblerBase.hal new file mode 100644 index 0000000000..a126084b33 --- /dev/null +++ b/cas/1.0/IDescramblerBase.hal @@ -0,0 +1,49 @@ +/* + * Copyright (C) 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. + */ +package android.hardware.cas@1.0; + +import android.hardware.cas@1.0::types; + +/** + * IDescramblerBase is the API to control the descrambler and is accessible + * from both Java and native level. + */ + +interface IDescramblerBase { + /** + * Associate a MediaCas session with this MediaDescrambler instance. + * + * @param sessionId the id of the session to associate with this descrambler instance. + * @return status the status of the call. + */ + setMediaCasSession(HidlCasSessionId sessionId) generates (Status status); + + /** + * Query if the scrambling scheme requires the use of a secure decoder + * to decode data of the given mime type. + * + * @param mime the mime type of the media data. + * @return result whether the descrambler requires a secure decoder. + */ + requiresSecureDecoderComponent(string mime) generates (bool result); + + /** + * Release the descrambler instance. + * + * @return status the status of the call. + */ + release() generates (Status status); +}; diff --git a/cas/1.0/IMediaCasService.hal b/cas/1.0/IMediaCasService.hal new file mode 100644 index 0000000000..cfeafad2a1 --- /dev/null +++ b/cas/1.0/IMediaCasService.hal @@ -0,0 +1,68 @@ +/* + * Copyright (C) 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. + */ +package android.hardware.cas@1.0; + +import android.hardware.cas@1.0::ICas; +import android.hardware.cas@1.0::ICasListener; +import android.hardware.cas@1.0::IDescramblerBase; + +/** + * IMediaCasService is the main entry point for interacting with a vendor's + * cas HAL to create cas and descrambler plugin instances. A cas plugin instance + * opens cas sessions which are used to obtain keys for a descrambler session, + * which can in turn be used to descramble protected video content. + */ +interface IMediaCasService { + /** + * List all available CA systems on the device. + * + * @return descriptors an array of descriptors for the available CA systems. + */ + enumeratePlugins() generates (vec descriptors); + + /** + * Query if a certain CA system is supported on this device. + * + * @param CA_system_id the id of the CA system. + * @return result whether the specified CA system is supported on this device. + */ + isSystemIdSupported(int32_t CA_system_id) generates (bool result); + + /** + * Construct a new instance of a CasPlugin given a CA_system_id. + * + * @param CA_system_id the id of the CA system. + * @param listener the event listener to receive events coming from the CasPlugin. + * @return cas the newly created CasPlugin interface. + */ + createPlugin(int32_t CA_system_id, ICasListener listener) generates (ICas cas); + + /** + * Query if the descrambling scheme for a CA system is supported on this device. + * + * @param CA_system_id the id of the CA system. + * @return result whether the specified descrambling scheme is supported on this device. + */ + isDescramblerSupported(int32_t CA_system_id) generates (bool result); + + /** + * Construct a new instance of a DescramblerPlugin given a CA_system_id. + * + * @param CA_system_id the id of the CA system. + * @return descrambler the newly created plugin interface. + */ + createDescrambler(int32_t CA_system_id) generates (IDescramblerBase descrambler); +}; diff --git a/cas/1.0/default/Android.bp b/cas/1.0/default/Android.bp new file mode 100644 index 0000000000..953aa37238 --- /dev/null +++ b/cas/1.0/default/Android.bp @@ -0,0 +1,35 @@ +cc_binary { + name: "android.hardware.cas@1.0-service", + defaults: ["hidl_defaults"], + vendor: true, + relative_install_path: "hw", + srcs: [ + "CasImpl.cpp", + "DescramblerImpl.cpp", + "MediaCasService.cpp", + "service.cpp", + "SharedLibrary.cpp", + "TypeConvert.cpp", + ], + + product_variables: { + treble: { + cflags: ["-DUSE_VNDBINDER"], + }, + }, + + compile_multilib: "32", + init_rc: ["android.hardware.cas@1.0-service.rc"], + + shared_libs: [ + "android.hardware.cas@1.0", + "android.hardware.cas.native@1.0", + "android.hidl.memory@1.0", + "libbinder", + "libhidlbase", + "libhidlmemory", + "libhidltransport", + "liblog", + "libutils", + ], +} diff --git a/cas/1.0/default/CasImpl.cpp b/cas/1.0/default/CasImpl.cpp new file mode 100644 index 0000000000..9d1f4a3268 --- /dev/null +++ b/cas/1.0/default/CasImpl.cpp @@ -0,0 +1,205 @@ +/* + * Copyright (C) 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_NDEBUG 0 +#define LOG_TAG "android.hardware.cas@1.0-CasImpl" + +#include +#include +#include + +#include "CasImpl.h" +#include "SharedLibrary.h" +#include "TypeConvert.h" + +namespace android { +namespace hardware { +namespace cas { +namespace V1_0 { +namespace implementation { + +struct CasImpl::PluginHolder : public RefBase { +public: + explicit PluginHolder(CasPlugin *plugin) : mPlugin(plugin) {} + ~PluginHolder() { if (mPlugin != NULL) delete mPlugin; } + CasPlugin* get() { return mPlugin; } + +private: + CasPlugin *mPlugin; + DISALLOW_EVIL_CONSTRUCTORS(PluginHolder); +}; + +CasImpl::CasImpl(const sp &listener) + : mPluginHolder(NULL), mListener(listener) { + ALOGV("CTOR"); +} + +CasImpl::~CasImpl() { + ALOGV("DTOR"); + release(); +} + +//static +void CasImpl::OnEvent( + void *appData, + int32_t event, + int32_t arg, + uint8_t *data, + size_t size) { + if (appData == NULL) { + ALOGE("Invalid appData!"); + return; + } + CasImpl *casImpl = static_cast(appData); + casImpl->onEvent(event, arg, data, size); +} + +void CasImpl::init(const sp& library, CasPlugin *plugin) { + mLibrary = library; + mPluginHolder = new PluginHolder(plugin); +} + +void CasImpl::onEvent( + int32_t event, int32_t arg, uint8_t *data, size_t size) { + if (mListener == NULL) { + return; + } + + HidlCasData eventData; + if (data != NULL) { + eventData.setToExternal(data, size); + } + + mListener->onEvent(event, arg, eventData); +} + +Return CasImpl::setPrivateData(const HidlCasData& pvtData) { + ALOGV("%s", __FUNCTION__); + sp holder = mPluginHolder; + if (holder == NULL) { + return toStatus(INVALID_OPERATION); + } + return toStatus(holder->get()->setPrivateData(pvtData)); +} + +Return CasImpl::openSession(openSession_cb _hidl_cb) { + ALOGV("%s", __FUNCTION__); + CasSessionId sessionId; + + sp holder = mPluginHolder; + status_t err = INVALID_OPERATION; + if (holder != NULL) { + err = holder->get()->openSession(&sessionId); + } + + _hidl_cb(toStatus(err), sessionId); + + return Void(); +} + +Return CasImpl::setSessionPrivateData( + const HidlCasSessionId &sessionId, const HidlCasData& pvtData) { + ALOGV("%s: sessionId=%s", __FUNCTION__, + sessionIdToString(sessionId).string()); + sp holder = mPluginHolder; + if (holder == NULL) { + return toStatus(INVALID_OPERATION); + } + return toStatus( + holder->get()->setSessionPrivateData( + sessionId, pvtData)); +} + +Return CasImpl::closeSession(const HidlCasSessionId &sessionId) { + ALOGV("%s: sessionId=%s", __FUNCTION__, + sessionIdToString(sessionId).string()); + sp holder = mPluginHolder; + if (holder == NULL) { + return toStatus(INVALID_OPERATION); + } + return toStatus(holder->get()->closeSession(sessionId)); +} + +Return CasImpl::processEcm( + const HidlCasSessionId &sessionId, const HidlCasData& ecm) { + ALOGV("%s: sessionId=%s", __FUNCTION__, + sessionIdToString(sessionId).string()); + sp holder = mPluginHolder; + if (holder == NULL) { + return toStatus(INVALID_OPERATION); + } + + return toStatus(holder->get()->processEcm(sessionId, ecm)); +} + +Return CasImpl::processEmm(const HidlCasData& emm) { + ALOGV("%s", __FUNCTION__); + sp holder = mPluginHolder; + if (holder == NULL) { + return toStatus(INVALID_OPERATION); + } + + return toStatus(holder->get()->processEmm(emm)); +} + +Return CasImpl::sendEvent( + int32_t event, int32_t arg, + const HidlCasData& eventData) { + ALOGV("%s", __FUNCTION__); + sp holder = mPluginHolder; + if (holder == NULL) { + return toStatus(INVALID_OPERATION); + } + + status_t err = holder->get()->sendEvent(event, arg, eventData); + return toStatus(err); +} + +Return CasImpl::provision(const hidl_string& provisionString) { + ALOGV("%s: provisionString=%s", __FUNCTION__, provisionString.c_str()); + sp holder = mPluginHolder; + if (holder == NULL) { + return toStatus(INVALID_OPERATION); + } + + return toStatus(holder->get()->provision(String8(provisionString.c_str()))); +} + +Return CasImpl::refreshEntitlements( + int32_t refreshType, + const HidlCasData& refreshData) { + ALOGV("%s", __FUNCTION__); + sp holder = mPluginHolder; + if (holder == NULL) { + return toStatus(INVALID_OPERATION); + } + + status_t err = holder->get()->refreshEntitlements(refreshType, refreshData); + return toStatus(err); +} + +Return CasImpl::release() { + ALOGV("%s: plugin=%p", __FUNCTION__, + mPluginHolder != NULL ? mPluginHolder->get() : NULL); + mPluginHolder.clear(); + return Status::OK; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace cas +} // namespace hardware +} // namespace android diff --git a/cas/1.0/default/CasImpl.h b/cas/1.0/default/CasImpl.h new file mode 100644 index 0000000000..841d64e038 --- /dev/null +++ b/cas/1.0/default/CasImpl.h @@ -0,0 +1,103 @@ +/* + * Copyright (C) 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. + */ + +#ifndef ANDROID_HARDWARE_CAS_V1_0_CAS_IMPL_H_ +#define ANDROID_HARDWARE_CAS_V1_0_CAS_IMPL_H_ + +#include +#include + +namespace android { +struct CasPlugin; + +namespace hardware { +namespace cas { +namespace V1_0 { +struct ICasListener; +namespace implementation { + +class SharedLibrary; + +class CasImpl : public ICas { +public: + CasImpl(const sp &listener); + virtual ~CasImpl(); + + static void OnEvent( + void *appData, + int32_t event, + int32_t arg, + uint8_t *data, + size_t size); + + void init(const sp& library, CasPlugin *plugin); + void onEvent( + int32_t event, + int32_t arg, + uint8_t *data, + size_t size); + + // ICas inherits + + virtual Return setPrivateData( + const HidlCasData& pvtData) override; + + virtual Return openSession( + openSession_cb _hidl_cb) override; + + virtual Return closeSession( + const HidlCasSessionId& sessionId) override; + + virtual Return setSessionPrivateData( + const HidlCasSessionId& sessionId, + const HidlCasData& pvtData) override; + + virtual Return processEcm( + const HidlCasSessionId& sessionId, + const HidlCasData& ecm) override; + + virtual Return processEmm( + const HidlCasData& emm) override; + + virtual Return sendEvent( + int32_t event, int32_t arg, + const HidlCasData& eventData) override; + + virtual Return provision( + const hidl_string& provisionString) override; + + virtual Return refreshEntitlements( + int32_t refreshType, + const HidlCasData& refreshData) override; + + virtual Return release() override; + +private: + struct PluginHolder; + sp mLibrary; + sp mPluginHolder; + sp mListener; + + DISALLOW_EVIL_CONSTRUCTORS(CasImpl); +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace cas +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_CAS_V1_0_CAS_IMPL_H_ diff --git a/cas/1.0/default/DescramblerImpl.cpp b/cas/1.0/default/DescramblerImpl.cpp new file mode 100644 index 0000000000..3d90809cd0 --- /dev/null +++ b/cas/1.0/default/DescramblerImpl.cpp @@ -0,0 +1,127 @@ +/* + * Copyright (C) 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_NDEBUG 0 +#define LOG_TAG "android.hardware.cas@1.0-DescramblerImpl" + +#include +#include +#include +#include + +#include "DescramblerImpl.h" +#include "SharedLibrary.h" +#include "TypeConvert.h" + +namespace android { +using hidl::memory::V1_0::IMemory; + +namespace hardware { +namespace cas { +namespace V1_0 { +namespace implementation { + +#define CHECK_SUBSAMPLE_DEF(type) \ +static_assert(sizeof(SubSample) == sizeof(type::SubSample), \ + "SubSample: size doesn't match"); \ +static_assert(offsetof(SubSample, numBytesOfClearData) \ + == offsetof(type::SubSample, mNumBytesOfClearData), \ + "SubSample: numBytesOfClearData offset doesn't match"); \ +static_assert(offsetof(SubSample, numBytesOfEncryptedData) \ + == offsetof(type::SubSample, mNumBytesOfEncryptedData), \ + "SubSample: numBytesOfEncryptedData offset doesn't match") + +CHECK_SUBSAMPLE_DEF(DescramblerPlugin); +CHECK_SUBSAMPLE_DEF(CryptoPlugin); + +DescramblerImpl::DescramblerImpl( + const sp& library, DescramblerPlugin *plugin) : + mLibrary(library), mPlugin(plugin) { + ALOGV("CTOR: mPlugin=%p", mPlugin); +} + +DescramblerImpl::~DescramblerImpl() { + ALOGV("DTOR: mPlugin=%p", mPlugin); + release(); +} + +Return DescramblerImpl::setMediaCasSession(const HidlCasSessionId& sessionId) { + ALOGV("%s: sessionId=%s", __FUNCTION__, + sessionIdToString(sessionId).string()); + + return toStatus(mPlugin->setMediaCasSession(sessionId)); +} + +Return DescramblerImpl::requiresSecureDecoderComponent( + const hidl_string& mime) { + return mPlugin->requiresSecureDecoderComponent(String8(mime.c_str())); +} + +Return DescramblerImpl::descramble( + ScramblingControl scramblingControl, + const hidl_vec& subSamples, + const SharedBuffer& srcBuffer, + uint64_t srcOffset, + const DestinationBuffer& dstBuffer, + uint64_t dstOffset, + descramble_cb _hidl_cb) { + ALOGV("%s", __FUNCTION__); + + sp srcMem = mapMemory(srcBuffer.heapBase); + void *srcPtr = (uint8_t *)(void *)srcMem->getPointer() + srcBuffer.offset; + void *dstPtr = NULL; + if (dstBuffer.type == BufferType::SHARED_MEMORY) { + // When using shared memory, src buffer is also used as dst, + // we don't map it again here. + dstPtr = srcPtr; + } else { + native_handle_t *handle = const_cast( + dstBuffer.secureMemory.getNativeHandle()); + dstPtr = static_cast(handle); + } + // Casting hidl SubSample to DescramblerPlugin::SubSample, but need + // to ensure structs are actually idential + + int32_t result = mPlugin->descramble( + dstBuffer.type != BufferType::SHARED_MEMORY, + (DescramblerPlugin::ScramblingControl)scramblingControl, + subSamples.size(), + (DescramblerPlugin::SubSample*)subSamples.data(), + srcPtr, + srcOffset, + dstPtr, + dstOffset, + NULL); + + _hidl_cb(toStatus(result >= 0 ? OK : result), result, NULL); + return Void(); +} + +Return DescramblerImpl::release() { + ALOGV("%s: mPlugin=%p", __FUNCTION__, mPlugin); + + if (mPlugin != NULL) { + delete mPlugin; + mPlugin = NULL; + } + return Status::OK; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace cas +} // namespace hardware +} // namespace android diff --git a/cas/1.0/default/DescramblerImpl.h b/cas/1.0/default/DescramblerImpl.h new file mode 100644 index 0000000000..d3b146ecc7 --- /dev/null +++ b/cas/1.0/default/DescramblerImpl.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 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. + */ + +#ifndef ANDROID_HARDWARE_CAS_V1_0_DESCRAMBLER_IMPL_H_ +#define ANDROID_HARDWARE_CAS_V1_0_DESCRAMBLER_IMPL_H_ + +#include +#include + +namespace android { +struct DescramblerPlugin; +using namespace hardware::cas::native::V1_0; + +namespace hardware { +namespace cas { +namespace V1_0 { +namespace implementation { + +class SharedLibrary; + +class DescramblerImpl : public IDescrambler { +public: + DescramblerImpl(const sp& library, DescramblerPlugin *plugin); + virtual ~DescramblerImpl(); + + virtual Return setMediaCasSession( + const HidlCasSessionId& sessionId) override; + + virtual Return requiresSecureDecoderComponent( + const hidl_string& mime) override; + + virtual Return descramble( + ScramblingControl scramblingControl, + const hidl_vec& subSamples, + const SharedBuffer& srcBuffer, + uint64_t srcOffset, + const DestinationBuffer& dstBuffer, + uint64_t dstOffset, + descramble_cb _hidl_cb) override; + + virtual Return release() override; + +private: + sp mLibrary; + DescramblerPlugin *mPlugin; + + DISALLOW_EVIL_CONSTRUCTORS(DescramblerImpl); +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace cas +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_CAS_V1_0_DESCRAMBLER_IMPL_H_ diff --git a/cas/1.0/default/FactoryLoader.h b/cas/1.0/default/FactoryLoader.h new file mode 100644 index 0000000000..18c2186dcb --- /dev/null +++ b/cas/1.0/default/FactoryLoader.h @@ -0,0 +1,229 @@ +/* + * Copyright (C) 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. + */ + +#ifndef ANDROID_HARDWARE_CAS_V1_0_FACTORY_LOADER_H_ +#define ANDROID_HARDWARE_CAS_V1_0_FACTORY_LOADER_H_ + +#include +#include +#include "SharedLibrary.h" +#include +#include +#include + +using namespace std; + +namespace android { +namespace hardware { +namespace cas { +namespace V1_0 { +namespace implementation { + +template +class FactoryLoader { +public: + FactoryLoader(const char *name) : + mFactory(NULL), mCreateFactoryFuncName(name) {} + + virtual ~FactoryLoader() { closeFactory(); } + + bool findFactoryForScheme( + int32_t CA_system_id, + sp *library = NULL, + T** factory = NULL); + + bool enumeratePlugins(vector* results); + +private: + typedef T*(*CreateFactoryFunc)(); + + Mutex mMapLock; + T* mFactory; + const char *mCreateFactoryFuncName; + sp mLibrary; + KeyedVector mCASystemIdToLibraryPathMap; + KeyedVector > mLibraryPathToOpenLibraryMap; + + bool loadFactoryForSchemeFromPath( + const String8 &path, + int32_t CA_system_id, + sp *library, + T** factory); + + bool queryPluginsFromPath( + const String8 &path, + vector* results); + + bool openFactory(const String8 &path); + void closeFactory(); +}; + +template +bool FactoryLoader::findFactoryForScheme( + int32_t CA_system_id, sp *library, T** factory) { + if (library != NULL) { + library->clear(); + } + if (factory != NULL) { + *factory = NULL; + } + + Mutex::Autolock autoLock(mMapLock); + + // first check cache + ssize_t index = mCASystemIdToLibraryPathMap.indexOfKey(CA_system_id); + if (index >= 0) { + return loadFactoryForSchemeFromPath( + mCASystemIdToLibraryPathMap[index], + CA_system_id, library, factory); + } + + // no luck, have to search + String8 dirPath("/vendor/lib/mediacas"); + DIR* pDir = opendir(dirPath.string()); + + if (pDir == NULL) { + ALOGE("Failed to open plugin directory %s", dirPath.string()); + return false; + } + + struct dirent* pEntry; + while ((pEntry = readdir(pDir))) { + String8 pluginPath = dirPath + "/" + pEntry->d_name; + if (pluginPath.getPathExtension() == ".so") { + if (loadFactoryForSchemeFromPath( + pluginPath, CA_system_id, library, factory)) { + mCASystemIdToLibraryPathMap.add(CA_system_id, pluginPath); + closedir(pDir); + + return true; + } + } + } + + closedir(pDir); + + ALOGE("Failed to find plugin"); + return false; +} + +template +bool FactoryLoader::enumeratePlugins( + vector* results) { + ALOGI("enumeratePlugins"); + + results->clear(); + + String8 dirPath("/vendor/lib/mediacas"); + DIR* pDir = opendir(dirPath.string()); + + if (pDir == NULL) { + ALOGE("Failed to open plugin directory %s", dirPath.string()); + return false; + } + + Mutex::Autolock autoLock(mMapLock); + + struct dirent* pEntry; + while ((pEntry = readdir(pDir))) { + String8 pluginPath = dirPath + "/" + pEntry->d_name; + if (pluginPath.getPathExtension() == ".so") { + queryPluginsFromPath(pluginPath, results); + } + } + return true; +} + +template +bool FactoryLoader::loadFactoryForSchemeFromPath( + const String8 &path, int32_t CA_system_id, + sp *library, T** factory) { + closeFactory(); + + if (!openFactory(path) || !mFactory->isSystemIdSupported(CA_system_id)) { + closeFactory(); + return false; + } + + if (library != NULL) { + *library = mLibrary; + } + if (factory != NULL) { + *factory = mFactory; + } + return true; +} + +template +bool FactoryLoader::queryPluginsFromPath( + const String8 &path, vector* results) { + closeFactory(); + + vector descriptors; + if (!openFactory(path) || mFactory->queryPlugins(&descriptors) != OK) { + closeFactory(); + return false; + } + + for (auto it = descriptors.begin(); it != descriptors.end(); it++) { + results->push_back( HidlCasPluginDescriptor { + .caSystemId = it->CA_system_id, + .name = it->name.c_str()}); + } + return true; +} + +template +bool FactoryLoader::openFactory(const String8 &path) { + // get strong pointer to open shared library + ssize_t index = mLibraryPathToOpenLibraryMap.indexOfKey(path); + if (index >= 0) { + mLibrary = mLibraryPathToOpenLibraryMap[index].promote(); + } else { + index = mLibraryPathToOpenLibraryMap.add(path, NULL); + } + + if (!mLibrary.get()) { + mLibrary = new SharedLibrary(path); + if (!*mLibrary) { + return false; + } + + mLibraryPathToOpenLibraryMap.replaceValueAt(index, mLibrary); + } + + CreateFactoryFunc createFactory = + (CreateFactoryFunc)mLibrary->lookup(mCreateFactoryFuncName); + if (createFactory == NULL || (mFactory = createFactory()) == NULL) { + return false; + } + return true; +} + +template +void FactoryLoader::closeFactory() { + delete mFactory; + mFactory = NULL; + mLibrary.clear(); +} + +} // namespace implementation +} // namespace V1_0 +} // namespace cas +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_CAS_V1_0_FACTORY_LOADER_H_ diff --git a/cas/1.0/default/MediaCasService.cpp b/cas/1.0/default/MediaCasService.cpp new file mode 100644 index 0000000000..ca4322461e --- /dev/null +++ b/cas/1.0/default/MediaCasService.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (C) 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_NDEBUG 0 +#define LOG_TAG "android.hardware.cas@1.0-MediaCasService" + +#include +#include +#include +#include + +#include "CasImpl.h" +#include "DescramblerImpl.h" +#include "MediaCasService.h" + +namespace android { +namespace hardware { +namespace cas { +namespace V1_0 { +namespace implementation { + +MediaCasService::MediaCasService() : + mCasLoader("createCasFactory"), + mDescramblerLoader("createDescramblerFactory") { +} + +MediaCasService::~MediaCasService() { +} + +Return MediaCasService::enumeratePlugins(enumeratePlugins_cb _hidl_cb) { + + ALOGV("%s", __FUNCTION__); + + vector results; + mCasLoader.enumeratePlugins(&results); + + _hidl_cb(results); + return Void(); +} + +Return MediaCasService::isSystemIdSupported(int32_t CA_system_id) { + ALOGV("isSystemIdSupported: CA_system_id=%d", CA_system_id); + + return mCasLoader.findFactoryForScheme(CA_system_id); +} + +Return> MediaCasService::createPlugin( + int32_t CA_system_id, const sp& listener) { + + ALOGV("%s: CA_system_id=%d", __FUNCTION__, CA_system_id); + + sp result; + + CasFactory *factory; + sp library; + if (mCasLoader.findFactoryForScheme(CA_system_id, &library, &factory)) { + CasPlugin *plugin = NULL; + sp casImpl = new CasImpl(listener); + if (factory->createPlugin(CA_system_id, (uint64_t)casImpl.get(), + &CasImpl::OnEvent, &plugin) == OK && plugin != NULL) { + casImpl->init(library, plugin); + result = casImpl; + } + } + + return result; +} + +Return MediaCasService::isDescramblerSupported(int32_t CA_system_id) { + ALOGV("%s: CA_system_id=%d", __FUNCTION__, CA_system_id); + + return mDescramblerLoader.findFactoryForScheme(CA_system_id); +} + +Return> MediaCasService::createDescrambler(int32_t CA_system_id) { + + ALOGV("%s: CA_system_id=%d", __FUNCTION__, CA_system_id); + + sp result; + + DescramblerFactory *factory; + sp library; + if (mDescramblerLoader.findFactoryForScheme( + CA_system_id, &library, &factory)) { + DescramblerPlugin *plugin = NULL; + if (factory->createPlugin(CA_system_id, &plugin) == OK + && plugin != NULL) { + result = new DescramblerImpl(library, plugin); + } + } + + return result; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace cas +} // namespace hardware +} // namespace android diff --git a/cas/1.0/default/MediaCasService.h b/cas/1.0/default/MediaCasService.h new file mode 100644 index 0000000000..77ddac6032 --- /dev/null +++ b/cas/1.0/default/MediaCasService.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 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. + */ + +#ifndef ANDROID_HARDWARE_CAS_V1_0_MEDIA_CAS_SERVICE_H_ +#define ANDROID_HARDWARE_CAS_V1_0_MEDIA_CAS_SERVICE_H_ + +#include + +#include "FactoryLoader.h" + +namespace android { +struct CasFactory; +struct DescramblerFactory; +namespace hardware { +namespace cas { +namespace V1_0 { +namespace implementation { + +class MediaCasService : public IMediaCasService { +public: + MediaCasService(); + + virtual Return enumeratePlugins( + enumeratePlugins_cb _hidl_cb) override; + + virtual Return isSystemIdSupported( + int32_t CA_system_id) override; + + virtual Return> createPlugin( + int32_t CA_system_id, const sp& listener) override; + + virtual Return isDescramblerSupported( + int32_t CA_system_id) override; + + virtual Return> createDescrambler( + int32_t CA_system_id) override; + +private: + FactoryLoader mCasLoader; + FactoryLoader mDescramblerLoader; + + virtual ~MediaCasService(); +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace cas +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_CAS_V1_0_MEDIA_CAS_SERVICE_H_ diff --git a/cas/1.0/default/SharedLibrary.cpp b/cas/1.0/default/SharedLibrary.cpp new file mode 100644 index 0000000000..9c7f38554a --- /dev/null +++ b/cas/1.0/default/SharedLibrary.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (C) 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_NDEBUG 0 +#define LOG_TAG "android.hardware.cas@1.0-SharedLibrary" + +#include +#include +#include "SharedLibrary.h" +#include + +namespace android { +namespace hardware { +namespace cas { +namespace V1_0 { +namespace implementation { + +SharedLibrary::SharedLibrary(const String8 &path) { + mLibHandle = dlopen(path.string(), RTLD_NOW); +} + +SharedLibrary::~SharedLibrary() { + if (mLibHandle != NULL) { + dlclose(mLibHandle); + mLibHandle = NULL; + } +} + +bool SharedLibrary::operator!() const { + return mLibHandle == NULL; +} + +void *SharedLibrary::lookup(const char *symbol) const { + if (!mLibHandle) { + return NULL; + } + // Clear last error before we load the symbol again, + // in case the caller didn't retrieve it. + (void)dlerror(); + return dlsym(mLibHandle, symbol); +} + +const char *SharedLibrary::lastError() const { + const char *error = dlerror(); + return error ? error : "No errors or unknown error"; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace cas +} // namespace hardware +} // namespace android diff --git a/cas/1.0/default/SharedLibrary.h b/cas/1.0/default/SharedLibrary.h new file mode 100644 index 0000000000..18130a5441 --- /dev/null +++ b/cas/1.0/default/SharedLibrary.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 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. + */ + +#ifndef ANDROID_HARDWARE_CAS_V1_0_SHARED_LIBRARY_H_ +#define ANDROID_HARDWARE_CAS_V1_0_SHARED_LIBRARY_H_ + +#include +#include +#include + +namespace android { +namespace hardware { +namespace cas { +namespace V1_0 { +namespace implementation { + +class SharedLibrary : public RefBase { +public: + explicit SharedLibrary(const String8 &path); + ~SharedLibrary(); + + bool operator!() const; + void *lookup(const char *symbol) const; + const char *lastError() const; + +private: + void *mLibHandle; + DISALLOW_EVIL_CONSTRUCTORS(SharedLibrary); +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace cas +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_CAS_V1_0_SHARED_LIBRARY_H_ diff --git a/cas/1.0/default/TypeConvert.cpp b/cas/1.0/default/TypeConvert.cpp new file mode 100644 index 0000000000..de1f92bcb3 --- /dev/null +++ b/cas/1.0/default/TypeConvert.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (C) 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_NDEBUG 0 +#define LOG_TAG "android.hardware.cas@1.0-TypeConvert" + +#include +#include "TypeConvert.h" + +namespace android { +namespace hardware { +namespace cas { +namespace V1_0 { +namespace implementation { + +Status toStatus(status_t legacyStatus) { + Status status; + switch(legacyStatus) { + case android::OK: + status = Status::OK; + break; + case android::ERROR_CAS_NO_LICENSE: + status = Status::ERROR_CAS_NO_LICENSE; + break; + case android::ERROR_CAS_LICENSE_EXPIRED: + status = Status::ERROR_CAS_LICENSE_EXPIRED; + break; + case android::ERROR_CAS_SESSION_NOT_OPENED: + status = Status::ERROR_CAS_SESSION_NOT_OPENED; + break; + case android::ERROR_CAS_CANNOT_HANDLE: + status = Status::ERROR_CAS_CANNOT_HANDLE; + break; + case android::ERROR_CAS_TAMPER_DETECTED: + status = Status::ERROR_CAS_INVALID_STATE; + break; + case android::BAD_VALUE: + status = Status::BAD_VALUE; + break; + case android::ERROR_CAS_NOT_PROVISIONED: + status = Status::ERROR_CAS_NOT_PROVISIONED; + break; + case android::ERROR_CAS_RESOURCE_BUSY: + status = Status::ERROR_CAS_RESOURCE_BUSY; + break; + case android::ERROR_CAS_INSUFFICIENT_OUTPUT_PROTECTION: + status = Status::ERROR_CAS_INSUFFICIENT_OUTPUT_PROTECTION; + break; + case android::ERROR_CAS_DEVICE_REVOKED: + status = Status::ERROR_CAS_DEVICE_REVOKED; + break; + case android::ERROR_CAS_DECRYPT: + status = Status::ERROR_CAS_DECRYPT; + break; + default: + ALOGW("Unable to convert legacy status: %d, defaulting to UNKNOWN", + legacyStatus); + status = Status::ERROR_CAS_UNKNOWN; + break; + } + return status; +} + +String8 sessionIdToString(const CasSessionId &sessionId) { + String8 result; + for (size_t i = 0; i < sessionId.size(); i++) { + result.appendFormat("%02x ", sessionId[i]); + } + if (result.isEmpty()) { + result.append("(null)"); + } + return result; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace cas +} // namespace hardware +} // namespace android diff --git a/cas/1.0/default/TypeConvert.h b/cas/1.0/default/TypeConvert.h new file mode 100644 index 0000000000..7c3ddeddbb --- /dev/null +++ b/cas/1.0/default/TypeConvert.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 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. + */ + +#ifndef ANDROID_HARDWARE_CAS_V1_0_TYPE_CONVERT_H +#define ANDROID_HARDWARE_CAS_V1_0_TYPE_CONVERT_H + +#include +#include +#include +#include + +namespace android { +namespace hardware { +namespace cas { +namespace V1_0 { +namespace implementation { + +Status toStatus(status_t legacyStatus); + +String8 sessionIdToString(const CasSessionId &sessionId); + +} // namespace implementation +} // namespace V1_0 +} // namespace cas +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_CAS_V1_0_TYPE_CONVERT_H diff --git a/cas/1.0/default/android.hardware.cas@1.0-service.rc b/cas/1.0/default/android.hardware.cas@1.0-service.rc new file mode 100644 index 0000000000..93de79444e --- /dev/null +++ b/cas/1.0/default/android.hardware.cas@1.0-service.rc @@ -0,0 +1,6 @@ +service cas-hal-1-0 /vendor/bin/hw/android.hardware.cas@1.0-service + class hal + user media + group mediadrm drmrpc + ioprio rt 4 + writepid /dev/cpuset/foreground/tasks diff --git a/cas/1.0/default/service.cpp b/cas/1.0/default/service.cpp new file mode 100644 index 0000000000..3f1df5a511 --- /dev/null +++ b/cas/1.0/default/service.cpp @@ -0,0 +1,50 @@ +/* + * 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_NDEBUG 0 +#define LOG_TAG "android.hardware.cas@1.0-service" + +#include +#include +#include + +#include "MediaCasService.h" + +using android::hardware::configureRpcThreadpool; +using android::hardware::joinRpcThreadpool; +using android::hardware::cas::V1_0::implementation::MediaCasService; +using android::hardware::cas::V1_0::IMediaCasService; + +int main() { + ALOGD("android.hardware.cas@1.0-service starting..."); + +#ifdef USE_VNDBINDER + // The CAS HAL may communicate to other vendor components via + // /dev/vndbinder + android::ProcessState::initWithDriver("/dev/vndbinder"); +#endif // USE_VNDBINDER + + configureRpcThreadpool(8, true /* callerWillJoin */); + + // Setup hwbinder service + android::sp service = new MediaCasService(); + android::status_t status = service->registerAsService(); + LOG_ALWAYS_FATAL_IF( + status != android::OK, + "Error while registering cas service: %d", status); + joinRpcThreadpool(); + return 0; +} diff --git a/cas/1.0/types.hal b/cas/1.0/types.hal new file mode 100644 index 0000000000..7337f0014e --- /dev/null +++ b/cas/1.0/types.hal @@ -0,0 +1,124 @@ +/** + * Copyright (C) 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. + */ + +package android.hardware.cas@1.0; + +enum Status : uint32_t { + /** + * The CAS plugin must return OK when an operation completes without any + * errors. + */ + OK, + + /** + * The CAS plugin must return ERROR_CAS_NO_LICENSE, when descrambling is + * attempted and no license keys have been provided. + */ + ERROR_CAS_NO_LICENSE, + + /** + * ERROR_CAS_LICENSE_EXPIRED must be returned when an attempt is made + * to use a license and the keys in that license have expired. + */ + ERROR_CAS_LICENSE_EXPIRED, + + /** + * The CAS plugin must return ERROR_CAS_SESSION_NOT_OPENED when an + * attempt is made to use a session that has not been opened. + */ + ERROR_CAS_SESSION_NOT_OPENED, + + /** + * The CAS plugin must return ERROR_CAS_CANNOT_HANDLE when an unsupported + * data format or operation is attempted. + */ + ERROR_CAS_CANNOT_HANDLE, + + /** + * ERROR_CAS_INVALID_STATE must be returned when the device is in a state + * where it is not able to perform descrambling. + */ + ERROR_CAS_INVALID_STATE, + + /** + * The CAS plugin must return BAD_VALUE whenever an illegal parameter is + * passed to one of the interface functions. + */ + BAD_VALUE, + + /** + * The CAS plugin must return ERROR_CAS_NOT_PROVISIONED when the device + * has not yet been provisioned. + */ + ERROR_CAS_NOT_PROVISIONED, + + /** + * ERROR_CAS_RESOURCE_BUSY must be returned when resources, such as CAS + * sessions or secure buffers are not available to perform a requested + * operation because they are already in use. + */ + ERROR_CAS_RESOURCE_BUSY, + + /** + * The CAS Plugin must return ERROR_CAS_INSUFFICIENT_OUTPUT_PROTECTION + * when the output protection level enabled on the device is not + * sufficient to meet the requirements in the license policy. HDCP is an + * example of a form of output protection. + */ + ERROR_CAS_INSUFFICIENT_OUTPUT_PROTECTION, + + /** + * The CAS Plugin must return ERROR_CAS_TAMPER_DETECTED if an attempt to + * tamper with the CAS system is detected. + */ + ERROR_CAS_TAMPER_DETECTED, + + /** + * The CAS Plugin must return ERROR_CAS_DEVICE_REVOKED if the response + * indicates that the device has been revoked. Device revocation means + * that the device is no longer permitted to play content. + */ + ERROR_CAS_DEVICE_REVOKED, + + /** + * The CAS plugin must return ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED when + * descrambling is failing because the session is not initialized properly. + */ + ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED, + + /** + * The CAS Plugin must return ERROR_CAS_DECRYPT if the DescramblerPlugin's + * descramble operation fails. + */ + ERROR_CAS_DECRYPT, + + /** + * ERROR_CAS_UNKNOWN must be returned when a fatal failure occurs and no + * other defined error is appropriate. + */ + ERROR_CAS_UNKNOWN, +}; + +typedef vec HidlCasSessionId; +typedef vec HidlCasData; + +/** + * Describes a CAS plugin with its system id and name. + */ +struct HidlCasPluginDescriptor { + int32_t caSystemId; + string name; +}; diff --git a/cas/Android.bp b/cas/Android.bp new file mode 100644 index 0000000000..57532a0841 --- /dev/null +++ b/cas/Android.bp @@ -0,0 +1,6 @@ +// This is an autogenerated file, do not edit. +subdirs = [ + "1.0", + "1.0/default", + "native/1.0", +] diff --git a/cas/native/1.0/Android.bp b/cas/native/1.0/Android.bp new file mode 100644 index 0000000000..414fca7b93 --- /dev/null +++ b/cas/native/1.0/Android.bp @@ -0,0 +1,65 @@ +// This file is autogenerated by hidl-gen. Do not edit manually. + +filegroup { + name: "android.hardware.cas.native@1.0_hal", + srcs: [ + "types.hal", + "IDescrambler.hal", + ], +} + +genrule { + name: "android.hardware.cas.native@1.0_genc++", + tools: ["hidl-gen"], + cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.cas.native@1.0", + srcs: [ + ":android.hardware.cas.native@1.0_hal", + ], + out: [ + "android/hardware/cas/native/1.0/types.cpp", + "android/hardware/cas/native/1.0/DescramblerAll.cpp", + ], +} + +genrule { + name: "android.hardware.cas.native@1.0_genc++_headers", + tools: ["hidl-gen"], + cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.cas.native@1.0", + srcs: [ + ":android.hardware.cas.native@1.0_hal", + ], + out: [ + "android/hardware/cas/native/1.0/types.h", + "android/hardware/cas/native/1.0/hwtypes.h", + "android/hardware/cas/native/1.0/IDescrambler.h", + "android/hardware/cas/native/1.0/IHwDescrambler.h", + "android/hardware/cas/native/1.0/BnHwDescrambler.h", + "android/hardware/cas/native/1.0/BpHwDescrambler.h", + "android/hardware/cas/native/1.0/BsDescrambler.h", + ], +} + +cc_library_shared { + name: "android.hardware.cas.native@1.0", + defaults: ["hidl-module-defaults"], + generated_sources: ["android.hardware.cas.native@1.0_genc++"], + generated_headers: ["android.hardware.cas.native@1.0_genc++_headers"], + export_generated_headers: ["android.hardware.cas.native@1.0_genc++_headers"], + vendor_available: true, + shared_libs: [ + "libhidlbase", + "libhidltransport", + "libhwbinder", + "liblog", + "libutils", + "libcutils", + "android.hardware.cas@1.0", + ], + export_shared_lib_headers: [ + "libhidlbase", + "libhidltransport", + "libhwbinder", + "libutils", + "android.hardware.cas@1.0", + ], +} diff --git a/cas/native/1.0/IDescrambler.hal b/cas/native/1.0/IDescrambler.hal new file mode 100644 index 0000000000..459e5e3006 --- /dev/null +++ b/cas/native/1.0/IDescrambler.hal @@ -0,0 +1,45 @@ +/* + * Copyright (C) 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. + */ +package android.hardware.cas.native@1.0; + +import android.hardware.cas@1.0::IDescramblerBase; + +/** + * IDescrambler is the native plugin API for descrambling operations. + */ + +interface IDescrambler extends IDescramblerBase { + /** + * Descramble the data in a source SharedBuffer, described by an array of + * SubSample structures. + * + * @param scramblingControl an enumeration indicating the key that the subsamples + * were scrambled with. + * @param subSamples an array of SubSample structures describing the number of + * clear and scrambled bytes within each subsample. + * @param srcBuffer the SharedBuffer containing the source scrambled data. + * @param srcOffset the position where the source scrambled data starts at. + * @param dstBuffer the DestinationBuffer to hold the descrambled data. + * @param dstOffset the position where the descrambled data should start at. + * + * @return status the status of the call. + * @return bytesWritten number of bytes that have been successfully descrambled. + * @return detailedError a detailed message describing the error (if any). + */ + descramble(ScramblingControl scramblingControl, vec subSamples, + SharedBuffer srcBuffer, uint64_t srcOffset, DestinationBuffer dstBuffer, uint64_t dstOffset) + generates(Status status, uint32_t bytesWritten, string detailedError); +}; diff --git a/cas/native/1.0/types.hal b/cas/native/1.0/types.hal new file mode 100644 index 0000000000..a576d0390b --- /dev/null +++ b/cas/native/1.0/types.hal @@ -0,0 +1,90 @@ +/** + * Copyright (C) 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. + */ + +package android.hardware.cas.native@1.0; + +import android.hardware.cas@1.0::types; + +/** + * Enumerates the keys used to scramble the content. + */ +enum ScramblingControl : uint32_t { + UNSCRAMBLED = 0, + RESERVED = 1, + EVENKEY = 2, + ODDKEY = 3, +}; + +/** + * A subsample consists of some number of bytes of clear (unscrambled) + * data followed by a number of bytes of scrambled data. + */ +struct SubSample { + uint32_t numBytesOfClearData; + uint32_t numBytesOfEncryptedData; +}; + +/** + * SharedBuffer describes a shared buffer which is defined by a heapBase, an + * offset and a size. The offset is relative to the shared memory base for the + * memory region identified by heapBase. + */ +struct SharedBuffer { + /** + * The shared memory base handle + */ + memory heapBase; + + /** + * The offset from the shared memory base + */ + uint64_t offset; + + /** + * The size of the shared buffer in bytes + */ + uint64_t size; +}; + +/** + * A descrambling destination buffer can be either normal user-space shared + * memory for the non-secure descrambling case, or it can be a secure buffer + * which is referenced by a native-handle. The native handle is allocated + * by the vendor's buffer allocator. + */ +enum BufferType : uint32_t { + SHARED_MEMORY = 0, + NATIVE_HANDLE = 1, +}; + +struct DestinationBuffer { + /** + * The type of the buffer + */ + BufferType type; + + /** + * If type == SHARED_MEMORY, the descrambled data must be written + * to user-space non-secure shared memory. + */ + SharedBuffer nonsecureMemory; + + /** + * If type == NATIVE_HANDLE, the descrambled data must be written + * to secure memory referenced by the vendor's buffer allocator. + */ + handle secureMemory; +}; From 731531d87f549cc220baaf9586834f1a0c56cf32 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Mon, 26 Jun 2017 19:22:03 +0000 Subject: [PATCH 014/265] Revert "EVS: Android.bp -> Android.mk" This reverts commit ee4f923b319180579c96161c1e23f673bebfed85. Change-Id: I8b8490b3e828a9a31af8f6f823d9c70e1c11c9c5 --- automotive/Android.bp | 1 + automotive/evs/1.0/default/Android.bp | 31 +++++++++++++++++++++++++++ automotive/evs/1.0/default/Android.mk | 29 ------------------------- 3 files changed, 32 insertions(+), 29 deletions(-) create mode 100644 automotive/evs/1.0/default/Android.bp delete mode 100644 automotive/evs/1.0/default/Android.mk diff --git a/automotive/Android.bp b/automotive/Android.bp index be588299e3..aec8865f89 100644 --- a/automotive/Android.bp +++ b/automotive/Android.bp @@ -1,6 +1,7 @@ // This is an autogenerated file, do not edit. subdirs = [ "evs/1.0", + "evs/1.0/default", "evs/1.0/vts/functional", "vehicle/2.0", "vehicle/2.1", diff --git a/automotive/evs/1.0/default/Android.bp b/automotive/evs/1.0/default/Android.bp new file mode 100644 index 0000000000..2574e860b2 --- /dev/null +++ b/automotive/evs/1.0/default/Android.bp @@ -0,0 +1,31 @@ +cc_binary { + name: "android.hardware.automotive.evs@1.0-service", + defaults: ["hidl_defaults"], + proprietary: true, + relative_install_path: "hw", + srcs: [ + "service.cpp", + "EvsCamera.cpp", + "EvsEnumerator.cpp", + "EvsDisplay.cpp" + ], + init_rc: ["android.hardware.automotive.evs@1.0-service.rc"], + + shared_libs: [ + "android.hardware.automotive.evs@1.0", + "libui", + "libbase", + "libbinder", + "libcutils", + "libhardware", + "libhidlbase", + "libhidltransport", + "liblog", + "libutils", + ], + + cflags: [ + "-O0", + "-g", + ], +} diff --git a/automotive/evs/1.0/default/Android.mk b/automotive/evs/1.0/default/Android.mk deleted file mode 100644 index 0ee70711d1..0000000000 --- a/automotive/evs/1.0/default/Android.mk +++ /dev/null @@ -1,29 +0,0 @@ -LOCAL_PATH:=$(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.automotive.evs@1.0-service -LOCAL_INIT_RC := android.hardware.automotive.evs@1.0-service.rc -LOCAL_MODULE_RELATIVE_PATH := hw -LOCAL_VENDOR_MODULE := true - -LOCAL_SRC_FILES := \ - service.cpp \ - EvsCamera.cpp \ - EvsEnumerator.cpp \ - EvsDisplay.cpp \ - -LOCAL_SHARED_LIBRARIES := \ - android.hardware.automotive.evs@1.0 \ - libui \ - libbase \ - libbinder \ - libcutils \ - libhardware \ - libhidlbase \ - libhidltransport \ - liblog \ - libutils \ - -LOCAL_CFLAGS := -O0 -g - -include $(BUILD_EXECUTABLE) From da72d37770a9d250a82cc0e5482c0aa2e8f7087b Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Mon, 26 Jun 2017 16:08:51 -0700 Subject: [PATCH 015/265] Fix Broadcast radio 1.0 VTS to not fail on other radio types than AM/FM. Bug: b/36864090 Test: VTS Change-Id: I402f2fb00a553af2118e8a7595f5b377befcaa01 --- .../VtsHalBroadcastradioV1_0TargetTest.cpp | 113 +++++++++++------- 1 file changed, 71 insertions(+), 42 deletions(-) diff --git a/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp b/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp index ebeadb13da..3ac6594304 100644 --- a/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp +++ b/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp @@ -228,6 +228,7 @@ class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase, bool getProperties(); bool openTuner(); bool checkAntenna(); + BandConfig& getBand(unsigned idx); static const nsecs_t kConnectCallbacktimeoutNs = seconds_to_nanoseconds(1); static const nsecs_t kConfigCallbacktimeoutNs = seconds_to_nanoseconds(10); @@ -237,6 +238,7 @@ class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase, bool skipped; sp mRadio; Properties mHalProperties; + bool mHalPropertiesInitialized = false; sp mTuner; sp mTunerCallback; Mutex mLock; @@ -280,23 +282,29 @@ static bool operator==(const BandConfig& l, const BandConfig& r) { bool BroadcastRadioHidlTest::getProperties() { - if (mHalProperties.bands.size() == 0) { - Result halResult = Result::NOT_INITIALIZED; - Return hidlReturn = - mRadio->getProperties([&](Result result, const Properties& properties) { - halResult = result; - if (result == Result::OK) { - mHalProperties = properties; - } - }); + if (mHalPropertiesInitialized) return true; - EXPECT_TRUE(hidlReturn.isOk()); - EXPECT_EQ(Result::OK, halResult); - EXPECT_EQ(Class::AM_FM, mHalProperties.classId); - EXPECT_GT(mHalProperties.numTuners, 0u); + Result halResult = Result::NOT_INITIALIZED; + auto hidlReturn = mRadio->getProperties([&](Result result, const Properties& properties) { + halResult = result; + if (result == Result::OK) { + mHalProperties = properties; + } + }); + + EXPECT_TRUE(hidlReturn.isOk()); + EXPECT_EQ(Result::OK, halResult); + EXPECT_EQ(radioClass, mHalProperties.classId); + EXPECT_GT(mHalProperties.numTuners, 0u); + if (radioClass == Class::AM_FM) { EXPECT_GT(mHalProperties.bands.size(), 0u); } - return mHalProperties.bands.size() > 0; + + if (hidlReturn.isOk() && halResult == Result::OK) { + mHalPropertiesInitialized = true; + return true; + } + return false; } bool BroadcastRadioHidlTest::openTuner() @@ -306,17 +314,18 @@ bool BroadcastRadioHidlTest::openTuner() } if (mTuner.get() == nullptr) { Result halResult = Result::NOT_INITIALIZED; - Return hidlReturn = - mRadio->openTuner(mHalProperties.bands[0], true, mTunerCallback, - [&](Result result, const sp& tuner) { - halResult = result; - if (result == Result::OK) { - mTuner = tuner; - } - }); + auto openCb = [&](Result result, const sp& tuner) { + halResult = result; + if (result == Result::OK) { + mTuner = tuner; + } + }; + auto hidlReturn = mRadio->openTuner(getBand(0), true, mTunerCallback, openCb); EXPECT_TRUE(hidlReturn.isOk()); EXPECT_EQ(Result::OK, halResult); - EXPECT_EQ(true, waitForCallback(kConfigCallbacktimeoutNs)); + if (radioClass == Class::AM_FM) { + EXPECT_EQ(true, waitForCallback(kConfigCallbacktimeoutNs)); + } } EXPECT_NE(nullptr, mTuner.get()); return nullptr != mTuner.get(); @@ -324,6 +333,8 @@ bool BroadcastRadioHidlTest::openTuner() bool BroadcastRadioHidlTest::checkAntenna() { + if (radioClass != Class::AM_FM) return true; + BandConfig halConfig; Result halResult = Result::NOT_INITIALIZED; Return hidlReturn = @@ -337,6 +348,19 @@ bool BroadcastRadioHidlTest::checkAntenna() return ((halResult == Result::OK) && (halConfig.antennaConnected == true)); } +BandConfig& BroadcastRadioHidlTest::getBand(unsigned idx) { + static BandConfig dummyBandConfig = {}; + if (radioClass == Class::AM_FM) { + EXPECT_GT(mHalProperties.bands.size(), idx); + if (mHalProperties.bands.size() > idx) { + return mHalProperties.bands[idx]; + } else { + return dummyBandConfig; + } + } else { + return dummyBandConfig; + } +} /** * Test IBroadcastRadio::getProperties() method @@ -344,7 +368,7 @@ bool BroadcastRadioHidlTest::checkAntenna() * Verifies that: * - the HAL implements the method * - the method returns 0 (no error) - * - the implementation class is AM_FM + * - the implementation class is radioClass * - the implementation supports at least one tuner * - the implementation supports at one band */ @@ -383,22 +407,20 @@ TEST_P(BroadcastRadioHidlTest, ReopenTuner) { * Test IBroadcastRadio::openTuner() method called twice. * * Verifies that: - * - the openTuner method fails when called for the second time without deleting previous - * ITuner instance + * - the openTuner method fails with INVALID_STATE or succeeds when called for the second time + * without deleting previous ITuner instance */ TEST_P(BroadcastRadioHidlTest, OpenTunerTwice) { RETURN_IF_SKIPPED; EXPECT_TRUE(openTuner()); Result halResult = Result::NOT_INITIALIZED; - Return hidlReturn = - mRadio->openTuner(mHalProperties.bands[0], true, mTunerCallback, - [&](Result result, const sp&) { - halResult = result; - }); + auto openCb = [&](Result result, const sp&) { halResult = result; }; + auto hidlReturn = mRadio->openTuner(getBand(0), true, mTunerCallback, openCb); EXPECT_TRUE(hidlReturn.isOk()); - EXPECT_EQ(Result::INVALID_STATE, halResult); - EXPECT_TRUE(waitForCallback(kConfigCallbacktimeoutNs)); + if (halResult == Result::INVALID_STATE) { + EXPECT_TRUE(waitForCallback(kConfigCallbacktimeoutNs)); + } } /** @@ -411,16 +433,17 @@ TEST_P(BroadcastRadioHidlTest, OpenTunerTwice) { * - the configuration read back from HAl has the same class Id */ TEST_P(BroadcastRadioHidlTest, SetAndGetConfiguration) { + if (radioClass != Class::AM_FM) skipped = true; RETURN_IF_SKIPPED; ASSERT_EQ(true, openTuner()); // test setConfiguration mCallbackCalled = false; - Return hidlResult = mTuner->setConfiguration(mHalProperties.bands[1]); + Return hidlResult = mTuner->setConfiguration(getBand(1)); EXPECT_TRUE(hidlResult.isOk()); EXPECT_EQ(Result::OK, hidlResult); EXPECT_EQ(true, waitForCallback(kConfigCallbacktimeoutNs)); EXPECT_EQ(Result::OK, mResultCallbackData); - EXPECT_EQ(mHalProperties.bands[1], mBandConfigCallbackData); + EXPECT_EQ(getBand(1), mBandConfigCallbackData); // test getConfiguration BandConfig halConfig; @@ -434,7 +457,7 @@ TEST_P(BroadcastRadioHidlTest, SetAndGetConfiguration) { }); EXPECT_TRUE(hidlReturn.isOk()); EXPECT_EQ(Result::OK, halResult); - EXPECT_EQ(mHalProperties.bands[1], halConfig); + EXPECT_EQ(getBand(1), halConfig); } /** @@ -445,6 +468,7 @@ TEST_P(BroadcastRadioHidlTest, SetAndGetConfiguration) { * - the method recovers and succeeds after passing correct arguments */ TEST_P(BroadcastRadioHidlTest, SetConfigurationFails) { + if (radioClass != Class::AM_FM) skipped = true; RETURN_IF_SKIPPED; ASSERT_EQ(true, openTuner()); @@ -463,7 +487,7 @@ TEST_P(BroadcastRadioHidlTest, SetConfigurationFails) { // Test setConfiguration recovering after passing good data. mCallbackCalled = false; - setResult = mTuner->setConfiguration(mHalProperties.bands[0]); + setResult = mTuner->setConfiguration(getBand(0)); EXPECT_TRUE(setResult.isOk()); EXPECT_EQ(Result::OK, setResult); EXPECT_EQ(true, waitForCallback(kConfigCallbacktimeoutNs)); @@ -508,6 +532,7 @@ TEST_P(BroadcastRadioHidlTest, Scan) { * - skipping sub-channel or not does not fail the call */ TEST_P(BroadcastRadioHidlTest, Step) { + if (radioClass != Class::AM_FM) skipped = true; RETURN_IF_SKIPPED; ASSERT_EQ(true, openTuner()); ASSERT_TRUE(checkAntenna()); @@ -535,18 +560,21 @@ TEST_P(BroadcastRadioHidlTest, Step) { * - the tuned callback is received within kTuneCallbacktimeoutNs ns after tune() */ TEST_P(BroadcastRadioHidlTest, TuneAndGetProgramInformationAndCancel) { + if (radioClass != Class::AM_FM) skipped = true; RETURN_IF_SKIPPED; ASSERT_EQ(true, openTuner()); ASSERT_TRUE(checkAntenna()); + auto& band = getBand(0); + // test tune - ASSERT_GT(mHalProperties.bands[0].spacings.size(), 0u); - ASSERT_GT(mHalProperties.bands[0].upperLimit, mHalProperties.bands[0].lowerLimit); + ASSERT_GT(band.spacings.size(), 0u); + ASSERT_GT(band.upperLimit, band.lowerLimit); // test scan UP - uint32_t lowerLimit = mHalProperties.bands[0].lowerLimit; - uint32_t upperLimit = mHalProperties.bands[0].upperLimit; - uint32_t spacing = mHalProperties.bands[0].spacings[0]; + uint32_t lowerLimit = band.lowerLimit; + uint32_t upperLimit = band.upperLimit; + uint32_t spacing = band.spacings[0]; uint32_t channel = lowerLimit + (((upperLimit - lowerLimit) / 2 + spacing - 1) / spacing) * spacing; @@ -593,6 +621,7 @@ TEST_P(BroadcastRadioHidlTest, TuneAndGetProgramInformationAndCancel) { * - the method recovers and succeeds after passing correct arguments */ TEST_P(BroadcastRadioHidlTest, TuneFailsOutOfBounds) { + if (radioClass != Class::AM_FM) skipped = true; RETURN_IF_SKIPPED; ASSERT_TRUE(openTuner()); ASSERT_TRUE(checkAntenna()); From 3aee4e9e3f3dbd7d4a6e6bd6ba816773a4e4c817 Mon Sep 17 00:00:00 2001 From: Andrew Scull Date: Tue, 13 Jun 2017 10:44:55 +0100 Subject: [PATCH 016/265] OemLock functional VTS test. Bug: 37530310 Test: VtsHalOemLockV1_0TargetTest Change-Id: I07adb187f9bde236e2c92f423936089f4cb37b24 --- oemlock/1.0/vts/functional/Android.bp | 36 ++++ .../VtsHalOemLockV1_0TargetTest.cpp | 189 ++++++++++++++++++ oemlock/Android.bp | 1 + 3 files changed, 226 insertions(+) create mode 100644 oemlock/1.0/vts/functional/Android.bp create mode 100644 oemlock/1.0/vts/functional/VtsHalOemLockV1_0TargetTest.cpp diff --git a/oemlock/1.0/vts/functional/Android.bp b/oemlock/1.0/vts/functional/Android.bp new file mode 100644 index 0000000000..a13b3dc71d --- /dev/null +++ b/oemlock/1.0/vts/functional/Android.bp @@ -0,0 +1,36 @@ +// +// Copyright (C) 2016 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +cc_test { + name: "VtsHalOemLockV1_0TargetTest", + defaults: ["hidl_defaults"], + srcs: ["VtsHalOemLockV1_0TargetTest.cpp"], + shared_libs: [ + "libbase", + "liblog", + "libcutils", + "libhidlbase", + "libhidltransport", + "libnativehelper", + "libutils", + "android.hardware.oemlock@1.0", + ], + static_libs: ["VtsHalHidlTargetTestBase"], + cflags: [ + "-O0", + "-g", + ], +} diff --git a/oemlock/1.0/vts/functional/VtsHalOemLockV1_0TargetTest.cpp b/oemlock/1.0/vts/functional/VtsHalOemLockV1_0TargetTest.cpp new file mode 100644 index 0000000000..a924feca30 --- /dev/null +++ b/oemlock/1.0/vts/functional/VtsHalOemLockV1_0TargetTest.cpp @@ -0,0 +1,189 @@ +/* + * Copyright (C) 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. + */ + +#include + +#include + +using ::android::hardware::oemlock::V1_0::IOemLock; +using ::android::hardware::oemlock::V1_0::OemLockStatus; +using ::android::hardware::oemlock::V1_0::OemLockSecureStatus; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::sp; + +struct OemLockHidlTest : public ::testing::VtsHalHidlTargetTestBase { + virtual void SetUp() override { + oemlock = ::testing::VtsHalHidlTargetTestBase::getService(); + ASSERT_NE(oemlock, nullptr); + } + + virtual void TearDown() override {} + + sp oemlock; +}; + +/* + * Check the name can be retrieved + */ +TEST_F(OemLockHidlTest, GetName) { + std::string name; + OemLockStatus status; + + bool callbackCalled = false; + const auto ret = oemlock->getName([&](OemLockStatus s, hidl_string n) { + callbackCalled = true; + status = s; + name = n.c_str(); + }); + + ASSERT_TRUE(ret.isOk()); + ASSERT_TRUE(callbackCalled); + EXPECT_EQ(status, OemLockStatus::OK); + // Any value acceptable +}; + +/* + * Check the unlock allowed by device state can be queried + */ +TEST_F(OemLockHidlTest, QueryUnlockAllowedByDevice) { + bool allowed; + OemLockStatus status; + + bool callbackCalled = false; + const auto ret = oemlock->isOemUnlockAllowedByDevice([&](OemLockStatus s, bool a) { + callbackCalled = true; + status = s; + allowed = a; + }); + + ASSERT_TRUE(ret.isOk()); + ASSERT_TRUE(callbackCalled); + EXPECT_EQ(status, OemLockStatus::OK); + // Any value acceptable +} + +/* + * Check unlock allowed by device state can be toggled + */ +TEST_F(OemLockHidlTest, AllowedByDeviceCanBeToggled) { + bool allowed; + OemLockStatus status; + + auto getAllowedCallback = [&](OemLockStatus s, bool a) { + status = s; + allowed = a; + }; + + // Get the original state so it can be restored + const auto get_ret = oemlock->isOemUnlockAllowedByDevice(getAllowedCallback); + ASSERT_TRUE(get_ret.isOk()); + ASSERT_EQ(status, OemLockStatus::OK); + const bool originallyAllowed = allowed; + + // Toggle the state + const auto set_ret = oemlock->setOemUnlockAllowedByDevice(!originallyAllowed); + ASSERT_TRUE(set_ret.isOk()); + ASSERT_EQ(set_ret, OemLockStatus::OK); + const auto check_set_ret = oemlock->isOemUnlockAllowedByDevice(getAllowedCallback); + ASSERT_TRUE(check_set_ret.isOk()); + ASSERT_EQ(status, OemLockStatus::OK); + ASSERT_EQ(allowed, !originallyAllowed); + + // Restore the state + const auto restore_ret = oemlock->setOemUnlockAllowedByDevice(originallyAllowed); + ASSERT_TRUE(restore_ret.isOk()); + ASSERT_EQ(restore_ret, OemLockStatus::OK); + const auto check_restore_ret = oemlock->isOemUnlockAllowedByDevice(getAllowedCallback); + ASSERT_TRUE(check_restore_ret.isOk()); + ASSERT_EQ(status, OemLockStatus::OK); + ASSERT_EQ(allowed, originallyAllowed); +}; + +/* + * Check the unlock allowed by device state can be queried + */ +TEST_F(OemLockHidlTest, QueryUnlockAllowedByCarrier) { + bool allowed; + OemLockStatus status; + + bool callbackCalled = false; + const auto ret = oemlock->isOemUnlockAllowedByCarrier([&](OemLockStatus s, bool a) { + callbackCalled = true; + status = s; + allowed = a; + }); + + ASSERT_TRUE(ret.isOk()); + ASSERT_TRUE(callbackCalled); + EXPECT_EQ(status, OemLockStatus::OK); + // Any value acceptable +} + +/* + * Attempt to check unlock allowed by carrier can be toggled + * + * The implementation may involve a signature which cannot be tested here. That + * is a valid implementation so the test will pass. If there is no signature + * required, the test will toggle the value. + */ +TEST_F(OemLockHidlTest, CarrierUnlock) { + const hidl_vec noSignature = {}; + bool allowed; + OemLockStatus status; + + auto getAllowedCallback = [&](OemLockStatus s, bool a) { + status = s; + allowed = a; + }; + + // Get the original state so it can be restored + const auto get_ret = oemlock->isOemUnlockAllowedByCarrier(getAllowedCallback); + ASSERT_TRUE(get_ret.isOk()); + ASSERT_EQ(status, OemLockStatus::OK); + const bool originallyAllowed = allowed; + + if (originallyAllowed) { + // Only applied to locked devices + return; + } + + // Toggle the state + const auto set_ret = oemlock->setOemUnlockAllowedByCarrier(!originallyAllowed, noSignature); + ASSERT_TRUE(set_ret.isOk()); + ASSERT_NE(set_ret, OemLockSecureStatus::FAILED); + const auto check_set_ret = oemlock->isOemUnlockAllowedByCarrier(getAllowedCallback); + ASSERT_TRUE(check_set_ret.isOk()); + ASSERT_EQ(status, OemLockStatus::OK); + + if (set_ret == OemLockSecureStatus::INVALID_SIGNATURE) { + // Signature is required so we cannot toggle the value in the test, but this is allowed + ASSERT_EQ(allowed, originallyAllowed); + return; + } + + ASSERT_EQ(set_ret, OemLockSecureStatus::OK); + ASSERT_EQ(allowed, !originallyAllowed); + + // Restore the state + const auto restore_ret = oemlock->setOemUnlockAllowedByCarrier(originallyAllowed, noSignature); + ASSERT_TRUE(restore_ret.isOk()); + ASSERT_EQ(restore_ret, OemLockSecureStatus::OK); + const auto check_restore_ret = oemlock->isOemUnlockAllowedByCarrier(getAllowedCallback); + ASSERT_TRUE(check_restore_ret.isOk()); + ASSERT_EQ(status, OemLockStatus::OK); + ASSERT_EQ(allowed, originallyAllowed); +}; diff --git a/oemlock/Android.bp b/oemlock/Android.bp index bbb3e4bac0..33f70ebae2 100644 --- a/oemlock/Android.bp +++ b/oemlock/Android.bp @@ -1,4 +1,5 @@ // This is an autogenerated file, do not edit. subdirs = [ "1.0", + "1.0/vts/functional", ] From 99d23a09f13530ad56baba33caf8d72217b2f36a Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Mon, 12 Jun 2017 16:40:55 +0530 Subject: [PATCH 017/265] move duplicate code to common Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Test -l INFO Bug: 62894603 Change-Id: I4f9bec22c6437935f49603f11d27642ef2135382 --- .../audio/media_audio_hidl_test_common.cpp | 41 ------- .../audio/media_audio_hidl_test_common.h | 8 -- .../common/media_hidl_test_common.cpp | 107 +++++++++++++++++ .../common/media_hidl_test_common.h | 13 +++ .../VtsHalMediaOmxV1_0TargetComponentTest.cpp | 110 ------------------ .../video/media_video_hidl_test_common.cpp | 62 ---------- .../video/media_video_hidl_test_common.h | 10 -- 7 files changed, 120 insertions(+), 231 deletions(-) diff --git a/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp b/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp index 7240964ecb..4c68219b47 100644 --- a/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp @@ -46,47 +46,6 @@ using ::android::sp; #include #include -Return setAudioPortFormat( - sp omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding) { - OMX_U32 index = 0; - OMX_AUDIO_PARAM_PORTFORMATTYPE portFormat; - std::vector arrEncoding; - android::hardware::media::omx::V1_0::Status status; - - while (1) { - portFormat.nIndex = index; - status = getPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex, - &portFormat); - if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; - arrEncoding.push_back(portFormat.eEncoding); - index++; - if (index == 512) { - // enumerated way too many formats, highly unusual for this to - // happen. - EXPECT_LE(index, 512U) - << "Expecting OMX_ErrorNoMore but not received"; - break; - } - } - if (!index) return status; - for (index = 0; index < arrEncoding.size(); index++) { - if (arrEncoding[index] == eEncoding) { - portFormat.eEncoding = arrEncoding[index]; - break; - } - } - if (index == arrEncoding.size()) { - ALOGE("setting default Port format %x", (int)arrEncoding[0]); - portFormat.eEncoding = arrEncoding[0]; - } - // In setParam call nIndex shall be ignored as per omx-il specification. - // see how this holds up by corrupting nIndex - portFormat.nIndex = RANDOM_INDEX; - status = setPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex, - &portFormat); - return status; -} - void enumerateProfile(sp omxNode, OMX_U32 portIndex, std::vector* arrProfile) { android::hardware::media::omx::V1_0::Status status; diff --git a/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.h b/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.h index 70142f2b05..b187d28415 100644 --- a/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.h @@ -19,17 +19,9 @@ #include -/* - * Random Index used for monkey testing while get/set parameters - */ -#define RANDOM_INDEX 1729 - /* * Common audio utils */ -Return setAudioPortFormat( - sp omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding); - void enumerateProfile(sp omxNode, OMX_U32 portIndex, std::vector* arrProfile); diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp index e81e6dd4d0..d30a75c406 100755 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp @@ -60,6 +60,113 @@ Return setRole( return setParam(omxNode, OMX_IndexParamStandardComponentRole, ¶ms); } +// get/set video component port format +Return setVideoPortFormat( + sp omxNode, OMX_U32 portIndex, + OMX_VIDEO_CODINGTYPE eCompressionFormat, OMX_COLOR_FORMATTYPE eColorFormat, + OMX_U32 xFramerate) { + OMX_U32 index = 0; + OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; + std::vector arrColorFormat; + std::vector arrCompressionFormat; + android::hardware::media::omx::V1_0::Status status; + + while (1) { + portFormat.nIndex = index; + status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex, + &portFormat); + if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; + if (eCompressionFormat == OMX_VIDEO_CodingUnused) + arrColorFormat.push_back(portFormat.eColorFormat); + else + arrCompressionFormat.push_back(portFormat.eCompressionFormat); + index++; + if (index == 512) { + // enumerated way too many formats, highly unusual for this to + // happen. + EXPECT_LE(index, 512U) + << "Expecting OMX_ErrorNoMore but not received"; + break; + } + } + if (!index) return status; + if (eCompressionFormat == OMX_VIDEO_CodingUnused) { + for (index = 0; index < arrColorFormat.size(); index++) { + if (arrColorFormat[index] == eColorFormat) { + portFormat.eColorFormat = arrColorFormat[index]; + break; + } + } + if (index == arrColorFormat.size()) { + ALOGE("setting default color format %x", (int)arrColorFormat[0]); + portFormat.eColorFormat = arrColorFormat[0]; + } + portFormat.eCompressionFormat = OMX_VIDEO_CodingUnused; + } else { + for (index = 0; index < arrCompressionFormat.size(); index++) { + if (arrCompressionFormat[index] == eCompressionFormat) { + portFormat.eCompressionFormat = arrCompressionFormat[index]; + break; + } + } + if (index == arrCompressionFormat.size()) { + ALOGE("setting default compression format %x", + (int)arrCompressionFormat[0]); + portFormat.eCompressionFormat = arrCompressionFormat[0]; + } + portFormat.eColorFormat = OMX_COLOR_FormatUnused; + } + // In setParam call nIndex shall be ignored as per omx-il specification. + // see how this holds up by corrupting nIndex + portFormat.nIndex = RANDOM_INDEX; + portFormat.xFramerate = xFramerate; + status = setPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex, + &portFormat); + return status; +} + +// get/set audio component port format +Return setAudioPortFormat( + sp omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding) { + OMX_U32 index = 0; + OMX_AUDIO_PARAM_PORTFORMATTYPE portFormat; + std::vector arrEncoding; + android::hardware::media::omx::V1_0::Status status; + + while (1) { + portFormat.nIndex = index; + status = getPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex, + &portFormat); + if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; + arrEncoding.push_back(portFormat.eEncoding); + index++; + if (index == 512) { + // enumerated way too many formats, highly unusual for this to + // happen. + EXPECT_LE(index, 512U) + << "Expecting OMX_ErrorNoMore but not received"; + break; + } + } + if (!index) return status; + for (index = 0; index < arrEncoding.size(); index++) { + if (arrEncoding[index] == eEncoding) { + portFormat.eEncoding = arrEncoding[index]; + break; + } + } + if (index == arrEncoding.size()) { + ALOGE("setting default Port format %x", (int)arrEncoding[0]); + portFormat.eEncoding = arrEncoding[0]; + } + // In setParam call nIndex shall be ignored as per omx-il specification. + // see how this holds up by corrupting nIndex + portFormat.nIndex = RANDOM_INDEX; + status = setPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex, + &portFormat); + return status; +} + // allocate buffers needed on a component port void allocatePortBuffers(sp omxNode, android::Vector* buffArray, diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h index d617e45e43..c0e03f63d6 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h @@ -36,6 +36,11 @@ #define DEFAULT_TIMEOUT 100000 #define TIMEOUT_COUNTER (10000000 / DEFAULT_TIMEOUT) +/* + * Random Index used for monkey testing while get/set parameters + */ +#define RANDOM_INDEX 1729 + enum bufferOwner { client, component, @@ -259,6 +264,14 @@ Return setPortConfig( Return setRole( sp omxNode, const char* role); +Return setVideoPortFormat( + sp omxNode, OMX_U32 portIndex, + OMX_VIDEO_CODINGTYPE eCompressionFormat, OMX_COLOR_FORMATTYPE eColorFormat, + OMX_U32 xFramerate); + +Return setAudioPortFormat( + sp omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding); + void allocatePortBuffers(sp omxNode, android::Vector* buffArray, OMX_U32 portIndex, diff --git a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp index 357c11e2b0..178db1538e 100644 --- a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp +++ b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp @@ -203,9 +203,6 @@ class ComponentHidlTest : public ::testing::VtsHalHidlTargetTestBase { } }; -// Random Index used for monkey testing while get/set parameters -#define RANDOM_INDEX 1729 - void initPortMode(PortMode* pm, bool isSecure, ComponentHidlTest::standardCompClass compClass) { pm[0] = PortMode::PRESET_BYTE_BUFFER; @@ -225,113 +222,6 @@ void initPortMode(PortMode* pm, bool isSecure, return; } -// get/set video component port format -Return setVideoPortFormat( - sp omxNode, OMX_U32 portIndex, - OMX_VIDEO_CODINGTYPE eCompressionFormat, OMX_COLOR_FORMATTYPE eColorFormat, - OMX_U32 xFramerate) { - OMX_U32 index = 0; - OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; - std::vector arrColorFormat; - std::vector arrCompressionFormat; - android::hardware::media::omx::V1_0::Status status; - - while (1) { - portFormat.nIndex = index; - status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex, - &portFormat); - if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; - if (eCompressionFormat == OMX_VIDEO_CodingUnused) - arrColorFormat.push_back(portFormat.eColorFormat); - else - arrCompressionFormat.push_back(portFormat.eCompressionFormat); - index++; - if (index == 512) { - // enumerated way too many formats, highly unusual for this to - // happen. - EXPECT_LE(index, 512U) - << "Expecting OMX_ErrorNoMore but not received"; - break; - } - } - if (!index) return status; - if (eCompressionFormat == OMX_VIDEO_CodingUnused) { - for (index = 0; index < arrColorFormat.size(); index++) { - if (arrColorFormat[index] == eColorFormat) { - portFormat.eColorFormat = arrColorFormat[index]; - break; - } - } - if (index == arrColorFormat.size()) { - ALOGE("setting default color format %x", (int)arrColorFormat[0]); - portFormat.eColorFormat = arrColorFormat[0]; - } - portFormat.eCompressionFormat = OMX_VIDEO_CodingUnused; - } else { - for (index = 0; index < arrCompressionFormat.size(); index++) { - if (arrCompressionFormat[index] == eCompressionFormat) { - portFormat.eCompressionFormat = arrCompressionFormat[index]; - break; - } - } - if (index == arrCompressionFormat.size()) { - ALOGE("setting default compression format %x", - (int)arrCompressionFormat[0]); - portFormat.eCompressionFormat = arrCompressionFormat[0]; - } - portFormat.eColorFormat = OMX_COLOR_FormatUnused; - } - // In setParam call nIndex shall be ignored as per omx-il specification. - // see how this holds up by corrupting nIndex - portFormat.nIndex = RANDOM_INDEX; - portFormat.xFramerate = xFramerate; - status = setPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex, - &portFormat); - return status; -} - -// get/set audio component port format -Return setAudioPortFormat( - sp omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding) { - OMX_U32 index = 0; - OMX_AUDIO_PARAM_PORTFORMATTYPE portFormat; - std::vector arrEncoding; - android::hardware::media::omx::V1_0::Status status; - - while (1) { - portFormat.nIndex = index; - status = getPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex, - &portFormat); - if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; - arrEncoding.push_back(portFormat.eEncoding); - index++; - if (index == 512) { - // enumerated way too many formats, highly unusual for this to - // happen. - EXPECT_LE(index, 512U) - << "Expecting OMX_ErrorNoMore but not received"; - break; - } - } - if (!index) return status; - for (index = 0; index < arrEncoding.size(); index++) { - if (arrEncoding[index] == eEncoding) { - portFormat.eEncoding = arrEncoding[index]; - break; - } - } - if (index == arrEncoding.size()) { - ALOGE("setting default Port format %x", (int)arrEncoding[0]); - portFormat.eEncoding = arrEncoding[0]; - } - // In setParam call nIndex shall be ignored as per omx-il specification. - // see how this holds up by corrupting nIndex - portFormat.nIndex = RANDOM_INDEX; - status = setPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex, - &portFormat); - return status; -} - // test dispatch message API call TEST_F(ComponentHidlTest, dispatchMsg) { description("test dispatch message API call"); diff --git a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp index 77763d172c..91aecf22e6 100644 --- a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp @@ -52,68 +52,6 @@ using ::android::sp; #include #include -Return setVideoPortFormat( - sp omxNode, OMX_U32 portIndex, - OMX_VIDEO_CODINGTYPE eCompressionFormat, OMX_COLOR_FORMATTYPE eColorFormat, - OMX_U32 xFramerate) { - OMX_U32 index = 0; - OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; - std::vector arrColorFormat; - std::vector arrCompressionFormat; - android::hardware::media::omx::V1_0::Status status; - - while (1) { - portFormat.nIndex = index; - status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex, - &portFormat); - if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; - if (eCompressionFormat == OMX_VIDEO_CodingUnused) - arrColorFormat.push_back(portFormat.eColorFormat); - else - arrCompressionFormat.push_back(portFormat.eCompressionFormat); - index++; - if (index == 512) { - // enumerated way too many formats, highly unusual for this to - // happen. - EXPECT_LE(index, 512U) - << "Expecting OMX_ErrorNoMore but not received"; - break; - } - } - if (!index) return status; - if (eCompressionFormat == OMX_VIDEO_CodingUnused) { - for (index = 0; index < arrColorFormat.size(); index++) { - if (arrColorFormat[index] == eColorFormat) { - portFormat.eColorFormat = arrColorFormat[index]; - break; - } - } - if (index == arrColorFormat.size()) { - ALOGE("setting default color format %x", (int)arrColorFormat[0]); - portFormat.eColorFormat = arrColorFormat[0]; - } - portFormat.eCompressionFormat = OMX_VIDEO_CodingUnused; - } else { - for (index = 0; index < arrCompressionFormat.size(); index++) { - if (arrCompressionFormat[index] == eCompressionFormat) { - portFormat.eCompressionFormat = arrCompressionFormat[index]; - break; - } - } - if (index == arrCompressionFormat.size()) { - ALOGE("setting default compression format %x", - (int)arrCompressionFormat[0]); - portFormat.eCompressionFormat = arrCompressionFormat[0]; - } - portFormat.eColorFormat = OMX_COLOR_FormatUnused; - } - portFormat.nIndex = 0; - portFormat.xFramerate = xFramerate; - status = setPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex, - &portFormat); - return status; -} - void enumerateProfileAndLevel(sp omxNode, OMX_U32 portIndex, std::vector* arrProfile, std::vector* arrLevel) { diff --git a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h index e4927792e3..e6a61d4a8f 100644 --- a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h @@ -17,20 +17,10 @@ #ifndef MEDIA_VIDEO_HIDL_TEST_COMMON_H #define MEDIA_VIDEO_HIDL_TEST_COMMON_H -/* - * Random Index used for monkey testing while get/set parameters - */ -#define RANDOM_INDEX 1729 /* * Common video utils */ - -Return setVideoPortFormat( - sp omxNode, OMX_U32 portIndex, - OMX_VIDEO_CODINGTYPE eCompressionFormat, OMX_COLOR_FORMATTYPE eColorFormat, - OMX_U32 xFramerate); - void enumerateProfileAndLevel(sp omxNode, OMX_U32 portIndex, std::vector* arrProfile, std::vector* arrLevel); From 335d3d98594e84230a423594e7039a5f3dc4cac7 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Thu, 22 Jun 2017 18:18:51 +0530 Subject: [PATCH 018/265] bug fix: handle portReconfiguration in testEOS() When CSD and sync frame are sent together, component parses the CSD and allocates buffers internal to the codec and decodes the frame sent and port reconfiguration event is sent to the client. Now if this is the only frame in the sequence, the client reaches testEOS(). But port reconfiguration is not handled here. This is corrected. bug: 62930419 Change-Id: Ic0c7625e3c2b415330f37734663f0cf7689e8734 --- .../VtsHalMediaOmxV1_0TargetAudioDecTest.cpp | 44 +++++++++++++------ .../common/media_hidl_test_common.cpp | 14 +++++- .../common/media_hidl_test_common.h | 9 +++- .../VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 22 ++++++---- 4 files changed, 65 insertions(+), 24 deletions(-) diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp index 031584bc67..0c698da11d 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp @@ -474,15 +474,20 @@ void GetURLForComponent(AudioDecHidlTest::standardComp comp, char* mURL, // port settings reconfiguration during runtime. reconfigures sample rate and // number +typedef struct { + OMX_AUDIO_CODINGTYPE eEncoding; + AudioDecHidlTest::standardComp comp; +} packedArgs; void portReconfiguration(sp omxNode, sp observer, android::Vector* iBuffer, android::Vector* oBuffer, - OMX_AUDIO_CODINGTYPE eEncoding, OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, - Message msg, - AudioDecHidlTest::standardComp comp = - AudioDecHidlTest::standardComp::unknown_comp) { + Message msg, PortMode oPortMode, void* args) { android::hardware::media::omx::V1_0::Status status; + packedArgs* audioArgs = static_cast(args); + OMX_AUDIO_CODINGTYPE eEncoding = audioArgs->eEncoding; + AudioDecHidlTest::standardComp comp = audioArgs->comp; + (void)oPortMode; if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { ASSERT_EQ(msg.data.eventData.data1, kPortIndexOutput); @@ -580,8 +585,10 @@ void waitOnInputConsumption(sp omxNode, sp observer, observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); if (status == android::hardware::media::omx::V1_0::Status::OK) { EXPECT_EQ(msg.type, Message::Type::EVENT); - portReconfiguration(omxNode, observer, iBuffer, oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, msg, comp); + packedArgs audioArgs = {eEncoding, comp}; + portReconfiguration(omxNode, observer, iBuffer, oBuffer, + kPortIndexInput, kPortIndexOutput, msg, + PortMode::PRESET_BYTE_BUFFER, &audioArgs); } // status == TIMED_OUT, it could be due to process time being large // than DEFAULT_TIMEOUT or component needs output buffers to start @@ -645,8 +652,10 @@ void decodeNFrames(sp omxNode, sp observer, // Port Reconfiguration if (status == android::hardware::media::omx::V1_0::Status::OK && msg.type == Message::Type::EVENT) { - portReconfiguration(omxNode, observer, iBuffer, oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, msg, comp); + packedArgs audioArgs = {eEncoding, comp}; + portReconfiguration(omxNode, observer, iBuffer, oBuffer, + kPortIndexInput, kPortIndexOutput, msg, + PortMode::PRESET_BYTE_BUFFER, &audioArgs); } if (frameID == (int)Info->size() || frameID == (offset + range)) break; @@ -791,7 +800,9 @@ TEST_F(AudioDecHidlTest, DecodeTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, kPortIndexOutput, compName); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); + packedArgs audioArgs = {eEncoding, compName}; + testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs); EXPECT_EQ(timestampUslist.empty(), true); // set state to idle changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); @@ -847,7 +858,9 @@ TEST_F(AudioDecHidlTest, DISABLED_EOSTest_M) { changeStateIdletoExecute(omxNode, observer); // request EOS at the start - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag); + packedArgs audioArgs = {eEncoding, compName}; + testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); EXPECT_GE(framesReceived, 0U); @@ -935,7 +948,9 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, kPortIndexOutput, compName); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); + packedArgs audioArgs = {eEncoding, compName}; + testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); EXPECT_GE(framesReceived, 1U); @@ -951,7 +966,8 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, kPortIndexOutput, compName); - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag); + testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); EXPECT_GE(framesReceived, 1U); @@ -1036,7 +1052,9 @@ TEST_F(AudioDecHidlTest, SimpleEOSTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, kPortIndexOutput, compName); - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag); + packedArgs audioArgs = {eEncoding, compName}; + testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); framesReceived = 0; diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp index d30a75c406..1863972e14 100755 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp @@ -513,7 +513,8 @@ void flushPorts(sp omxNode, sp observer, void testEOS(sp omxNode, sp observer, android::Vector* iBuffer, android::Vector* oBuffer, bool signalEOS, - bool& eosFlag, PortMode* portMode) { + bool& eosFlag, PortMode* portMode, portreconfig fptr, + OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, void* args) { android::hardware::media::omx::V1_0::Status status; PortMode defaultPortMode[2], *pm; @@ -550,7 +551,16 @@ void testEOS(sp omxNode, sp observer, status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); if (status == android::hardware::media::omx::V1_0::Status::OK) { - if (msg.data.eventData.event == OMX_EventBufferFlag) { + if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { + if (fptr) { + (*fptr)(omxNode, observer, iBuffer, oBuffer, + kPortIndexInput, kPortIndexOutput, msg, pm[1], + args); + } else { + // something unexpected happened + EXPECT_TRUE(false); + } + } else if (msg.data.eventData.event == OMX_EventBufferFlag) { // soft omx components donot send this, we will just ignore it // for now } else { diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h index c0e03f63d6..95e32fa18f 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h @@ -312,9 +312,16 @@ void flushPorts(sp omxNode, sp observer, android::Vector* oBuffer, OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, int64_t timeoutUs = DEFAULT_TIMEOUT); +typedef void (*portreconfig)(sp omxNode, sp observer, + android::Vector* iBuffer, + android::Vector* oBuffer, + OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, + Message msg, PortMode oPortMode, void* args); void testEOS(sp omxNode, sp observer, android::Vector* iBuffer, android::Vector* oBuffer, bool signalEOS, - bool& eosFlag, PortMode* portMode = nullptr); + bool& eosFlag, PortMode* portMode = nullptr, + portreconfig fptr = nullptr, OMX_U32 kPortIndexInput = 0, + OMX_U32 kPortIndexOutput = 1, void* args = nullptr); #endif // MEDIA_HIDL_TEST_COMMON_H diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index 2ff8ed3be0..53ffc599ba 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -474,8 +474,9 @@ void portReconfiguration(sp omxNode, sp observer, android::Vector* iBuffer, android::Vector* oBuffer, OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, - Message msg, PortMode oPortMode) { + Message msg, PortMode oPortMode, void* args) { android::hardware::media::omx::V1_0::Status status; + (void)args; if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { ASSERT_EQ(msg.data.eventData.data1, kPortIndexOutput); @@ -602,7 +603,7 @@ void waitOnInputConsumption(sp omxNode, sp observer, EXPECT_EQ(msg.type, Message::Type::EVENT); portReconfiguration(omxNode, observer, iBuffer, oBuffer, kPortIndexInput, kPortIndexOutput, msg, - oPortMode); + oPortMode, nullptr); } // status == TIMED_OUT, it could be due to process time being large // than DEFAULT_TIMEOUT or component needs output buffers to start @@ -668,7 +669,7 @@ void decodeNFrames(sp omxNode, sp observer, msg.type == Message::Type::EVENT) { portReconfiguration(omxNode, observer, iBuffer, oBuffer, kPortIndexInput, kPortIndexOutput, msg, - oPortMode); + oPortMode, nullptr); } if (frameID == (int)Info->size() || frameID == (offset + range)) break; @@ -834,7 +835,8 @@ TEST_F(VideoDecHidlTest, DecodeTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput, portMode[1]); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode); + testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); EXPECT_EQ(timestampUslist.empty(), true); // set state to idle changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); @@ -884,7 +886,8 @@ TEST_F(VideoDecHidlTest, EOSTest_M) { changeStateIdletoExecute(omxNode, observer); // request EOS at the start - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode); + testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); EXPECT_GE(framesReceived, 0U); @@ -968,7 +971,8 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput, portMode[1]); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode); + testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); EXPECT_GE(framesReceived, 1U); @@ -983,7 +987,8 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput, portMode[1]); - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode); + testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); EXPECT_GE(framesReceived, 1U); @@ -1066,7 +1071,8 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput, portMode[1]); - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode); + testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); framesReceived = 0; From a04a913c7751b2cb63ee587a7430f3008b325c6a Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Tue, 27 Jun 2017 10:54:54 -0700 Subject: [PATCH 019/265] Fix missing includes in camera.common Test: mma -j BOARD_VNDK_VERSION=current Bug: 33241851 Change-Id: I471f05cf66e4c8532c428f9894fa4642139e03e2 --- camera/common/1.0/default/CameraParameters.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/camera/common/1.0/default/CameraParameters.cpp b/camera/common/1.0/default/CameraParameters.cpp index d224483c75..e707b0855a 100644 --- a/camera/common/1.0/default/CameraParameters.cpp +++ b/camera/common/1.0/default/CameraParameters.cpp @@ -20,6 +20,7 @@ #include #include +#include #include "CameraParameters.h" #include From 0255501b335ae660a7b68f9152e6b9bb8d72a56e Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Wed, 28 Jun 2017 13:35:28 -0700 Subject: [PATCH 020/265] Resolve differences in IRadio Test: branches are the same Bug: 62999900 Change-Id: I67fe8b95ab81638563faba6fff43e5f60dc2aca5 --- radio/1.1/types.hal | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/radio/1.1/types.hal b/radio/1.1/types.hal index a8d836c88c..93d5d44a1c 100644 --- a/radio/1.1/types.hal +++ b/radio/1.1/types.hal @@ -176,26 +176,6 @@ struct NetworkScanResult { vec networkInfos; // List of network information as CellInfo }; -struct ImsiEncryptionInfo { - string mcc; // MCC of the Carrier. - string mnc; // MNC of the Carrier. - vec carrierKey; // Carrier specific key to be used for encryption. It must - // be opaque to the framework. This is the byte-stream - // representation of the key. This is an external encoded - // form for the key used when a standard representation of - // the key is needed outside the Java Virtual Machine, as - // when transmitting the key to some other party. - // The key is encoded according to a standard format - // (such as X.509 SubjectPublicKeyInfo or PKCS#8), and is - // returned using the getEncoded method as defined on the - // java.security.Key interface. - string keyIdentifier; // This is an opaque value we're given by the carrier - // and is returned to the carrier. This is used by the server to - // help it locate the private key to decrypt the permanent - // identity. - int64_t expirationTime; // date-time in UTC when the key will expire. -}; - struct KeepaliveRequest { KeepaliveType type; // The format of the keepalive packet vec sourceAddress; // source address with type = family, in network @@ -216,3 +196,23 @@ struct KeepaliveStatus { int32_t sessionHandle; // the sessionHandle provided by the api KeepaliveStatusCode code; // status for the given keepalive }; + +struct ImsiEncryptionInfo { + string mcc; // MCC of the Carrier. + string mnc; // MNC of the Carrier. + vec carrierKey; // Carrier specific key to be used for encryption. It must + // be opaque to the framework. This is the byte-stream + // representation of the key. This is an external encoded + // form for the key used when a standard representation of + // the key is needed outside the Java Virtual Machine, as + // when transmitting the key to some other party. + // The key is encoded according to a standard format + // (such as X.509 SubjectPublicKeyInfo or PKCS#8), and is + // returned using the getEncoded method as defined on the + // java.security.Key interface. + string keyIdentifier; // This is an opaque value we're given by the carrier + // and is returned to the carrier. This is used by the server to + // help it locate the private key to decrypt the permanent + // identity. + int64_t expirationTime; // date-time in UTC when the key will expire. +}; From 4837755ce9c8d36223e95af7b92dad9095385533 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Thu, 22 Jun 2017 10:45:33 -0700 Subject: [PATCH 021/265] Initial Broadcast Radio HAL 1.1 default implementation. The new implementation does not rely on legacy HAL, it implements HAL 1.1 directly instead. This is not a full implementation yet, but passes all existing tests. Bug: b/36864090 Test: VTS, instrumentalization, Unit Change-Id: Ic8eddd19d0bf6777b4086d099183d71e05d7da0e --- broadcastradio/1.1/default/Android.bp | 8 +- broadcastradio/1.1/default/BroadcastRadio.cpp | 217 +++++----- broadcastradio/1.1/default/BroadcastRadio.h | 67 ++-- .../1.1/default/BroadcastRadioFactory.cpp | 44 +- .../1.1/default/BroadcastRadioFactory.h | 14 +- broadcastradio/1.1/default/Tuner.cpp | 378 +++++++++++------- broadcastradio/1.1/default/Tuner.h | 43 +- broadcastradio/1.1/default/Utils.cpp | 299 -------------- broadcastradio/1.1/default/Utils.h | 58 --- broadcastradio/1.1/default/VirtualProgram.cpp | 32 ++ broadcastradio/1.1/default/VirtualProgram.h | 39 ++ broadcastradio/1.1/default/VirtualRadio.cpp | 61 +++ broadcastradio/1.1/default/VirtualRadio.h | 51 +++ broadcastradio/1.1/tests/Android.bp | 28 ++ .../1.1/tests/WorkerThread_test.cpp | 138 +++++++ broadcastradio/1.1/utils/Android.bp | 30 ++ broadcastradio/1.1/utils/WorkerThread.cpp | 89 +++++ broadcastradio/1.1/utils/WorkerThread.h | 51 +++ .../VtsHalBroadcastradioV1_1TargetTest.cpp | 18 +- broadcastradio/Android.bp | 2 + 20 files changed, 976 insertions(+), 691 deletions(-) delete mode 100644 broadcastradio/1.1/default/Utils.cpp delete mode 100644 broadcastradio/1.1/default/Utils.h create mode 100644 broadcastradio/1.1/default/VirtualProgram.cpp create mode 100644 broadcastradio/1.1/default/VirtualProgram.h create mode 100644 broadcastradio/1.1/default/VirtualRadio.cpp create mode 100644 broadcastradio/1.1/default/VirtualRadio.h create mode 100644 broadcastradio/1.1/tests/Android.bp create mode 100644 broadcastradio/1.1/tests/WorkerThread_test.cpp create mode 100644 broadcastradio/1.1/utils/Android.bp create mode 100644 broadcastradio/1.1/utils/WorkerThread.cpp create mode 100644 broadcastradio/1.1/utils/WorkerThread.h diff --git a/broadcastradio/1.1/default/Android.bp b/broadcastradio/1.1/default/Android.bp index 759eb09118..bec8524a0b 100644 --- a/broadcastradio/1.1/default/Android.bp +++ b/broadcastradio/1.1/default/Android.bp @@ -27,16 +27,18 @@ cc_library_shared { "BroadcastRadio.cpp", "BroadcastRadioFactory.cpp", "Tuner.cpp", - "Utils.cpp", + "VirtualProgram.cpp", + "VirtualRadio.cpp", + ], + static_libs: [ + "android.hardware.broadcastradio@1.1-utils-lib", ], shared_libs: [ "libhidlbase", "libhidltransport", "libutils", "liblog", - "libhardware", "android.hardware.broadcastradio@1.0", "android.hardware.broadcastradio@1.1", - "libradio_metadata", ], } diff --git a/broadcastradio/1.1/default/BroadcastRadio.cpp b/broadcastradio/1.1/default/BroadcastRadio.cpp index d65fe6d63b..3aac127afa 100644 --- a/broadcastradio/1.1/default/BroadcastRadio.cpp +++ b/broadcastradio/1.1/default/BroadcastRadio.cpp @@ -13,14 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#define LOG_TAG "BroadcastRadio" -//#define LOG_NDEBUG 0 - -#include +#define LOG_TAG "BroadcastRadioDefault.module" +#define LOG_NDEBUG 0 #include "BroadcastRadio.h" -#include "Tuner.h" -#include "Utils.h" + +#include namespace android { namespace hardware { @@ -28,125 +26,126 @@ namespace broadcastradio { namespace V1_1 { namespace implementation { -using ::android::sp; +using V1_0::Band; +using V1_0::BandConfig; +using V1_0::Class; +using V1_0::Deemphasis; +using V1_0::Rds; + +using std::lock_guard; +using std::map; +using std::mutex; +using std::vector; + +// clang-format off +static const map gModuleConfigs{ + {Class::AM_FM, ModuleConfig({ + "Digital radio mock", + { // amFmBands + AmFmBandConfig({ + Band::AM_HD, + 540, // lowerLimit + 1610, // upperLimit + 10, // spacing + }), + AmFmBandConfig({ + Band::FM_HD, + 87900, // lowerLimit + 107900, // upperLimit + 200, // spacing + }), + }, + })}, + + {Class::SAT, ModuleConfig({ + "Satellite radio mock", + {}, // amFmBands + })}, +}; +// clang-format on BroadcastRadio::BroadcastRadio(Class classId) - : mStatus(Result::NOT_INITIALIZED), mClassId(classId), mHwDevice(NULL) -{ + : mClassId(classId), mConfig(gModuleConfigs.at(classId)) {} + +bool BroadcastRadio::isSupported(Class classId) { + return gModuleConfigs.find(classId) != gModuleConfigs.end(); } -BroadcastRadio::~BroadcastRadio() -{ - if (mHwDevice != NULL) { - radio_hw_device_close(mHwDevice); - } -} - -void BroadcastRadio::onFirstRef() -{ - const hw_module_t *mod; - int rc; - ALOGI("%s mClassId %d", __FUNCTION__, mClassId); - - mHwDevice = NULL; - const char *classString = Utils::getClassString(mClassId); - if (classString == NULL) { - ALOGE("invalid class ID %d", mClassId); - mStatus = Result::INVALID_ARGUMENTS; - return; - } - - ALOGI("%s RADIO_HARDWARE_MODULE_ID %s %s", - __FUNCTION__, RADIO_HARDWARE_MODULE_ID, classString); - - rc = hw_get_module_by_class(RADIO_HARDWARE_MODULE_ID, classString, &mod); - if (rc != 0) { - ALOGE("couldn't load radio module %s.%s (%s)", - RADIO_HARDWARE_MODULE_ID, classString, strerror(-rc)); - return; - } - rc = radio_hw_device_open(mod, &mHwDevice); - if (rc != 0) { - ALOGE("couldn't open radio hw device in %s.%s (%s)", - RADIO_HARDWARE_MODULE_ID, "primary", strerror(-rc)); - mHwDevice = NULL; - return; - } - if (mHwDevice->common.version != RADIO_DEVICE_API_VERSION_CURRENT) { - ALOGE("wrong radio hw device version %04x", mHwDevice->common.version); - radio_hw_device_close(mHwDevice); - mHwDevice = NULL; - } else { - mStatus = Result::OK; - } -} - -int BroadcastRadio::closeHalTuner(const struct radio_tuner *halTuner) -{ - ALOGV("%s", __FUNCTION__); - if (mHwDevice == NULL) { - return -ENODEV; - } - if (halTuner == 0) { - return -EINVAL; - } - return mHwDevice->close_tuner(mHwDevice, halTuner); -} - - -// Methods from ::android::hardware::broadcastradio::V1_1::IBroadcastRadio follow. -Return BroadcastRadio::getProperties(getProperties_cb _hidl_cb) -{ - int rc; - radio_hal_properties_t halProperties; - Properties properties; - - if (mHwDevice == NULL) { - rc = -ENODEV; - goto exit; - } - rc = mHwDevice->get_properties(mHwDevice, &halProperties); - if (rc == 0) { - Utils::convertPropertiesFromHal(&properties, &halProperties); - } - -exit: - _hidl_cb(Utils::convertHalResult(rc), properties); - return Void(); +Return BroadcastRadio::getProperties(getProperties_cb _hidl_cb) { + ALOGV("%s", __func__); + return getProperties_1_1( + [&](const Properties& properties) { _hidl_cb(Result::OK, properties.base); }); } Return BroadcastRadio::getProperties_1_1(getProperties_1_1_cb _hidl_cb) { - radio_hal_properties_t halProperties; - V1_1::Properties properties = {}; + ALOGV("%s", __func__); + Properties prop11 = {}; + auto& prop10 = prop11.base; - LOG_ALWAYS_FATAL_IF(mHwDevice == nullptr, "HW device is not set"); - int rc = mHwDevice->get_properties(mHwDevice, &halProperties); - LOG_ALWAYS_FATAL_IF(rc != 0, "Couldn't get device properties"); - Utils::convertPropertiesFromHal(&properties.base, &halProperties); + prop10.classId = mClassId; + prop10.implementor = "Google"; + prop10.product = mConfig.productName; + prop10.numTuners = 1; + prop10.numAudioSources = 1; + prop10.supportsCapture = false; + prop11.supportsBackgroundScanning = false; + prop11.vendorExension = "dummy"; - _hidl_cb(properties); - return Void(); -} + prop10.bands.resize(mConfig.amFmBands.size()); + for (size_t i = 0; i < mConfig.amFmBands.size(); i++) { + auto& src = mConfig.amFmBands[i]; + auto& dst = prop10.bands[i]; -Return BroadcastRadio::openTuner(const BandConfig& config, bool audio, - const sp& callback, openTuner_cb _hidl_cb) -{ - sp tunerImpl = new Tuner(callback, this); + dst.type = src.type; + dst.antennaConnected = true; + dst.lowerLimit = src.lowerLimit; + dst.upperLimit = src.upperLimit; + dst.spacings = vector({src.spacing}); - radio_hal_band_config_t halConfig; - const struct radio_tuner *halTuner; - Utils::convertBandConfigToHal(&halConfig, &config); - int rc = mHwDevice->open_tuner(mHwDevice, &halConfig, audio, Tuner::callback, - tunerImpl.get(), &halTuner); - if (rc == 0) { - tunerImpl->setHalTuner(halTuner); + if (src.type == Band::AM) { + dst.ext.am.stereo = true; + } else if (src.type == Band::FM) { + dst.ext.fm.deemphasis = Deemphasis::D75; + dst.ext.fm.stereo = true; + dst.ext.fm.rds = Rds::US; + dst.ext.fm.ta = true; + dst.ext.fm.af = true; + dst.ext.fm.ea = true; + } } - _hidl_cb(Utils::convertHalResult(rc), tunerImpl); + _hidl_cb(prop11); return Void(); } -} // namespace implementation +Return BroadcastRadio::openTuner(const BandConfig& config, bool audio __unused, + const sp& callback, + openTuner_cb _hidl_cb) { + ALOGV("%s", __func__); + lock_guard lk(mMut); + + auto oldTuner = mTuner.promote(); + if (oldTuner != nullptr) { + ALOGI("Force-closing previously opened tuner"); + oldTuner->forceClose(); + mTuner = nullptr; + } + + sp newTuner = new Tuner(callback); + mTuner = newTuner; + if (mClassId == Class::AM_FM) { + auto ret = newTuner->setConfiguration(config); + if (ret != Result::OK) { + _hidl_cb(Result::INVALID_ARGUMENTS, {}); + return Void(); + } + } + + _hidl_cb(Result::OK, newTuner); + return Void(); +} + +} // namespace implementation } // namespace V1_1 } // namespace broadcastradio } // namespace hardware diff --git a/broadcastradio/1.1/default/BroadcastRadio.h b/broadcastradio/1.1/default/BroadcastRadio.h index 7de31a07cb..d98afa7acb 100644 --- a/broadcastradio/1.1/default/BroadcastRadio.h +++ b/broadcastradio/1.1/default/BroadcastRadio.h @@ -16,9 +16,10 @@ #ifndef ANDROID_HARDWARE_BROADCASTRADIO_V1_1_BROADCASTRADIO_H #define ANDROID_HARDWARE_BROADCASTRADIO_V1_1_BROADCASTRADIO_H +#include "Tuner.h" + #include #include -#include namespace android { namespace hardware { @@ -26,42 +27,48 @@ namespace broadcastradio { namespace V1_1 { namespace implementation { -using V1_0::Class; -using V1_0::BandConfig; -using V1_0::Properties; +struct AmFmBandConfig { + V1_0::Band type; + uint32_t lowerLimit; // kHz + uint32_t upperLimit; // kHz + uint32_t spacing; // kHz +}; + +struct ModuleConfig { + std::string productName; + std::vector amFmBands; +}; struct BroadcastRadio : public V1_1::IBroadcastRadio { + /** + * Constructs new broadcast radio module. + * + * Before calling a constructor with a given classId, it must be checked with isSupported + * method first. Otherwise it results in undefined behaviour. + * + * @param classId type of a radio. + */ + BroadcastRadio(V1_0::Class classId); - BroadcastRadio(Class classId); + /** + * Checks, if a given radio type is supported. + * + * @param classId type of a radio. + */ + static bool isSupported(V1_0::Class classId); - // Methods from ::android::hardware::broadcastradio::V1_1::IBroadcastRadio follow. + // V1_1::IBroadcastRadio methods Return getProperties(getProperties_cb _hidl_cb) override; Return getProperties_1_1(getProperties_1_1_cb _hidl_cb) override; - Return openTuner(const BandConfig& config, bool audio, - const sp& callback, openTuner_cb _hidl_cb) override; + Return openTuner(const V1_0::BandConfig& config, bool audio, + const sp& callback, + openTuner_cb _hidl_cb) override; - // RefBase - virtual void onFirstRef() override; - - Result initCheck() { return mStatus; } - int closeHalTuner(const struct radio_tuner *halTuner); - -private: - virtual ~BroadcastRadio(); - - static const char * sClassModuleNames[]; - - Result convertHalResult(int rc); - void convertBandConfigFromHal(BandConfig *config, - const radio_hal_band_config_t *halConfig); - void convertPropertiesFromHal(Properties *properties, - const radio_hal_properties_t *halProperties); - void convertBandConfigToHal(radio_hal_band_config_t *halConfig, - const BandConfig *config); - - Result mStatus; - Class mClassId; - struct radio_hw_device *mHwDevice; + private: + std::mutex mMut; + V1_0::Class mClassId; + ModuleConfig mConfig; + wp mTuner; }; } // namespace implementation diff --git a/broadcastradio/1.1/default/BroadcastRadioFactory.cpp b/broadcastradio/1.1/default/BroadcastRadioFactory.cpp index c8b6c39f54..c2c1158618 100644 --- a/broadcastradio/1.1/default/BroadcastRadioFactory.cpp +++ b/broadcastradio/1.1/default/BroadcastRadioFactory.cpp @@ -13,29 +13,51 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#define LOG_TAG "BroadcastRadioDefault.factory" +#define LOG_NDEBUG 0 + #include "BroadcastRadioFactory.h" + #include "BroadcastRadio.h" +#include + namespace android { namespace hardware { namespace broadcastradio { namespace V1_1 { namespace implementation { -// Methods from ::android::hardware::broadcastradio::V1_0::IBroadcastRadioFactory follow. -Return BroadcastRadioFactory::connectModule(Class classId, connectModule_cb _hidl_cb) { - sp impl = new BroadcastRadio(classId); - Result retval = Result::NOT_INITIALIZED; - if (impl != 0) { - retval = impl->initCheck(); - } - _hidl_cb(retval, impl); - return Void(); +using V1_0::Class; + +using std::vector; + +static const vector gAllClasses = { + Class::AM_FM, Class::SAT, Class::DT, +}; + +IBroadcastRadioFactory* HIDL_FETCH_IBroadcastRadioFactory(const char* name __unused) { + return new BroadcastRadioFactory(); } +BroadcastRadioFactory::BroadcastRadioFactory() { + for (auto&& classId : gAllClasses) { + if (!BroadcastRadio::isSupported(classId)) continue; + mRadioModules[classId] = new BroadcastRadio(classId); + } +} -IBroadcastRadioFactory* HIDL_FETCH_IBroadcastRadioFactory(const char* /* name */) { - return new BroadcastRadioFactory(); +Return BroadcastRadioFactory::connectModule(Class classId, connectModule_cb _hidl_cb) { + ALOGV("%s", __func__); + + auto moduleIt = mRadioModules.find(classId); + if (moduleIt == mRadioModules.end()) { + _hidl_cb(Result::INVALID_ARGUMENTS, nullptr); + } else { + _hidl_cb(Result::OK, moduleIt->second); + } + + return Void(); } } // namespace implementation diff --git a/broadcastradio/1.1/default/BroadcastRadioFactory.h b/broadcastradio/1.1/default/BroadcastRadioFactory.h index 8eb851485a..8b67ac3637 100644 --- a/broadcastradio/1.1/default/BroadcastRadioFactory.h +++ b/broadcastradio/1.1/default/BroadcastRadioFactory.h @@ -16,6 +16,7 @@ #ifndef ANDROID_HARDWARE_BROADCASTRADIO_V1_1_BROADCASTRADIOFACTORY_H #define ANDROID_HARDWARE_BROADCASTRADIO_V1_1_BROADCASTRADIOFACTORY_H +#include #include #include @@ -25,14 +26,17 @@ namespace broadcastradio { namespace V1_1 { namespace implementation { -using V1_0::Class; +extern "C" IBroadcastRadioFactory* HIDL_FETCH_IBroadcastRadioFactory(const char* name); struct BroadcastRadioFactory : public IBroadcastRadioFactory { - // Methods from ::android::hardware::broadcastradio::V1_0::IBroadcastRadioFactory follow. - Return connectModule(Class classId, connectModule_cb _hidl_cb) override; -}; + BroadcastRadioFactory(); -extern "C" IBroadcastRadioFactory* HIDL_FETCH_IBroadcastRadioFactory(const char* name); + // V1_0::IBroadcastRadioFactory methods + Return connectModule(V1_0::Class classId, connectModule_cb _hidl_cb) override; + + private: + std::map> mRadioModules; +}; } // namespace implementation } // namespace V1_1 diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index ae5848cec7..64d8b89613 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -14,15 +14,13 @@ * limitations under the License. */ -#define LOG_TAG "Tuner" -//#define LOG_NDEBUG 0 - -#include +#define LOG_TAG "BroadcastRadioDefault.tuner" +#define LOG_NDEBUG 0 #include "BroadcastRadio.h" #include "Tuner.h" -#include "Utils.h" -#include + +#include namespace android { namespace hardware { @@ -30,199 +28,283 @@ namespace broadcastradio { namespace V1_1 { namespace implementation { -void Tuner::onCallback(radio_hal_event_t *halEvent) -{ - BandConfig config; - ProgramInfo info; - hidl_vec metadata; +using namespace std::chrono_literals; - if (mCallback != 0) { - switch(halEvent->type) { - case RADIO_EVENT_CONFIG: - Utils::convertBandConfigFromHal(&config, &halEvent->config); - mCallback->configChange(Utils::convertHalResult(halEvent->status), config); - break; - case RADIO_EVENT_ANTENNA: - mCallback->antennaStateChange(halEvent->on); - break; - case RADIO_EVENT_TUNED: - Utils::convertProgramInfoFromHal(&info, &halEvent->info); - if (mCallback1_1 != nullptr) { - mCallback1_1->tuneComplete_1_1(Utils::convertHalResult(halEvent->status), info); - } - mCallback->tuneComplete(Utils::convertHalResult(halEvent->status), info.base); - break; - case RADIO_EVENT_METADATA: { - uint32_t channel; - uint32_t sub_channel; - if (radio_metadata_get_channel(halEvent->metadata, &channel, &sub_channel) == 0) { - Utils::convertMetaDataFromHal(metadata, halEvent->metadata); - mCallback->newMetadata(channel, sub_channel, metadata); - } - } break; - case RADIO_EVENT_TA: - mCallback->trafficAnnouncement(halEvent->on); - break; - case RADIO_EVENT_AF_SWITCH: - Utils::convertProgramInfoFromHal(&info, &halEvent->info); - if (mCallback1_1 != nullptr) { - mCallback1_1->afSwitch_1_1(info); - } - mCallback->afSwitch(info.base); - break; - case RADIO_EVENT_EA: - mCallback->emergencyAnnouncement(halEvent->on); - break; - case RADIO_EVENT_HW_FAILURE: - default: - mCallback->hardwareFailure(); - break; - } - } +using V1_0::Band; +using V1_0::BandConfig; +using V1_0::Direction; + +using std::chrono::milliseconds; +using std::lock_guard; +using std::move; +using std::mutex; +using std::sort; +using std::vector; + +const struct { + milliseconds config = 50ms; + milliseconds scan = 200ms; + milliseconds step = 100ms; + milliseconds tune = 150ms; +} gDefaultDelay; + +Tuner::Tuner(const sp& callback) + : mCallback(callback), + mCallback1_1(ITunerCallback::castFrom(callback).withDefault(nullptr)), + mVirtualFm(make_fm_radio()) {} + +void Tuner::forceClose() { + lock_guard lk(mMut); + mIsClosed = true; + mThread.cancelAll(); } -//static -void Tuner::callback(radio_hal_event_t *halEvent, void *cookie) -{ - wp weak(reinterpret_cast(cookie)); - sp tuner = weak.promote(); - if (tuner == 0) return; - tuner->onCallback(halEvent); +Return Tuner::setConfiguration(const BandConfig& config) { + ALOGV("%s", __func__); + + if (config.lowerLimit >= config.upperLimit) return Result::INVALID_ARGUMENTS; + + auto task = [this, config]() { + ALOGI("Setting AM/FM config"); + lock_guard lk(mMut); + + mAmfmConfig = move(config); + mAmfmConfig.antennaConnected = true; + mIsAmfmConfigSet = true; + mCallback->configChange(Result::OK, mAmfmConfig); + }; + mThread.schedule(task, gDefaultDelay.config); + + return Result::OK; } -Tuner::Tuner(const sp& callback, const wp& parentDevice) - : mHalTuner(NULL), mCallback(callback), mCallback1_1(ITunerCallback::castFrom(callback)), - mParentDevice(parentDevice) -{ - ALOGV("%s", __FUNCTION__); -} +Return Tuner::getConfiguration(getConfiguration_cb _hidl_cb) { + ALOGV("%s", __func__); - -Tuner::~Tuner() -{ - ALOGV("%s", __FUNCTION__); - const sp parentDevice = mParentDevice.promote(); - if (parentDevice != 0) { - parentDevice->closeHalTuner(mHalTuner); + lock_guard lk(mMut); + if (mIsAmfmConfigSet) { + _hidl_cb(Result::OK, mAmfmConfig); + } else { + _hidl_cb(Result::NOT_INITIALIZED, {}); } -} - -// Methods from ::android::hardware::broadcastradio::V1_1::ITuner follow. -Return Tuner::setConfiguration(const BandConfig& config) { - ALOGV("%s", __FUNCTION__); - if (mHalTuner == NULL) { - return Utils::convertHalResult(-ENODEV); - } - radio_hal_band_config_t halConfig; - Utils::convertBandConfigToHal(&halConfig, &config); - int rc = mHalTuner->set_configuration(mHalTuner, &halConfig); - return Utils::convertHalResult(rc); -} - -Return Tuner::getConfiguration(getConfiguration_cb _hidl_cb) { - int rc; - radio_hal_band_config_t halConfig; - BandConfig config; - - ALOGV("%s", __FUNCTION__); - if (mHalTuner == NULL) { - rc = -ENODEV; - goto exit; - } - rc = mHalTuner->get_configuration(mHalTuner, &halConfig); - if (rc == 0) { - Utils::convertBandConfigFromHal(&config, &halConfig); - } - -exit: - _hidl_cb(Utils::convertHalResult(rc), config); return Void(); } -Return Tuner::scan(Direction direction, bool skipSubChannel) { - if (mHalTuner == NULL) { - return Utils::convertHalResult(-ENODEV); - } - int rc = mHalTuner->scan(mHalTuner, static_cast(direction), skipSubChannel); - return Utils::convertHalResult(rc); +// makes ProgramInfo that points to no channel +static ProgramInfo makeDummyProgramInfo(uint32_t channel) { + ProgramInfo info11 = {}; + auto& info10 = info11.base; + + info10.channel = channel; + info11.flags |= ProgramInfoFlags::MUTED; + + return info11; } -Return Tuner::step(Direction direction, bool skipSubChannel) { - if (mHalTuner == NULL) { - return Utils::convertHalResult(-ENODEV); +void Tuner::tuneInternalLocked() { + VirtualRadio* virtualRadio = nullptr; + if (mAmfmConfig.type == Band::FM_HD || mAmfmConfig.type == Band::FM) { + virtualRadio = &mVirtualFm; } - int rc = mHalTuner->step(mHalTuner, static_cast(direction), skipSubChannel); - return Utils::convertHalResult(rc); + + auto& info11 = mCurrentProgramInfo; + auto& info10 = info11.base; + + VirtualProgram virtualProgram; + if (virtualRadio != nullptr && virtualRadio->getProgram(mCurrentProgram, virtualProgram)) { + // TODO(b/36864090): convert virtualProgram to ProgramInfo instead + info10.channel = mCurrentProgram; + info10.tuned = true; + info10.stereo = true; + info10.signalStrength = 100; + } else { + info11 = makeDummyProgramInfo(mCurrentProgram); + } + mIsTuneCompleted = true; + + mCallback->tuneComplete(Result::OK, info10); + if (mCallback1_1 != nullptr) { + mCallback1_1->tuneComplete_1_1(Result::OK, info11); + } +} + +Return Tuner::scan(Direction direction, bool skipSubChannel __unused) { + ALOGV("%s", __func__); + lock_guard lk(mMut); + vector list; + + if (mAmfmConfig.type == Band::FM_HD || mAmfmConfig.type == Band::FM) { + list = mVirtualFm.getProgramList(); + } + + if (list.size() == 0) { + mIsTuneCompleted = false; + auto task = [this, direction]() { + ALOGI("Performing failed scan %s", toString(direction).c_str()); + + mCallback->tuneComplete(Result::TIMEOUT, {}); + if (mCallback1_1 != nullptr) { + mCallback1_1->tuneComplete_1_1(Result::TIMEOUT, {}); + } + }; + mThread.schedule(task, gDefaultDelay.scan); + + return Result::OK; + } + + // Not optimal (O(sort) instead of O(n)), but not a big deal here; + // also, it's likely that list is already sorted (so O(n) anyway). + sort(list.begin(), list.end()); + auto current = mCurrentProgram; + auto found = lower_bound(list.begin(), list.end(), VirtualProgram({current})); + if (direction == Direction::UP) { + if (found < list.end() - 1) { + if (found->channel == current) found++; + } else { + found = list.begin(); + } + } else { + if (found > list.begin() && found != list.end()) { + found--; + } else { + found = list.end() - 1; + } + } + auto tuneTo = found->channel; + + mIsTuneCompleted = false; + auto task = [this, tuneTo, direction]() { + ALOGI("Performing scan %s", toString(direction).c_str()); + + lock_guard lk(mMut); + mCurrentProgram = tuneTo; + tuneInternalLocked(); + }; + mThread.schedule(task, gDefaultDelay.scan); + + return Result::OK; +} + +Return Tuner::step(Direction direction, bool skipSubChannel __unused) { + ALOGV("%s", __func__); + + lock_guard lk(mMut); + ALOGW_IF(!mIsAmfmConfigSet, "AM/FM config not set"); + if (!mIsAmfmConfigSet) return Result::INVALID_STATE; + mIsTuneCompleted = false; + + auto task = [this, direction]() { + ALOGI("Performing step %s", toString(direction).c_str()); + + lock_guard lk(mMut); + + if (direction == Direction::UP) { + mCurrentProgram += mAmfmConfig.spacings[0]; + } else { + mCurrentProgram -= mAmfmConfig.spacings[0]; + } + + if (mCurrentProgram > mAmfmConfig.upperLimit) mCurrentProgram = mAmfmConfig.lowerLimit; + if (mCurrentProgram < mAmfmConfig.lowerLimit) mCurrentProgram = mAmfmConfig.upperLimit; + + tuneInternalLocked(); + }; + mThread.schedule(task, gDefaultDelay.step); + + return Result::OK; } Return Tuner::tune(uint32_t channel, uint32_t subChannel) { - if (mHalTuner == NULL) { - return Utils::convertHalResult(-ENODEV); + ALOGV("%s(%d, %d)", __func__, channel, subChannel); + + lock_guard lk(mMut); + ALOGW_IF(!mIsAmfmConfigSet, "AM/FM config not set"); + if (!mIsAmfmConfigSet) return Result::INVALID_STATE; + if (channel < mAmfmConfig.lowerLimit || channel > mAmfmConfig.upperLimit) { + return Result::INVALID_ARGUMENTS; } - int rc = mHalTuner->tune(mHalTuner, channel, subChannel); - return Utils::convertHalResult(rc); + mIsTuneCompleted = false; + + auto task = [this, channel]() { + lock_guard lk(mMut); + mCurrentProgram = channel; + tuneInternalLocked(); + }; + mThread.schedule(task, gDefaultDelay.tune); + + return Result::OK; } Return Tuner::cancel() { - if (mHalTuner == NULL) { - return Utils::convertHalResult(-ENODEV); - } - int rc = mHalTuner->cancel(mHalTuner); - return Utils::convertHalResult(rc); + ALOGV("%s", __func__); + mThread.cancelAll(); + return Result::OK; } Return Tuner::getProgramInformation(getProgramInformation_cb _hidl_cb) { - ALOGV("%s", __FUNCTION__); + ALOGV("%s", __func__); return getProgramInformation_1_1([&](Result result, const ProgramInfo& info) { _hidl_cb(result, info.base); }); } Return Tuner::getProgramInformation_1_1(getProgramInformation_1_1_cb _hidl_cb) { - int rc; - radio_program_info_t halInfo; - RadioMetadataWrapper metadataWrapper(&halInfo.metadata); - ProgramInfo info; + ALOGV("%s", __func__); - ALOGV("%s", __FUNCTION__); - if (mHalTuner == NULL) { - rc = -ENODEV; - goto exit; + lock_guard lk(mMut); + if (mIsTuneCompleted) { + _hidl_cb(Result::OK, mCurrentProgramInfo); + } else { + _hidl_cb(Result::NOT_INITIALIZED, makeDummyProgramInfo(mCurrentProgram)); } - - rc = mHalTuner->get_program_information(mHalTuner, &halInfo); - if (rc == 0) { - Utils::convertProgramInfoFromHal(&info, &halInfo); - } - -exit: - _hidl_cb(Utils::convertHalResult(rc), info); return Void(); } Return Tuner::startBackgroundScan() { + ALOGV("%s", __func__); return ProgramListResult::UNAVAILABLE; } Return Tuner::getProgramList(const hidl_string& filter __unused, getProgramList_cb _hidl_cb) { - hidl_vec pList; - // TODO(b/34054813): do the actual implementation. - _hidl_cb(ProgramListResult::NOT_STARTED, pList); + ALOGV("%s", __func__); + + auto& virtualRadio = mVirtualFm; + if (mAmfmConfig.type != Band::FM_HD && mAmfmConfig.type != Band::FM) { + _hidl_cb(ProgramListResult::OK, {}); + return Void(); + } + + hidl_vec list; + auto vList = virtualRadio.getProgramList(); + list.resize(vList.size()); + for (size_t i = 0; i < vList.size(); i++) { + auto& src = vList[i]; + auto& dst11 = list[i]; + auto& dst10 = dst11.base; + + // TODO(b/36864090): convert virtualProgram to ProgramInfo instead + dst10.channel = src.channel; + dst10.tuned = true; + } + + _hidl_cb(ProgramListResult::OK, list); return Void(); } Return Tuner::isAnalogForced(isAnalogForced_cb _hidl_cb) { - // TODO(b/34348946): do the actual implementation. + ALOGV("%s", __func__); + // TODO(b/36864090): implement _hidl_cb(Result::INVALID_STATE, false); return Void(); } Return Tuner::setAnalogForced(bool isForced __unused) { - // TODO(b/34348946): do the actual implementation. + ALOGV("%s", __func__); + // TODO(b/36864090): implement return Result::INVALID_STATE; } -} // namespace implementation +} // namespace implementation } // namespace V1_1 } // namespace broadcastradio } // namespace hardware diff --git a/broadcastradio/1.1/default/Tuner.h b/broadcastradio/1.1/default/Tuner.h index 57eafd3d7c..7719d4d581 100644 --- a/broadcastradio/1.1/default/Tuner.h +++ b/broadcastradio/1.1/default/Tuner.h @@ -16,6 +16,9 @@ #ifndef ANDROID_HARDWARE_BROADCASTRADIO_V1_1_TUNER_H #define ANDROID_HARDWARE_BROADCASTRADIO_V1_1_TUNER_H +#include "VirtualRadio.h" + +#include #include #include @@ -25,19 +28,16 @@ namespace broadcastradio { namespace V1_1 { namespace implementation { -using V1_0::Direction; - -struct BroadcastRadio; - struct Tuner : public ITuner { + Tuner(const sp& callback); - Tuner(const sp& callback, const wp& mParentDevice); + void forceClose(); - // Methods from ::android::hardware::broadcastradio::V1_1::ITuner follow. - Return setConfiguration(const BandConfig& config) override; + // V1_1::ITuner methods + Return setConfiguration(const V1_0::BandConfig& config) override; Return getConfiguration(getConfiguration_cb _hidl_cb) override; - Return scan(Direction direction, bool skipSubChannel) override; - Return step(Direction direction, bool skipSubChannel) override; + Return scan(V1_0::Direction direction, bool skipSubChannel) override; + Return step(V1_0::Direction direction, bool skipSubChannel) override; Return tune(uint32_t channel, uint32_t subChannel) override; Return cancel() override; Return getProgramInformation(getProgramInformation_cb _hidl_cb) override; @@ -47,21 +47,24 @@ struct Tuner : public ITuner { Return isAnalogForced(isAnalogForced_cb _hidl_cb) override; Return setAnalogForced(bool isForced) override; - static void callback(radio_hal_event_t *halEvent, void *cookie); - void onCallback(radio_hal_event_t *halEvent); + private: + std::mutex mMut; + WorkerThread mThread; + bool mIsClosed = false; // TODO(b/36864090): use it - void setHalTuner(const struct radio_tuner *halTuner) { mHalTuner = halTuner; } - const struct radio_tuner *getHalTuner() { return mHalTuner; } - -private: - ~Tuner(); - - const struct radio_tuner *mHalTuner; const sp mCallback; const sp mCallback1_1; - const wp mParentDevice; -}; + VirtualRadio mVirtualFm; + + bool mIsAmfmConfigSet = false; + V1_0::BandConfig mAmfmConfig; + bool mIsTuneCompleted = false; + uint32_t mCurrentProgram; // TODO(b/32621193): Station Selector + ProgramInfo mCurrentProgramInfo = {}; + + void tuneInternalLocked(); +}; } // namespace implementation } // namespace V1_1 diff --git a/broadcastradio/1.1/default/Utils.cpp b/broadcastradio/1.1/default/Utils.cpp deleted file mode 100644 index e21344ede2..0000000000 --- a/broadcastradio/1.1/default/Utils.cpp +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Copyright (C) 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 "BroadcastRadioHalUtils" -//#define LOG_NDEBUG 0 - -#include -#include - -#include "Utils.h" - -namespace android { -namespace hardware { -namespace broadcastradio { -namespace V1_1 { -namespace implementation { - -using V1_0::Band; -using V1_0::Deemphasis; -using V1_0::Direction; -using V1_0::MetadataKey; -using V1_0::MetadataType; -using V1_0::Rds; - -const char *Utils::sClassModuleNames[] = { - RADIO_HARDWARE_MODULE_ID_FM, /* corresponds to RADIO_CLASS_AM_FM */ - RADIO_HARDWARE_MODULE_ID_SAT, /* corresponds to RADIO_CLASS_SAT */ - RADIO_HARDWARE_MODULE_ID_DT, /* corresponds to RADIO_CLASS_DT */ -}; - -// make sure HIDL enum values are aligned with legacy values -static_assert(RADIO_CLASS_AM_FM == static_cast(Class::AM_FM), - "AM/FM class mismatch with legacy"); -static_assert(RADIO_CLASS_SAT == static_cast(Class::SAT), - "SAT class mismatch with legacy"); -static_assert(RADIO_CLASS_DT == static_cast(Class::DT), - "DT class mismatch with legacy"); - -static_assert(RADIO_BAND_AM == static_cast(Band::AM), - "AM band mismatch with legacy"); -static_assert(RADIO_BAND_FM == static_cast(Band::FM), - "FM band mismatch with legacy"); -static_assert(RADIO_BAND_AM_HD == static_cast(Band::AM_HD), - "AM HD band mismatch with legacy"); -static_assert(RADIO_BAND_FM_HD == static_cast(Band::FM_HD), - "FM HD band mismatch with legacy"); - -static_assert(RADIO_RDS_NONE == static_cast(Rds::NONE), - "RDS NONE mismatch with legacy"); -static_assert(RADIO_RDS_WORLD == static_cast(Rds::WORLD), - "RDS WORLD mismatch with legacy"); -static_assert(RADIO_RDS_US == static_cast(Rds::US), - "RDS US mismatch with legacy"); - -static_assert(RADIO_DEEMPHASIS_50 == static_cast(Deemphasis::D50), - "De-emphasis 50 mismatch with legacy"); -static_assert(RADIO_DEEMPHASIS_75 == static_cast(Deemphasis::D75), - "De-emphasis 75 mismatch with legacy"); - -static_assert(RADIO_DIRECTION_UP == static_cast(Direction::UP), - "Direction Up mismatch with legacy"); -static_assert(RADIO_DIRECTION_DOWN == static_cast(Direction::DOWN), - "Direction Up mismatch with legacy"); - -static_assert(RADIO_METADATA_TYPE_INVALID == static_cast(MetadataType::INVALID), - "Metadata type INVALID mismatch with legacy"); -static_assert(RADIO_METADATA_TYPE_INT == static_cast(MetadataType::INT), - "Metadata type INT mismatch with legacy"); -static_assert(RADIO_METADATA_TYPE_TEXT == static_cast(MetadataType::TEXT), - "Metadata type TEXT mismatch with legacy"); -static_assert(RADIO_METADATA_TYPE_RAW == static_cast(MetadataType::RAW), - "Metadata type RAW mismatch with legacy"); -static_assert(RADIO_METADATA_TYPE_CLOCK == static_cast(MetadataType::CLOCK), - "Metadata type CLOCK mismatch with legacy"); - -static_assert(RADIO_METADATA_KEY_INVALID == static_cast(MetadataKey::INVALID), - "Metadata key INVALID mismatch with legacy"); -static_assert(RADIO_METADATA_KEY_RDS_PI == static_cast(MetadataKey::RDS_PI), - "Metadata key RDS_PI mismatch with legacy"); -static_assert(RADIO_METADATA_KEY_RDS_PS == static_cast(MetadataKey::RDS_PS), - "Metadata key RDS_PS mismatch with legacy"); -static_assert(RADIO_METADATA_KEY_RDS_PTY == static_cast(MetadataKey::RDS_PTY), - "Metadata key RDS_PTY mismatch with legacy"); -static_assert(RADIO_METADATA_KEY_RBDS_PTY == static_cast(MetadataKey::RBDS_PTY), - "Metadata key RBDS_PTY mismatch with legacy"); -static_assert(RADIO_METADATA_KEY_RDS_RT == static_cast(MetadataKey::RDS_RT), - "Metadata key RDS_RT mismatch with legacy"); -static_assert(RADIO_METADATA_KEY_TITLE == static_cast(MetadataKey::TITLE), - "Metadata key TITLE mismatch with legacy"); -static_assert(RADIO_METADATA_KEY_ARTIST == static_cast(MetadataKey::ARTIST), - "Metadata key ARTIST mismatch with legacy"); -static_assert(RADIO_METADATA_KEY_ALBUM == static_cast(MetadataKey::ALBUM), - "Metadata key ALBUM mismatch with legacy"); -static_assert(RADIO_METADATA_KEY_GENRE == static_cast(MetadataKey::GENRE), - "Metadata key GENRE mismatch with legacy"); -static_assert(RADIO_METADATA_KEY_ICON == static_cast(MetadataKey::ICON), - "Metadata key ICON mismatch with legacy"); -static_assert(RADIO_METADATA_KEY_ART == static_cast(MetadataKey::ART), - "Metadata key ART mismatch with legacy"); -static_assert(RADIO_METADATA_KEY_CLOCK == static_cast(MetadataKey::CLOCK), - "Metadata key CLOCK mismatch with legacy"); - - -//static -const char * Utils::getClassString(Class ClassId) -{ - int id = static_cast(ClassId); - - if ((id < 0) || - (id >= NELEM(sClassModuleNames))) { - ALOGE("invalid class ID %d", id); - return NULL; - } - return sClassModuleNames[id]; -} - -//static -Result Utils::convertHalResult(int rc) -{ - switch (rc) { - case 0: - return Result::OK; - case -EINVAL: - return Result::INVALID_ARGUMENTS; - case -ENOSYS: - return Result::INVALID_STATE; - case -ETIMEDOUT: - return Result::TIMEOUT; - case -ENODEV: - default: - return Result::NOT_INITIALIZED; - } -} - -//static -void Utils::convertBandConfigFromHal( - BandConfig *config, - const radio_hal_band_config_t *halConfig) -{ - - config->type = static_cast(halConfig->type); - config->antennaConnected = halConfig->antenna_connected; - config->lowerLimit = halConfig->lower_limit; - config->upperLimit = halConfig->upper_limit; - config->spacings.setToExternal(const_cast(&halConfig->spacings[0]), - halConfig->num_spacings * sizeof(uint32_t)); - // FIXME: transfer buffer ownership. should have a method for that in hidl_vec - config->spacings.resize(halConfig->num_spacings); - - if (config->type == Band::FM) { - config->ext.fm.deemphasis = static_cast(halConfig->fm.deemphasis); - config->ext.fm.stereo = halConfig->fm.stereo; - config->ext.fm.rds = static_cast(halConfig->fm.rds); - config->ext.fm.ta = halConfig->fm.ta; - config->ext.fm.af = halConfig->fm.af; - config->ext.fm.ea = halConfig->fm.ea; - } else { - config->ext.am.stereo = halConfig->am.stereo; - } -} - -//static -void Utils::convertPropertiesFromHal(Properties *properties, - const radio_hal_properties_t *halProperties) -{ - properties->classId = static_cast(halProperties->class_id); - properties->implementor.setToExternal(halProperties->implementor, strlen(halProperties->implementor)); - properties->product.setToExternal(halProperties->product, strlen(halProperties->product)); - properties->version.setToExternal(halProperties->version, strlen(halProperties->version)); - properties->serial.setToExternal(halProperties->serial, strlen(halProperties->serial)); - properties->numTuners = halProperties->num_tuners; - properties->numAudioSources = halProperties->num_audio_sources; - properties->supportsCapture = halProperties->supports_capture; - - BandConfig *bands = - new BandConfig[halProperties->num_bands]; - for (size_t i = 0; i < halProperties->num_bands; i++) { - convertBandConfigFromHal(&bands[i], &halProperties->bands[i]); - } - properties->bands.setToExternal(bands, halProperties->num_bands); - // FIXME: transfer buffer ownership. should have a method for that in hidl_vec - properties->bands.resize(halProperties->num_bands); - delete[] bands; -} - -//static -void Utils::convertBandConfigToHal(radio_hal_band_config_t *halConfig, const BandConfig *config) -{ - halConfig->type = static_cast(config->type); - halConfig->antenna_connected = config->antennaConnected; - halConfig->lower_limit = config->lowerLimit; - halConfig->upper_limit = config->upperLimit; - halConfig->num_spacings = config->spacings.size(); - if (halConfig->num_spacings > RADIO_NUM_SPACINGS_MAX) { - halConfig->num_spacings = RADIO_NUM_SPACINGS_MAX; - } - memcpy(halConfig->spacings, config->spacings.data(), - sizeof(uint32_t) * halConfig->num_spacings); - - if (config->type == Band::FM) { - halConfig->fm.deemphasis = static_cast(config->ext.fm.deemphasis); - halConfig->fm.stereo = config->ext.fm.stereo; - halConfig->fm.rds = static_cast(config->ext.fm.rds); - halConfig->fm.ta = config->ext.fm.ta; - halConfig->fm.af = config->ext.fm.af; - halConfig->fm.ea = config->ext.fm.ea; - } else { - halConfig->am.stereo = config->ext.am.stereo; - } -} - - -//static -void Utils::convertProgramInfoFromHal(ProgramInfo *info, radio_program_info_t *halInfo) -{ - auto &info_1_1 = *info; - auto &info_1_0 = info->base; - - info_1_0.channel = halInfo->channel; - info_1_0.subChannel = halInfo->sub_channel; - info_1_0.tuned = halInfo->tuned; - info_1_0.stereo = halInfo->stereo; - info_1_0.digital = halInfo->digital; - info_1_0.signalStrength = halInfo->signal_strength; - convertMetaDataFromHal(info_1_0.metadata, halInfo->metadata); - // TODO(b/34348946): add support for HAL 1.1 fields - info_1_1.flags = 0; -} - -//static -int Utils::convertMetaDataFromHal(hidl_vec& metadata, radio_metadata_t *halMetadata) -{ - if (halMetadata == NULL) { - ALOGE("Invalid argument: halMetadata is NULL"); - return 0; - } - - int count = radio_metadata_get_count(halMetadata); - if (count <= 0) { - return count; - } - MetaData *newMetadata = new MetaData[count]; - int outCount = 0; - for (int i = 0; i < count; i++) { - radio_metadata_key_t key; - radio_metadata_type_t type; - void *value; - size_t size; - if (radio_metadata_get_at_index(halMetadata, i , &key, &type, &value, &size) != 0 || - size == 0) { - continue; - } - switch (type) { - case RADIO_METADATA_TYPE_INT: { - newMetadata[outCount].intValue = *(static_cast(value)); - } break; - case RADIO_METADATA_TYPE_TEXT: { - newMetadata[outCount].stringValue = static_cast(value); - } break; - case RADIO_METADATA_TYPE_RAW: { - newMetadata[outCount].rawValue.setToExternal(static_cast(value), size); - // FIXME: transfer buffer ownership. should have a method for that in hidl_vec - newMetadata[outCount].rawValue.resize(size); - } break; - case RADIO_METADATA_TYPE_CLOCK: { - radio_metadata_clock_t *clock = static_cast(value); - newMetadata[outCount].clockValue.utcSecondsSinceEpoch = - clock->utc_seconds_since_epoch; - newMetadata[outCount].clockValue.timezoneOffsetInMinutes = - clock->timezone_offset_in_minutes; - } break; - } - newMetadata[outCount].type = static_cast(type); - newMetadata[outCount].key = static_cast(key); - outCount++; - } - metadata.setToExternal(newMetadata, outCount); - // FIXME: transfer buffer ownership. should have a method for that in hidl_vec - metadata.resize(outCount); - return outCount; -} - -} // namespace implementation -} // namespace V1_1 -} // namespace broadcastradio -} // namespace hardware -} // namespace android diff --git a/broadcastradio/1.1/default/Utils.h b/broadcastradio/1.1/default/Utils.h deleted file mode 100644 index 22902ba513..0000000000 --- a/broadcastradio/1.1/default/Utils.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 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. - */ -#ifndef ANDROID_HARDWARE_BROADCASTRADIO_V1_1_UTILS_H -#define ANDROID_HARDWARE_BROADCASTRADIO_V1_1_UTILS_H - -#include -#include - -namespace android { -namespace hardware { -namespace broadcastradio { -namespace V1_1 { -namespace implementation { - -using V1_0::Class; -using V1_0::BandConfig; -using V1_0::MetaData; -using V1_0::Properties; - -class Utils { -public: - static const char * getClassString(Class ClassId); - static Result convertHalResult(int rc); - static void convertBandConfigFromHal(BandConfig *config, - const radio_hal_band_config_t *halConfig); - static void convertPropertiesFromHal(Properties *properties, - const radio_hal_properties_t *halProperties); - static void convertBandConfigToHal(radio_hal_band_config_t *halConfig, - const BandConfig *config); - static void convertProgramInfoFromHal(ProgramInfo *info, - radio_program_info_t *halInfo); - static int convertMetaDataFromHal(hidl_vec& metadata, - radio_metadata_t *halMetadata); -private: - static const char * sClassModuleNames[]; - -}; - -} // namespace implementation -} // namespace V1_1 -} // namespace broadcastradio -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_BROADCASTRADIO_V1_1_UTILS_H diff --git a/broadcastradio/1.1/default/VirtualProgram.cpp b/broadcastradio/1.1/default/VirtualProgram.cpp new file mode 100644 index 0000000000..b418bf7771 --- /dev/null +++ b/broadcastradio/1.1/default/VirtualProgram.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (C) 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. + */ +#include "VirtualProgram.h" + +namespace android { +namespace hardware { +namespace broadcastradio { +namespace V1_1 { +namespace implementation { + +bool operator<(const VirtualProgram& lhs, const VirtualProgram& rhs) { + return lhs.channel < rhs.channel; +} + +} // namespace implementation +} // namespace V1_1 +} // namespace broadcastradio +} // namespace hardware +} // namespace android diff --git a/broadcastradio/1.1/default/VirtualProgram.h b/broadcastradio/1.1/default/VirtualProgram.h new file mode 100644 index 0000000000..ff44590e63 --- /dev/null +++ b/broadcastradio/1.1/default/VirtualProgram.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 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. + */ +#ifndef ANDROID_HARDWARE_BROADCASTRADIO_V1_1_VIRTUALPROGRAM_H +#define ANDROID_HARDWARE_BROADCASTRADIO_V1_1_VIRTUALPROGRAM_H + +#include + +namespace android { +namespace hardware { +namespace broadcastradio { +namespace V1_1 { +namespace implementation { + +struct VirtualProgram { + uint32_t channel; // TODO(b/32621193): Station Selector + + friend bool operator<(const VirtualProgram& lhs, const VirtualProgram& rhs); +}; + +} // namespace implementation +} // namespace V1_1 +} // namespace broadcastradio +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_BROADCASTRADIO_V1_1_VIRTUALPROGRAM_H diff --git a/broadcastradio/1.1/default/VirtualRadio.cpp b/broadcastradio/1.1/default/VirtualRadio.cpp new file mode 100644 index 0000000000..017a01f472 --- /dev/null +++ b/broadcastradio/1.1/default/VirtualRadio.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (C) 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. + */ +#include "VirtualRadio.h" + +namespace android { +namespace hardware { +namespace broadcastradio { +namespace V1_1 { +namespace implementation { + +using std::lock_guard; +using std::move; +using std::mutex; +using std::vector; + +vector gInitialFmPrograms{ + {94900}, {96500}, {97300}, {99700}, {101300}, {103700}, {106100}, +}; + +VirtualRadio::VirtualRadio(VirtualRadio&& o) : mPrograms(move(o.mPrograms)) {} + +VirtualRadio::VirtualRadio(vector initialList) : mPrograms(initialList) {} + +vector VirtualRadio::getProgramList() { + lock_guard lk(mMut); + return mPrograms; +} + +bool VirtualRadio::getProgram(uint32_t channel, VirtualProgram& programOut) { + lock_guard lk(mMut); + for (auto&& program : mPrograms) { + if (program.channel == channel) { + programOut = program; + return true; + } + } + return false; +} + +VirtualRadio make_fm_radio() { + return VirtualRadio(gInitialFmPrograms); +} + +} // namespace implementation +} // namespace V1_1 +} // namespace broadcastradio +} // namespace hardware +} // namespace android diff --git a/broadcastradio/1.1/default/VirtualRadio.h b/broadcastradio/1.1/default/VirtualRadio.h new file mode 100644 index 0000000000..e1918a0583 --- /dev/null +++ b/broadcastradio/1.1/default/VirtualRadio.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 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. + */ +#ifndef ANDROID_HARDWARE_BROADCASTRADIO_V1_1_VIRTUALRADIO_H +#define ANDROID_HARDWARE_BROADCASTRADIO_V1_1_VIRTUALRADIO_H + +#include "VirtualProgram.h" + +#include +#include + +namespace android { +namespace hardware { +namespace broadcastradio { +namespace V1_1 { +namespace implementation { + +class VirtualRadio { + public: + VirtualRadio(VirtualRadio&& o); + VirtualRadio(std::vector initialList); + + std::vector getProgramList(); + bool getProgram(uint32_t channel, VirtualProgram& program); + + private: + std::mutex mMut; + std::vector mPrograms; +}; + +VirtualRadio make_fm_radio(); + +} // namespace implementation +} // namespace V1_1 +} // namespace broadcastradio +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_BROADCASTRADIO_V1_1_VIRTUALRADIO_H diff --git a/broadcastradio/1.1/tests/Android.bp b/broadcastradio/1.1/tests/Android.bp new file mode 100644 index 0000000000..a9d1562412 --- /dev/null +++ b/broadcastradio/1.1/tests/Android.bp @@ -0,0 +1,28 @@ +// +// Copyright (C) 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. +// + +cc_test { + name: "android.hardware.broadcastradio@1.1-utils-tests", + cflags: [ + "-Wall", + "-Wextra", + "-Werror", + ], + srcs: [ + "WorkerThread_test.cpp", + ], + static_libs: ["android.hardware.broadcastradio@1.1-utils-lib"], +} diff --git a/broadcastradio/1.1/tests/WorkerThread_test.cpp b/broadcastradio/1.1/tests/WorkerThread_test.cpp new file mode 100644 index 0000000000..a0e0ebb27c --- /dev/null +++ b/broadcastradio/1.1/tests/WorkerThread_test.cpp @@ -0,0 +1,138 @@ +/* + * Copyright (C) 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. + */ + +#include +#include + +namespace { + +using namespace std::chrono_literals; + +using android::WorkerThread; + +using std::atomic; +using std::chrono::time_point; +using std::chrono::steady_clock; +using std::is_sorted; +using std::lock_guard; +using std::mutex; +using std::this_thread::sleep_for; +using std::vector; + +#define ASSERT_EQ_WITH_TOLERANCE(val1, val2, tolerance) \ + ASSERT_LE((val1) - (tolerance), (val2)); \ + ASSERT_GE((val1) + (tolerance), (val2)); + +TEST(WorkerThreadTest, oneTask) { + atomic executed(false); + atomic> stop; + WorkerThread thread; + + auto start = steady_clock::now(); + thread.schedule( + [&]() { + stop = steady_clock::now(); + executed = true; + }, + 100ms); + + sleep_for(150ms); + + ASSERT_TRUE(executed); + auto delta = stop.load() - start; + ASSERT_EQ_WITH_TOLERANCE(delta, 100ms, 50ms); +} + +TEST(WorkerThreadTest, cancelSecond) { + atomic executed1(false); + atomic executed2(false); + WorkerThread thread; + + thread.schedule([&]() { executed2 = true; }, 100ms); + thread.schedule([&]() { executed1 = true; }, 25ms); + + sleep_for(50ms); + thread.cancelAll(); + sleep_for(100ms); + + ASSERT_TRUE(executed1); + ASSERT_FALSE(executed2); +} + +TEST(WorkerThreadTest, executeInOrder) { + mutex mut; + vector order; + WorkerThread thread; + + thread.schedule( + [&]() { + lock_guard lk(mut); + order.push_back(0); + }, + 50ms); + + thread.schedule( + [&]() { + lock_guard lk(mut); + order.push_back(4); + }, + 400ms); + + thread.schedule( + [&]() { + lock_guard lk(mut); + order.push_back(1); + }, + 100ms); + + thread.schedule( + [&]() { + lock_guard lk(mut); + order.push_back(3); + }, + 300ms); + + thread.schedule( + [&]() { + lock_guard lk(mut); + order.push_back(2); + }, + 200ms); + + sleep_for(500ms); + + ASSERT_EQ(5u, order.size()); + ASSERT_TRUE(is_sorted(order.begin(), order.end())); +} + +TEST(WorkerThreadTest, dontExecuteAfterDestruction) { + atomic executed1(false); + atomic executed2(false); + { + WorkerThread thread; + + thread.schedule([&]() { executed2 = true; }, 100ms); + thread.schedule([&]() { executed1 = true; }, 25ms); + + sleep_for(50ms); + } + sleep_for(100ms); + + ASSERT_TRUE(executed1); + ASSERT_FALSE(executed2); +} + +} // anonymous namespace diff --git a/broadcastradio/1.1/utils/Android.bp b/broadcastradio/1.1/utils/Android.bp new file mode 100644 index 0000000000..fab6517938 --- /dev/null +++ b/broadcastradio/1.1/utils/Android.bp @@ -0,0 +1,30 @@ +// +// Copyright (C) 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. +// + +cc_library_static { + name: "android.hardware.broadcastradio@1.1-utils-lib", + vendor: true, + relative_install_path: "hw", + cflags: [ + "-Wall", + "-Wextra", + "-Werror", + ], + srcs: [ + "WorkerThread.cpp", + ], + export_include_dirs: ["."], +} diff --git a/broadcastradio/1.1/utils/WorkerThread.cpp b/broadcastradio/1.1/utils/WorkerThread.cpp new file mode 100644 index 0000000000..a3ceaa1bfa --- /dev/null +++ b/broadcastradio/1.1/utils/WorkerThread.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (C) 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 "WorkerThread" +//#define LOG_NDEBUG 0 + +#include "WorkerThread.h" + +#include + +namespace android { + +using std::chrono::milliseconds; +using std::chrono::steady_clock; +using std::function; +using std::lock_guard; +using std::mutex; +using std::priority_queue; +using std::this_thread::sleep_for; +using std::unique_lock; + +bool operator<(const WorkerThread::Task& lhs, const WorkerThread::Task& rhs) { + return lhs.when > rhs.when; +} + +WorkerThread::WorkerThread() : mIsTerminating(false), mThread(&WorkerThread::threadLoop, this) {} + +WorkerThread::~WorkerThread() { + ALOGV("%s", __func__); + { + lock_guard lk(mMut); + mIsTerminating = true; + mCond.notify_one(); + } + mThread.join(); +} + +void WorkerThread::schedule(function task, milliseconds delay) { + ALOGV("%s", __func__); + + auto when = steady_clock::now() + delay; + + lock_guard lk(mMut); + mTasks.push(Task({when, task})); + mCond.notify_one(); +} + +void WorkerThread::cancelAll() { + ALOGV("%s", __func__); + + lock_guard lk(mMut); + priority_queue().swap(mTasks); // empty queue +} + +void WorkerThread::threadLoop() { + ALOGV("%s", __func__); + while (!mIsTerminating) { + unique_lock lk(mMut); + if (mTasks.empty()) { + mCond.wait(lk); + continue; + } + + auto task = mTasks.top(); + if (task.when > steady_clock::now()) { + mCond.wait_until(lk, task.when); + continue; + } + + mTasks.pop(); + lk.unlock(); // what() might need to schedule another task + task.what(); + } +} + +} // namespace android diff --git a/broadcastradio/1.1/utils/WorkerThread.h b/broadcastradio/1.1/utils/WorkerThread.h new file mode 100644 index 0000000000..635876fbcb --- /dev/null +++ b/broadcastradio/1.1/utils/WorkerThread.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 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. + */ +#ifndef ANDROID_HARDWARE_BROADCASTRADIO_V1_1_WORKERTHREAD_H +#define ANDROID_HARDWARE_BROADCASTRADIO_V1_1_WORKERTHREAD_H + +#include +#include +#include + +namespace android { + +class WorkerThread { + public: + WorkerThread(); + virtual ~WorkerThread(); + + void schedule(std::function task, std::chrono::milliseconds delay); + void cancelAll(); + + private: + struct Task { + std::chrono::time_point when; + std::function what; + }; + friend bool operator<(const Task& lhs, const Task& rhs); + + std::atomic mIsTerminating; + std::mutex mMut; + std::condition_variable mCond; + std::thread mThread; + std::priority_queue mTasks; + + void threadLoop(); +}; + +} // namespace android + +#endif // ANDROID_HARDWARE_BROADCASTRADIO_V1_1_WORKERTHREAD_H diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index aa5ab548f6..904d8962d5 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -56,14 +56,15 @@ class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase { protected: virtual void SetUp() override { auto factory = ::testing::VtsHalHidlTargetTestBase::getService(); - if (factory != 0) { - factory->connectModule(Class::AM_FM, - [&](Result retval, const ::android::sp& result) { - if (retval == Result::OK) { - mRadio = IBroadcastRadio::castFrom(result); - } - }); - } + ASSERT_NE(nullptr, factory.get()); + Result halResult; + factory->connectModule(Class::AM_FM, [&](Result retval, const sp& result) { + halResult = retval; + if (retval == Result::OK) { + mRadio = IBroadcastRadio::castFrom(result); + } + }); + ASSERT_EQ(Result::OK, halResult); mTunerCallback = new MyCallback(this); ASSERT_NE(nullptr, mRadio.get()); ASSERT_NE(nullptr, mTunerCallback.get()); @@ -277,6 +278,7 @@ bool BroadcastRadioHidlTest::openTuner() }); EXPECT_TRUE(hidlReturn.isOk()); EXPECT_EQ(Result::OK, halResult); + EXPECT_NE(nullptr, mTuner.get()); EXPECT_TRUE(waitForCallback(kConfigCallbacktimeoutNs)); } EXPECT_NE(nullptr, mTuner.get()); diff --git a/broadcastradio/Android.bp b/broadcastradio/Android.bp index 7a315faab3..a5ad5e7af7 100644 --- a/broadcastradio/Android.bp +++ b/broadcastradio/Android.bp @@ -5,5 +5,7 @@ subdirs = [ "1.0/vts/functional", "1.1", "1.1/default", + "1.1/tests", + "1.1/utils", "1.1/vts/functional", ] From 006a3c4b087157035102123c64aa57b46be6842a Mon Sep 17 00:00:00 2001 From: sqian Date: Tue, 27 Jun 2017 17:24:59 -0700 Subject: [PATCH 022/265] Fix failure vts tests: - setCdmaBroadcastConfig - getCdmaBroadcastConfig - setCdmaBroadcastActivation - pullLceData - setAllowedCarriers - setAllowedCarriers - sendEnvelope - sendEnvelopeWithStatus - cancelPendingUssd - sendCDMAFeatureCode Test: mma -j30; adb shell binary Bug: 62960543, 62584347 Change-Id: Ie907cdb464a44d92be47d898151d71eb2d83a11c --- .../vts/functional/radio_hidl_hal_cell_broadcast.cpp | 8 +++++--- radio/1.0/vts/functional/radio_hidl_hal_misc.cpp | 11 ++++++----- radio/1.0/vts/functional/radio_hidl_hal_stk.cpp | 12 ++++++++---- radio/1.0/vts/functional/radio_hidl_hal_voice.cpp | 6 ++++-- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/radio/1.0/vts/functional/radio_hidl_hal_cell_broadcast.cpp b/radio/1.0/vts/functional/radio_hidl_hal_cell_broadcast.cpp index 14d14d42bd..e0c3a158d2 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_cell_broadcast.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_cell_broadcast.cpp @@ -123,7 +123,8 @@ TEST_F(RadioHidlTest, setCdmaBroadcastConfig) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(CheckGeneralError() || - radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS); + radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || + radioRsp->rspInfo.error == RadioError::NONE); } } @@ -140,7 +141,7 @@ TEST_F(RadioHidlTest, getCdmaBroadcastConfig) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(CheckGeneralError()); + ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::NONE); } } @@ -159,7 +160,8 @@ TEST_F(RadioHidlTest, setCdmaBroadcastActivation) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(CheckGeneralError() || - radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS); + radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || + radioRsp->rspInfo.error == RadioError::NONE); } } diff --git a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp index f96529660f..e6d10ba5ed 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp @@ -184,7 +184,7 @@ TEST_F(RadioHidlTest, setBandMode) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - EXPECT_EQ(radioRsp->rspInfo.error, RadioError::NONE); + ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::NONE); } } @@ -216,7 +216,7 @@ TEST_F(RadioHidlTest, setPreferredNetworkType) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - EXPECT_EQ(radioRsp->rspInfo.error, RadioError::NONE); + ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::NONE); } } @@ -707,7 +707,8 @@ TEST_F(RadioHidlTest, pullLceData) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::RADIO_NOT_AVAILABLE || CheckOEMError() || - radioRsp->rspInfo.error == RadioError::INTERNAL_ERR); + radioRsp->rspInfo.error == RadioError::INTERNAL_ERR || + radioRsp->rspInfo.error == RadioError::NONE); } } @@ -747,7 +748,7 @@ TEST_F(RadioHidlTest, setAllowedCarriers) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - EXPECT_EQ(radioRsp->rspInfo.error, RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || CheckGeneralError()); } /* Reset back to no carrier restriction */ @@ -761,7 +762,7 @@ TEST_F(RadioHidlTest, setAllowedCarriers) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - EXPECT_EQ(radioRsp->rspInfo.error, RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || CheckGeneralError()); } } diff --git a/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp b/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp index 6ff033032e..9a9a4aee99 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp @@ -37,7 +37,8 @@ TEST_F(RadioHidlTest, sendEnvelope) { std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || - radioRsp->rspInfo.error == RadioError::NONE); + radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::MODEM_ERR); } // Test with sending random string @@ -54,7 +55,8 @@ TEST_F(RadioHidlTest, sendEnvelope) { std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || - radioRsp->rspInfo.error == RadioError::NONE); + radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::MODEM_ERR); } } @@ -153,7 +155,8 @@ TEST_F(RadioHidlTest, sendEnvelopeWithStatus) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(CheckGeneralError() || - radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS); + radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || + radioRsp->rspInfo.error == RadioError::MODEM_ERR); } // Test with sending random string @@ -168,6 +171,7 @@ TEST_F(RadioHidlTest, sendEnvelopeWithStatus) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(CheckGeneralError() || - radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS); + radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || + radioRsp->rspInfo.error == RadioError::MODEM_ERR); } } diff --git a/radio/1.0/vts/functional/radio_hidl_hal_voice.cpp b/radio/1.0/vts/functional/radio_hidl_hal_voice.cpp index d57360fd40..c7570c81b2 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_voice.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_voice.cpp @@ -214,7 +214,8 @@ TEST_F(RadioHidlTest, cancelPendingUssd) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_STATE || - radioRsp->rspInfo.error == RadioError::MODEM_ERR); + radioRsp->rspInfo.error == RadioError::MODEM_ERR || + radioRsp->rspInfo.error == RadioError::NONE); } } @@ -371,7 +372,8 @@ TEST_F(RadioHidlTest, sendCDMAFeatureCode) { radioRsp->rspInfo.error == RadioError::NONE || radioRsp->rspInfo.error == RadioError::INVALID_CALL_ID || radioRsp->rspInfo.error == RadioError::INVALID_MODEM_STATE || - radioRsp->rspInfo.error == RadioError::MODEM_ERR); + radioRsp->rspInfo.error == RadioError::MODEM_ERR || + radioRsp->rspInfo.error == RadioError::MODE_NOT_SUPPORTED); } } From 108919b1e79a6a063e2738c27279bcd96ac3afed Mon Sep 17 00:00:00 2001 From: Steve Paik Date: Wed, 28 Jun 2017 15:04:02 -0700 Subject: [PATCH 023/265] Add HVAC_AUTO_RECIRC_ON property Bug: 32870841 Test: Compiles - property will be implemented in VHAL Change-Id: I5092a95bb9396833e3530bdcfa162a0fbce2cec5 --- automotive/vehicle/2.1/types.hal | 56 ++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/automotive/vehicle/2.1/types.hal b/automotive/vehicle/2.1/types.hal index 2d1aa465c4..54e87edabd 100644 --- a/automotive/vehicle/2.1/types.hal +++ b/automotive/vehicle/2.1/types.hal @@ -44,6 +44,42 @@ enum VehicleProperty: @2.0::VehicleProperty { | VehiclePropertyType:FLOAT_VEC | VehicleArea:GLOBAL), + /** + * Automatic re-circulation on/off + * + * IVehicle#set may return StatusCode::NOT_AVAILABLE and IVehicle#get is not + * guaranteed to work if HVAC unit is off. See HVAC_POWER_ON property for + * details. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_AUTO_RECIRC_ON = ( + 0x0512 + | VehiclePropertyGroup:SYSTEM + | VehiclePropertyType:BOOLEAN + | VehicleArea:ZONE), + + /** + * Vehicle Maps Service (VMS) message + * + * This property uses COMPLEX data to communicate vms messages. + * + * Its contents are to be interpreted as follows: + * the indices defined in VmsMessageIntegerValuesIndex are to be used to + * read from int32Values; + * bytes is a serialized VMS message as defined in the vms protocol + * which is opaque to the framework; + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + VEHICLE_MAP_SERVICE = ( + 0x0C00 + | VehiclePropertyGroup:SYSTEM + | VehiclePropertyType:COMPLEX + | VehicleArea:GLOBAL), + /** * OBD2 Live Sensor Data * @@ -174,26 +210,6 @@ enum VehicleProperty: @2.0::VehicleProperty { | VehiclePropertyGroup:SYSTEM | VehiclePropertyType:COMPLEX | VehicleArea:GLOBAL), - - /** - * Vehicle Maps Service (VMS) message - * - * This property uses COMPLEX data to communicate vms messages. - * - * Its contents are to be interpreted as follows: - * the indices defined in VmsMessageIntegerValuesIndex are to be used to - * read from int32Values; - * bytes is a serialized VMS message as defined in the vms protocol - * which is opaque to the framework; - * - * @change_mode VehiclePropertyChangeMode:ON_CHANGE - * @access VehiclePropertyAccess:READ_WRITE - */ - VEHICLE_MAP_SERVICE = ( - 0x0C00 - | VehiclePropertyGroup:SYSTEM - | VehiclePropertyType:COMPLEX - | VehicleArea:GLOBAL), }; /** The status of a fuel system as described by the OBD2 specification. */ From 60ff24c62e3215d24cdad0b7b29926734eb24c10 Mon Sep 17 00:00:00 2001 From: Jae Shin Date: Thu, 29 Jun 2017 11:42:25 +0900 Subject: [PATCH 024/265] Assert getService does not return nullptr Make sure getService return value is not null before running testcase Test: make vts -j40 && vts-tradefed run commandAndExit vts -m VtsHalConfigstoreV1_0Target Bug:62931371 Change-Id: I432e07c0c61a308b814d88cab9027a95ff24d8b5 --- .../1.0/vts/functional/VtsHalConfigstoreV1_0TargetTest.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/configstore/1.0/vts/functional/VtsHalConfigstoreV1_0TargetTest.cpp b/configstore/1.0/vts/functional/VtsHalConfigstoreV1_0TargetTest.cpp index 95cd30b810..e501580935 100644 --- a/configstore/1.0/vts/functional/VtsHalConfigstoreV1_0TargetTest.cpp +++ b/configstore/1.0/vts/functional/VtsHalConfigstoreV1_0TargetTest.cpp @@ -41,6 +41,7 @@ class ConfigstoreHidlTest : public ::testing::VtsHalHidlTargetTestBase { virtual void SetUp() override { sfConfigs = ::testing::VtsHalHidlTargetTestBase::getService< ISurfaceFlingerConfigs>(); + ASSERT_NE(sfConfigs, nullptr); } virtual void TearDown() override {} From 0202b3e7b3f7d3ba7f4f38d4bd450117c5b6a6d7 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Thu, 29 Jun 2017 08:27:50 -0700 Subject: [PATCH 025/265] Make tuned field description more precise and fix VTS tests to obey it. Also makes an ABI-stable change to a hal definition file. Bug: b/36864490 Test: VTS Change-Id: Ibf3513722144a559c31d0f61eb84bc718cd9dbdc --- broadcastradio/1.0/types.hal | 5 ++++- .../vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp | 3 --- .../vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp | 3 --- current.txt | 1 + 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/broadcastradio/1.0/types.hal b/broadcastradio/1.0/types.hal index 045231d495..934f49fbd6 100644 --- a/broadcastradio/1.0/types.hal +++ b/broadcastradio/1.0/types.hal @@ -208,7 +208,10 @@ struct MetaData { struct ProgramInfo { uint32_t channel; /** current channel. (e.g kHz for band type AM_FM) */ uint32_t subChannel; /** current sub channel. (FM_HD) */ - bool tuned; /** tuned to a program or not */ + + /** Tuned to a program (not a noise). It's the same condition that would stop scan operation. */ + bool tuned; + bool stereo; /** program is stereo or not */ bool digital; /** digital program or not (e.g HD Radio program) */ uint32_t signalStrength; /** signal strength from 0 to 100 */ diff --git a/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp b/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp index 3ac6594304..7241ad4c37 100644 --- a/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp +++ b/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp @@ -599,11 +599,8 @@ TEST_P(BroadcastRadioHidlTest, TuneAndGetProgramInformationAndCancel) { EXPECT_TRUE(hidlReturn.isOk()); EXPECT_EQ(Result::OK, halResult); if (mResultCallbackData == Result::OK) { - EXPECT_EQ(true, halInfo.tuned); EXPECT_LE(halInfo.channel, upperLimit); EXPECT_GE(halInfo.channel, lowerLimit); - } else { - EXPECT_EQ(false, halInfo.tuned); } // test cancel diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index 904d8962d5..b45c8d5b65 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -456,11 +456,8 @@ TEST_F(BroadcastRadioHidlTest, TuneAndGetProgramInformationAndCancel) { EXPECT_EQ(Result::OK, halResult); auto &halInfo_1_1 = halInfo.base; if (mResultCallbackData == Result::OK) { - EXPECT_TRUE(halInfo_1_1.tuned); EXPECT_LE(halInfo_1_1.channel, upperLimit); EXPECT_GE(halInfo_1_1.channel, lowerLimit); - } else { - EXPECT_EQ(false, halInfo_1_1.tuned); } // test cancel diff --git a/current.txt b/current.txt index eb82ee413c..cd76ef954f 100644 --- a/current.txt +++ b/current.txt @@ -189,6 +189,7 @@ fe3c3c2f572b72f15f8594c538b0577bd5c28722c31879cfe6231330cddb6747 android.hardwar # ABI preserving changes to HALs released in Android O +1cb99268f38629288646c0e067a6bc59b82d356b5adb74237fba0372d34978b0 android.hardware.broadcastradio@1.0::types 760485232f6cce07f8bb05e3475509956996b702f77415ee5bff05e2ec5a5bcc android.hardware.dumpstate@1.0::IDumpstateDevice 1fecfa1609ff9d27ebf761a84b4336efa9d5dac5b241f19a6663f70d8db2c4b1 android.hardware.radio@1.0::IRadioResponse 28e929b453df3d9f5060af2764e6cdb123ddb893e3e86923c877f6ff7e5f02c9 android.hardware.wifi@1.0::types From cfc836a326649886c3dcf536c217a275f6316999 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Thu, 29 Jun 2017 11:09:33 -0700 Subject: [PATCH 026/265] Move broadcastradio test to vendor. This is a vendor test and is causing builds with BOARD_VNDK_VERSION to fail during soong processing. Bug: 37342627 Test: BOARD_VNDK_VERSION=current builds fail later Change-Id: Icc465b36ff0ecb0ac6c13ba99271eb9b86db6948 --- broadcastradio/1.1/tests/Android.bp | 1 + 1 file changed, 1 insertion(+) diff --git a/broadcastradio/1.1/tests/Android.bp b/broadcastradio/1.1/tests/Android.bp index a9d1562412..fa1fd94409 100644 --- a/broadcastradio/1.1/tests/Android.bp +++ b/broadcastradio/1.1/tests/Android.bp @@ -16,6 +16,7 @@ cc_test { name: "android.hardware.broadcastradio@1.1-utils-tests", + vendor: true, cflags: [ "-Wall", "-Wextra", From 7f7c8c9bc7077684b04298fe71bafae49cba5d25 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Thu, 29 Jun 2017 17:55:54 -0700 Subject: [PATCH 027/265] RDS PI is a number, not a string. Makes an ABI-stable change to a hal definition file. Bug: b/63147256 Test: manual, VTS, instumentalization Change-Id: I7f1d88dea77fcfd7c203427c094553a6ae89d43b --- broadcastradio/1.0/types.hal | 2 +- current.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/broadcastradio/1.0/types.hal b/broadcastradio/1.0/types.hal index 934f49fbd6..d165e32250 100644 --- a/broadcastradio/1.0/types.hal +++ b/broadcastradio/1.0/types.hal @@ -155,7 +155,7 @@ enum MetadataType : int32_t { enum MetadataKey : int32_t { INVALID = -1, - /** RDS PI - string */ + /** RDS PI - int32_t */ RDS_PI = 0, /** RDS PS - string */ RDS_PS = 1, diff --git a/current.txt b/current.txt index cd76ef954f..1904db8da6 100644 --- a/current.txt +++ b/current.txt @@ -189,7 +189,7 @@ fe3c3c2f572b72f15f8594c538b0577bd5c28722c31879cfe6231330cddb6747 android.hardwar # ABI preserving changes to HALs released in Android O -1cb99268f38629288646c0e067a6bc59b82d356b5adb74237fba0372d34978b0 android.hardware.broadcastradio@1.0::types +8a4082dbc7f5eef585dca841b2656ba62d6c7e10e25dd05507ead15d96224f4c android.hardware.broadcastradio@1.0::types 760485232f6cce07f8bb05e3475509956996b702f77415ee5bff05e2ec5a5bcc android.hardware.dumpstate@1.0::IDumpstateDevice 1fecfa1609ff9d27ebf761a84b4336efa9d5dac5b241f19a6663f70d8db2c4b1 android.hardware.radio@1.0::IRadioResponse 28e929b453df3d9f5060af2764e6cdb123ddb893e3e86923c877f6ff7e5f02c9 android.hardware.wifi@1.0::types From 968b355572226a3d1e4696e4d8611f7cd4989de9 Mon Sep 17 00:00:00 2001 From: Scott Randolph Date: Fri, 23 Jun 2017 14:34:49 -0700 Subject: [PATCH 028/265] Update service name targeted by VTS test Use the standard driver rather than the "mock" driver for testing. Test: Run the test. Change-Id: I706eabaf33f6879a22359250ce02daaf4a7fe15f --- .../evs/1.0/vts/functional/VtsEvsV1_0TargetTest.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/automotive/evs/1.0/vts/functional/VtsEvsV1_0TargetTest.cpp b/automotive/evs/1.0/vts/functional/VtsEvsV1_0TargetTest.cpp index 2e80afe8fe..57050d7516 100644 --- a/automotive/evs/1.0/vts/functional/VtsEvsV1_0TargetTest.cpp +++ b/automotive/evs/1.0/vts/functional/VtsEvsV1_0TargetTest.cpp @@ -17,8 +17,13 @@ #define LOG_TAG "VtsHalEvsTest" -// TODO: How should we configure these values to target appropriate hardware? -const static char kEnumeratorName[] = "EvsEnumeratorHw-Mock"; +// Note: We have't got a great way to indicate which target +// should be tested, so we'll leave the interface served by the +// default (mock) EVS driver here for easy reference. All +// actual EVS drivers should serve on the EvsEnumeratorHw name, +// however, so the code is checked in that way. +//const static char kEnumeratorName[] = "EvsEnumeratorHw-Mock"; +const static char kEnumeratorName[] = "EvsEnumeratorHw"; // These values are called out in the EVS design doc (as of Mar 8, 2017) @@ -474,4 +479,4 @@ TEST_F(EvsHidlTest, CameraToDisplayRoundTrip) { // Explicitly release the display pEnumerator->closeDisplay(pDisplay); -} \ No newline at end of file +} From 100f2ed58ade0351f30099c4784363005f7754f7 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Thu, 29 Jun 2017 16:04:05 -0700 Subject: [PATCH 029/265] Add RDS info to virtual stations, convert to ProgramInfo. Bug: b/36864090 Test: manual, VTS (none added) Change-Id: Iad54f5abee4c722030ae118cb3c4d8ad64225b34 --- broadcastradio/1.1/default/Tuner.cpp | 31 ++++--------------- broadcastradio/1.1/default/VirtualProgram.cpp | 22 +++++++++++++ broadcastradio/1.1/default/VirtualProgram.h | 6 ++++ broadcastradio/1.1/default/VirtualRadio.cpp | 8 ++++- 4 files changed, 41 insertions(+), 26 deletions(-) diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index 64d8b89613..9b39d36eea 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -107,24 +107,17 @@ void Tuner::tuneInternalLocked() { virtualRadio = &mVirtualFm; } - auto& info11 = mCurrentProgramInfo; - auto& info10 = info11.base; - VirtualProgram virtualProgram; if (virtualRadio != nullptr && virtualRadio->getProgram(mCurrentProgram, virtualProgram)) { - // TODO(b/36864090): convert virtualProgram to ProgramInfo instead - info10.channel = mCurrentProgram; - info10.tuned = true; - info10.stereo = true; - info10.signalStrength = 100; + mCurrentProgramInfo = static_cast(virtualProgram); } else { - info11 = makeDummyProgramInfo(mCurrentProgram); + mCurrentProgramInfo = makeDummyProgramInfo(mCurrentProgram); } mIsTuneCompleted = true; - mCallback->tuneComplete(Result::OK, info10); + mCallback->tuneComplete(Result::OK, mCurrentProgramInfo.base); if (mCallback1_1 != nullptr) { - mCallback1_1->tuneComplete_1_1(Result::OK, info11); + mCallback1_1->tuneComplete_1_1(Result::OK, mCurrentProgramInfo); } } @@ -274,20 +267,8 @@ Return Tuner::getProgramList(const hidl_string& filter __unused, getProgra return Void(); } - hidl_vec list; - auto vList = virtualRadio.getProgramList(); - list.resize(vList.size()); - for (size_t i = 0; i < vList.size(); i++) { - auto& src = vList[i]; - auto& dst11 = list[i]; - auto& dst10 = dst11.base; - - // TODO(b/36864090): convert virtualProgram to ProgramInfo instead - dst10.channel = src.channel; - dst10.tuned = true; - } - - _hidl_cb(ProgramListResult::OK, list); + auto list = virtualRadio.getProgramList(); + _hidl_cb(ProgramListResult::OK, vector(list.begin(), list.end())); return Void(); } diff --git a/broadcastradio/1.1/default/VirtualProgram.cpp b/broadcastradio/1.1/default/VirtualProgram.cpp index b418bf7771..df12a3ea17 100644 --- a/broadcastradio/1.1/default/VirtualProgram.cpp +++ b/broadcastradio/1.1/default/VirtualProgram.cpp @@ -21,6 +21,28 @@ namespace broadcastradio { namespace V1_1 { namespace implementation { +using V1_0::MetaData; +using V1_0::MetadataKey; +using V1_0::MetadataType; + +VirtualProgram::operator ProgramInfo() const { + ProgramInfo info11 = {}; + auto& info10 = info11.base; + + info10.channel = channel; + info10.tuned = true; + info10.stereo = true; + info10.signalStrength = 100; + + info10.metadata = hidl_vec({ + {MetadataType::TEXT, MetadataKey::RDS_PS, {}, {}, programName, {}}, + {MetadataType::TEXT, MetadataKey::TITLE, {}, {}, songTitle, {}}, + {MetadataType::TEXT, MetadataKey::ARTIST, {}, {}, songArtist, {}}, + }); + + return info11; +} + bool operator<(const VirtualProgram& lhs, const VirtualProgram& rhs) { return lhs.channel < rhs.channel; } diff --git a/broadcastradio/1.1/default/VirtualProgram.h b/broadcastradio/1.1/default/VirtualProgram.h index ff44590e63..303513f4bc 100644 --- a/broadcastradio/1.1/default/VirtualProgram.h +++ b/broadcastradio/1.1/default/VirtualProgram.h @@ -16,6 +16,7 @@ #ifndef ANDROID_HARDWARE_BROADCASTRADIO_V1_1_VIRTUALPROGRAM_H #define ANDROID_HARDWARE_BROADCASTRADIO_V1_1_VIRTUALPROGRAM_H +#include #include namespace android { @@ -27,6 +28,11 @@ namespace implementation { struct VirtualProgram { uint32_t channel; // TODO(b/32621193): Station Selector + std::string programName = ""; + std::string songArtist = ""; + std::string songTitle = ""; + + explicit operator ProgramInfo() const; friend bool operator<(const VirtualProgram& lhs, const VirtualProgram& rhs); }; diff --git a/broadcastradio/1.1/default/VirtualRadio.cpp b/broadcastradio/1.1/default/VirtualRadio.cpp index 017a01f472..0eab7aee72 100644 --- a/broadcastradio/1.1/default/VirtualRadio.cpp +++ b/broadcastradio/1.1/default/VirtualRadio.cpp @@ -27,7 +27,13 @@ using std::mutex; using std::vector; vector gInitialFmPrograms{ - {94900}, {96500}, {97300}, {99700}, {101300}, {103700}, {106100}, + {94900, "Wild 94.9", "Drake ft. Rihanna", "Too Good"}, + {96500, "KOIT", "Celine Dion", "All By Myself"}, + {97300, "Alice@97.3", "Drops of Jupiter", "Train"}, + {99700, "99.7 Now!", "The Chainsmokers", "Closer"}, + {101300, "101-3 KISS-FM", "Justin Timberlake", "Rock Your Body"}, + {103700, "iHeart80s @ 103.7", "Michael Jackson", "Billie Jean"}, + {106100, "106 KMEL", "Drake", "Marvins Room"}, }; VirtualRadio::VirtualRadio(VirtualRadio&& o) : mPrograms(move(o.mPrograms)) {} From f809d6085812703fe1f3187be19bced838987268 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Fri, 30 Jun 2017 17:04:04 -0700 Subject: [PATCH 030/265] a.h.sensors@1.0-convert export libhardware headers Test: m libsensorndkbridge -j Test: BOARD_VNDK_VERSION=current m libsensorndkbridge -j Bug: 33241851 Change-Id: I23f77e36d2a5ccf5b349c7ae5430b509771f71ba --- sensors/1.0/default/Android.bp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sensors/1.0/default/Android.bp b/sensors/1.0/default/Android.bp index 81445908ad..4bbafa6776 100644 --- a/sensors/1.0/default/Android.bp +++ b/sensors/1.0/default/Android.bp @@ -38,6 +38,9 @@ cc_library_static { "android.hardware.sensors@1.0", ], local_include_dirs: ["include/sensors"], + export_shared_lib_headers: [ + "libhardware", + ], } From 323d172db73f2512fbc230e739e49d55f25bdb71 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Thu, 29 Jun 2017 14:31:59 +0900 Subject: [PATCH 031/265] Build android.hardware.drm@1.0-service with BOARD_VNDK_VERSION Instead of relying on the global include paths, use the new headers lib 'media_plugin_headers'. Also, media/SharedLibrary.h is not used, thus deleted. Bug: 37342627 Test: BOARD_VNDK_VERSION=current m -j android.hardware.drm@1.0-service Change-Id: I30d8bcb6315b734cef7ad082c432da51eb33119c --- drm/1.0/default/Android.mk | 3 +++ drm/1.0/default/CryptoFactory.h | 1 - drm/1.0/default/DrmFactory.h | 1 - 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/drm/1.0/default/Android.mk b/drm/1.0/default/Android.mk index 0cc6e71b2d..99773be385 100644 --- a/drm/1.0/default/Android.mk +++ b/drm/1.0/default/Android.mk @@ -42,6 +42,9 @@ LOCAL_STATIC_LIBRARIES := \ LOCAL_C_INCLUDES := \ hardware/interfaces/drm +LOCAL_HEADER_LIBRARIES := \ + media_plugin_headers + # TODO(b/18948909) Some legacy DRM plugins only support 32-bit. They need to be # migrated to 64-bit. Once all of a device's legacy DRM plugins support 64-bit, # that device can turn on TARGET_ENABLE_MEDIADRM_64 to build this service as diff --git a/drm/1.0/default/CryptoFactory.h b/drm/1.0/default/CryptoFactory.h index 6b1d1ffce8..86130dc367 100644 --- a/drm/1.0/default/CryptoFactory.h +++ b/drm/1.0/default/CryptoFactory.h @@ -20,7 +20,6 @@ #include #include #include -#include namespace android { namespace hardware { diff --git a/drm/1.0/default/DrmFactory.h b/drm/1.0/default/DrmFactory.h index 726bf97185..32e192db80 100644 --- a/drm/1.0/default/DrmFactory.h +++ b/drm/1.0/default/DrmFactory.h @@ -20,7 +20,6 @@ #include #include #include -#include namespace android { namespace hardware { From 23b24aad73af285d9e26e9750a46dead28c68da8 Mon Sep 17 00:00:00 2001 From: Jakub Pawlowski Date: Wed, 5 Jul 2017 12:56:42 -0700 Subject: [PATCH 032/265] Make RawAddress into a class (4/4) * Add libbluetooth-types - library containing types implementation, that is common between stystem/bt and packages/apps/Bluetooth. It must be included in every project using btif interface. * Put Raw Address implementation into libbluetooth-types * Unify all "to/from string" helper methods into ToString and FromString * bd_addr_empty -> RawAddress::kEmpty * bd_addr_any -> RawAddress::kAny Also fix leaks in jni str2addr by adding ReleaseStringUTFChars Test: types_unittest Change-Id: I7dca82ec2293ae5338a9500dd6aa43b59d25657a --- bluetooth/1.0/vts/functional/Android.bp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bluetooth/1.0/vts/functional/Android.bp b/bluetooth/1.0/vts/functional/Android.bp index d2e655369f..cd2be441c2 100644 --- a/bluetooth/1.0/vts/functional/Android.bp +++ b/bluetooth/1.0/vts/functional/Android.bp @@ -28,7 +28,10 @@ cc_test { "libutils", "android.hardware.bluetooth@1.0", ], - static_libs: ["VtsHalHidlTargetTestBase"], + static_libs: [ + "VtsHalHidlTargetTestBase", + "libbluetooth-types", + ], cflags: [ "-O0", "-g", From 7d8dad40133100520168765ea8e7dc5117fd38d9 Mon Sep 17 00:00:00 2001 From: Enrico Granata Date: Thu, 6 Jul 2017 15:55:30 -0700 Subject: [PATCH 033/265] The VehiclePropValue response for OBD2_FREEZE_FRAME_INFO didn't have the property ID set correctly Test: make vts BUILD_GOOGLE_VTS=true -j32 && vts-tradefed run commandAndExit vts -m VtsHalAutomotiveVehicleV2_1Host Change-Id: I9b4d5f19657301f2d1c98c0811dcfa39cca85381 --- .../vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.cpp b/automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.cpp index 46e062b86b..4faccbd999 100644 --- a/automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.cpp +++ b/automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.cpp @@ -189,6 +189,7 @@ V2_0::StatusCode EmulatedVehicleHal::fillObd2DtcInfo(V2_0::VehiclePropValue* out timestamps.push_back(freezeFrame.timestamp); } outValue->value.int64Values = timestamps; + outValue->prop = OBD2_FREEZE_FRAME_INFO; return V2_0::StatusCode::OK; } From a02b6ef23c6dd0405ceb1337ba05bf4e0087890c Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Wed, 5 Jul 2017 11:23:30 -0700 Subject: [PATCH 034/265] Implement ProgramSelector at HIDL layer. No front-end implementation yet. Bug: b/32621193 Test: VTS Change-Id: I48f034e709254836cad35bbeb4285c3c42a9e1cd --- broadcastradio/1.1/ITuner.hal | 21 ++ broadcastradio/1.1/default/Tuner.cpp | 86 +++++--- broadcastradio/1.1/default/Tuner.h | 5 +- broadcastradio/1.1/default/VirtualProgram.cpp | 27 ++- broadcastradio/1.1/default/VirtualProgram.h | 2 +- broadcastradio/1.1/default/VirtualRadio.cpp | 24 +- broadcastradio/1.1/default/VirtualRadio.h | 2 +- broadcastradio/1.1/types.hal | 145 ++++++++++++ broadcastradio/1.1/utils/Android.bp | 4 + broadcastradio/1.1/utils/Utils.cpp | 207 ++++++++++++++++++ broadcastradio/1.1/utils/Utils.h | 75 +++++++ .../VtsHalBroadcastradioV1_1TargetTest.cpp | 64 +++++- 12 files changed, 615 insertions(+), 47 deletions(-) create mode 100644 broadcastradio/1.1/utils/Utils.cpp create mode 100644 broadcastradio/1.1/utils/Utils.h diff --git a/broadcastradio/1.1/ITuner.hal b/broadcastradio/1.1/ITuner.hal index 751162966f..912786ab2e 100644 --- a/broadcastradio/1.1/ITuner.hal +++ b/broadcastradio/1.1/ITuner.hal @@ -20,6 +20,27 @@ import @1.0::ITuner; interface ITuner extends @1.0::ITuner { + /** + * Tune to a specified program. + * + * For AM/FM, it must be called when a valid configuration has been applied. + * Automatically cancels pending scan, step or tune. + * + * If method returns OK, ITunerCallback.tuneComplete_1_1() MUST be called: + * - once successfully tuned; + * - after a time out; + * - after a full band scan, if no station found. + * + * The tuned field of ProgramInfo should indicate if tuned to a valid + * station or not. + * + * @param program Program to tune to. + * @return result OK if successfully started tunning. + * INVALID_ARGUMENTS if invalid arguments are passed. + * NOT_INITIALIZED if another error occurs. + */ + tune_1_1(ProgramSelector program) generates (Result result); + /** * Retrieve current station information. * @return result OK if scan successfully started diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index 9b39d36eea..bb07f36a5a 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -20,6 +20,7 @@ #include "BroadcastRadio.h" #include "Tuner.h" +#include #include namespace android { @@ -70,6 +71,8 @@ Return Tuner::setConfiguration(const BandConfig& config) { mAmfmConfig = move(config); mAmfmConfig.antennaConnected = true; + mCurrentProgram = utils::make_selector(mAmfmConfig.type, mAmfmConfig.lowerLimit); + mIsAmfmConfigSet = true; mCallback->configChange(Result::OK, mAmfmConfig); }; @@ -90,28 +93,31 @@ Return Tuner::getConfiguration(getConfiguration_cb _hidl_cb) { return Void(); } -// makes ProgramInfo that points to no channel -static ProgramInfo makeDummyProgramInfo(uint32_t channel) { +// makes ProgramInfo that points to no program +static ProgramInfo makeDummyProgramInfo(const ProgramSelector& selector) { ProgramInfo info11 = {}; auto& info10 = info11.base; - info10.channel = channel; + utils::getLegacyChannel(selector, info10.channel, info10.subChannel); + info11.selector = selector; info11.flags |= ProgramInfoFlags::MUTED; return info11; } -void Tuner::tuneInternalLocked() { +void Tuner::tuneInternalLocked(const ProgramSelector& sel) { VirtualRadio* virtualRadio = nullptr; if (mAmfmConfig.type == Band::FM_HD || mAmfmConfig.type == Band::FM) { virtualRadio = &mVirtualFm; } VirtualProgram virtualProgram; - if (virtualRadio != nullptr && virtualRadio->getProgram(mCurrentProgram, virtualProgram)) { + if (virtualRadio != nullptr && virtualRadio->getProgram(sel, virtualProgram)) { + mCurrentProgram = virtualProgram.selector; mCurrentProgramInfo = static_cast(virtualProgram); } else { - mCurrentProgramInfo = makeDummyProgramInfo(mCurrentProgram); + mCurrentProgram = sel; + mCurrentProgramInfo = makeDummyProgramInfo(sel); } mIsTuneCompleted = true; @@ -152,7 +158,7 @@ Return Tuner::scan(Direction direction, bool skipSubChannel __unused) { auto found = lower_bound(list.begin(), list.end(), VirtualProgram({current})); if (direction == Direction::UP) { if (found < list.end() - 1) { - if (found->channel == current) found++; + if (utils::tunesTo(current, found->selector)) found++; } else { found = list.begin(); } @@ -163,25 +169,31 @@ Return Tuner::scan(Direction direction, bool skipSubChannel __unused) { found = list.end() - 1; } } - auto tuneTo = found->channel; + auto tuneTo = found->selector; mIsTuneCompleted = false; auto task = [this, tuneTo, direction]() { ALOGI("Performing scan %s", toString(direction).c_str()); lock_guard lk(mMut); - mCurrentProgram = tuneTo; - tuneInternalLocked(); + tuneInternalLocked(tuneTo); }; mThread.schedule(task, gDefaultDelay.scan); return Result::OK; } -Return Tuner::step(Direction direction, bool skipSubChannel __unused) { +Return Tuner::step(Direction direction, bool skipSubChannel) { ALOGV("%s", __func__); + ALOGW_IF(!skipSubChannel, "can't step to next frequency without ignoring subChannel"); lock_guard lk(mMut); + + if (!utils::isAmFm(utils::getType(mCurrentProgram))) { + ALOGE("Can't step in anything else than AM/FM"); + return Result::NOT_INITIALIZED; + } + ALOGW_IF(!mIsAmfmConfigSet, "AM/FM config not set"); if (!mIsAmfmConfigSet) return Result::INVALID_STATE; mIsTuneCompleted = false; @@ -191,57 +203,73 @@ Return Tuner::step(Direction direction, bool skipSubChannel __unused) { lock_guard lk(mMut); + auto current = utils::getId(mCurrentProgram, IdentifierType::AMFM_FREQUENCY, 0); + if (direction == Direction::UP) { - mCurrentProgram += mAmfmConfig.spacings[0]; + current += mAmfmConfig.spacings[0]; } else { - mCurrentProgram -= mAmfmConfig.spacings[0]; + current -= mAmfmConfig.spacings[0]; } - if (mCurrentProgram > mAmfmConfig.upperLimit) mCurrentProgram = mAmfmConfig.lowerLimit; - if (mCurrentProgram < mAmfmConfig.lowerLimit) mCurrentProgram = mAmfmConfig.upperLimit; + if (current > mAmfmConfig.upperLimit) current = mAmfmConfig.lowerLimit; + if (current < mAmfmConfig.lowerLimit) current = mAmfmConfig.upperLimit; - tuneInternalLocked(); + tuneInternalLocked(utils::make_selector(mAmfmConfig.type, current)); }; mThread.schedule(task, gDefaultDelay.step); return Result::OK; } -Return Tuner::tune(uint32_t channel, uint32_t subChannel) { +Return Tuner::tune(uint32_t channel, uint32_t subChannel) { ALOGV("%s(%d, %d)", __func__, channel, subChannel); + Band band; + { + lock_guard lk(mMut); + band = mAmfmConfig.type; + } + return tune_1_1(utils::make_selector(band, channel, subChannel)); +} + +Return Tuner::tune_1_1(const ProgramSelector& sel) { + ALOGV("%s(%s)", __func__, toString(sel).c_str()); lock_guard lk(mMut); - ALOGW_IF(!mIsAmfmConfigSet, "AM/FM config not set"); - if (!mIsAmfmConfigSet) return Result::INVALID_STATE; - if (channel < mAmfmConfig.lowerLimit || channel > mAmfmConfig.upperLimit) { - return Result::INVALID_ARGUMENTS; - } - mIsTuneCompleted = false; - auto task = [this, channel]() { + if (utils::isAmFm(utils::getType(mCurrentProgram))) { + ALOGW_IF(!mIsAmfmConfigSet, "AM/FM config not set"); + if (!mIsAmfmConfigSet) return Result::INVALID_STATE; + + auto freq = utils::getId(sel, IdentifierType::AMFM_FREQUENCY); + if (freq < mAmfmConfig.lowerLimit || freq > mAmfmConfig.upperLimit) { + return Result::INVALID_ARGUMENTS; + } + } + + mIsTuneCompleted = false; + auto task = [this, sel]() { lock_guard lk(mMut); - mCurrentProgram = channel; - tuneInternalLocked(); + tuneInternalLocked(sel); }; mThread.schedule(task, gDefaultDelay.tune); return Result::OK; } -Return Tuner::cancel() { +Return Tuner::cancel() { ALOGV("%s", __func__); mThread.cancelAll(); return Result::OK; } -Return Tuner::getProgramInformation(getProgramInformation_cb _hidl_cb) { +Return Tuner::getProgramInformation(getProgramInformation_cb _hidl_cb) { ALOGV("%s", __func__); return getProgramInformation_1_1([&](Result result, const ProgramInfo& info) { _hidl_cb(result, info.base); }); } -Return Tuner::getProgramInformation_1_1(getProgramInformation_1_1_cb _hidl_cb) { +Return Tuner::getProgramInformation_1_1(getProgramInformation_1_1_cb _hidl_cb) { ALOGV("%s", __func__); lock_guard lk(mMut); diff --git a/broadcastradio/1.1/default/Tuner.h b/broadcastradio/1.1/default/Tuner.h index 7719d4d581..17ee99f0d1 100644 --- a/broadcastradio/1.1/default/Tuner.h +++ b/broadcastradio/1.1/default/Tuner.h @@ -39,6 +39,7 @@ struct Tuner : public ITuner { Return scan(V1_0::Direction direction, bool skipSubChannel) override; Return step(V1_0::Direction direction, bool skipSubChannel) override; Return tune(uint32_t channel, uint32_t subChannel) override; + Return tune_1_1(const ProgramSelector& program) override; Return cancel() override; Return getProgramInformation(getProgramInformation_cb _hidl_cb) override; Return getProgramInformation_1_1(getProgramInformation_1_1_cb _hidl_cb) override; @@ -60,10 +61,10 @@ struct Tuner : public ITuner { bool mIsAmfmConfigSet = false; V1_0::BandConfig mAmfmConfig; bool mIsTuneCompleted = false; - uint32_t mCurrentProgram; // TODO(b/32621193): Station Selector + ProgramSelector mCurrentProgram = {}; ProgramInfo mCurrentProgramInfo = {}; - void tuneInternalLocked(); + void tuneInternalLocked(const ProgramSelector& sel); }; } // namespace implementation diff --git a/broadcastradio/1.1/default/VirtualProgram.cpp b/broadcastradio/1.1/default/VirtualProgram.cpp index df12a3ea17..ef8bd1c43d 100644 --- a/broadcastradio/1.1/default/VirtualProgram.cpp +++ b/broadcastradio/1.1/default/VirtualProgram.cpp @@ -15,6 +15,8 @@ */ #include "VirtualProgram.h" +#include + namespace android { namespace hardware { namespace broadcastradio { @@ -29,10 +31,12 @@ VirtualProgram::operator ProgramInfo() const { ProgramInfo info11 = {}; auto& info10 = info11.base; - info10.channel = channel; + utils::getLegacyChannel(selector, info10.channel, info10.subChannel); + info11.selector = selector; info10.tuned = true; info10.stereo = true; - info10.signalStrength = 100; + info10.digital = utils::isDigital(selector); + info10.signalStrength = info10.digital ? 100 : 80; info10.metadata = hidl_vec({ {MetadataType::TEXT, MetadataKey::RDS_PS, {}, {}, programName, {}}, @@ -43,8 +47,25 @@ VirtualProgram::operator ProgramInfo() const { return info11; } +// Defining order on virtual programs, how they appear on band. +// It's mostly for default implementation purposes, may not be complete or correct. bool operator<(const VirtualProgram& lhs, const VirtualProgram& rhs) { - return lhs.channel < rhs.channel; + auto& l = lhs.selector; + auto& r = rhs.selector; + + // Two programs with the same primaryId is considered the same. + if (l.programType != r.programType) return l.programType < r.programType; + if (l.primaryId.type != r.primaryId.type) return l.primaryId.type < r.primaryId.type; + if (l.primaryId.value != r.primaryId.value) return l.primaryId.value < r.primaryId.value; + + // A little exception for HD Radio subchannel - we check secondary ID too. + if (utils::hasId(l, IdentifierType::HD_SUBCHANNEL) && + utils::hasId(r, IdentifierType::HD_SUBCHANNEL)) { + return utils::getId(l, IdentifierType::HD_SUBCHANNEL) < + utils::getId(r, IdentifierType::HD_SUBCHANNEL); + } + + return false; } } // namespace implementation diff --git a/broadcastradio/1.1/default/VirtualProgram.h b/broadcastradio/1.1/default/VirtualProgram.h index 303513f4bc..a4fd72c32b 100644 --- a/broadcastradio/1.1/default/VirtualProgram.h +++ b/broadcastradio/1.1/default/VirtualProgram.h @@ -26,7 +26,7 @@ namespace V1_1 { namespace implementation { struct VirtualProgram { - uint32_t channel; // TODO(b/32621193): Station Selector + ProgramSelector selector; std::string programName = ""; std::string songArtist = ""; diff --git a/broadcastradio/1.1/default/VirtualRadio.cpp b/broadcastradio/1.1/default/VirtualRadio.cpp index 0eab7aee72..acf37a40e7 100644 --- a/broadcastradio/1.1/default/VirtualRadio.cpp +++ b/broadcastradio/1.1/default/VirtualRadio.cpp @@ -15,25 +15,31 @@ */ #include "VirtualRadio.h" +#include + namespace android { namespace hardware { namespace broadcastradio { namespace V1_1 { namespace implementation { +using V1_0::Band; + using std::lock_guard; using std::move; using std::mutex; using std::vector; +using utils::make_selector; + vector gInitialFmPrograms{ - {94900, "Wild 94.9", "Drake ft. Rihanna", "Too Good"}, - {96500, "KOIT", "Celine Dion", "All By Myself"}, - {97300, "Alice@97.3", "Drops of Jupiter", "Train"}, - {99700, "99.7 Now!", "The Chainsmokers", "Closer"}, - {101300, "101-3 KISS-FM", "Justin Timberlake", "Rock Your Body"}, - {103700, "iHeart80s @ 103.7", "Michael Jackson", "Billie Jean"}, - {106100, "106 KMEL", "Drake", "Marvins Room"}, + {make_selector(Band::FM, 94900), "Wild 94.9", "Drake ft. Rihanna", "Too Good"}, + {make_selector(Band::FM, 96500), "KOIT", "Celine Dion", "All By Myself"}, + {make_selector(Band::FM, 97300), "Alice@97.3", "Drops of Jupiter", "Train"}, + {make_selector(Band::FM, 99700), "99.7 Now!", "The Chainsmokers", "Closer"}, + {make_selector(Band::FM, 101300), "101-3 KISS-FM", "Justin Timberlake", "Rock Your Body"}, + {make_selector(Band::FM, 103700), "iHeart80s @ 103.7", "Michael Jackson", "Billie Jean"}, + {make_selector(Band::FM, 106100), "106 KMEL", "Drake", "Marvins Room"}, }; VirtualRadio::VirtualRadio(VirtualRadio&& o) : mPrograms(move(o.mPrograms)) {} @@ -45,10 +51,10 @@ vector VirtualRadio::getProgramList() { return mPrograms; } -bool VirtualRadio::getProgram(uint32_t channel, VirtualProgram& programOut) { +bool VirtualRadio::getProgram(const ProgramSelector& selector, VirtualProgram& programOut) { lock_guard lk(mMut); for (auto&& program : mPrograms) { - if (program.channel == channel) { + if (utils::tunesTo(selector, program.selector)) { programOut = program; return true; } diff --git a/broadcastradio/1.1/default/VirtualRadio.h b/broadcastradio/1.1/default/VirtualRadio.h index e1918a0583..23cb06c619 100644 --- a/broadcastradio/1.1/default/VirtualRadio.h +++ b/broadcastradio/1.1/default/VirtualRadio.h @@ -33,7 +33,7 @@ class VirtualRadio { VirtualRadio(std::vector initialList); std::vector getProgramList(); - bool getProgram(uint32_t channel, VirtualProgram& program); + bool getProgram(const ProgramSelector& selector, VirtualProgram& program); private: std::mutex mMut; diff --git a/broadcastradio/1.1/types.hal b/broadcastradio/1.1/types.hal index 5577ea02da..dee38b8c45 100644 --- a/broadcastradio/1.1/types.hal +++ b/broadcastradio/1.1/types.hal @@ -67,12 +67,157 @@ struct Properties { string vendorExension; }; +/** + * Type of a radio technology. + * + * All other values are reserved for future use. + */ +enum ProgramType : uint32_t { + AM = 1, // analogue AM radio (with or without RDS) + FM, // analogue FM radio (with or without RDS) + AM_HD, // AM HD Radio + FM_HD, // FM HD Radio + DAB, // Digital audio broadcasting + DRMO, // Digital Radio Mondiale + SXM, // SiriusXM Satellite Radio + VENDOR, // vendor-specific, not synced across devices +}; + +/** + * Type of program identifier component. + * + * It MUST match the radio technology for primary ID but does not have to match + * it for secondary IDs. For example, a satellite program may set AM/FM fallback + * frequency, if a station broadcasts both via satellite and AM/FM. + * + * The value format for each (but VENDOR_PRIMARY) identifier is strictly defined + * to maintain interoperability between devices made by different vendors. + * + * All other values are reserved for future use. + */ +enum IdentifierType : uint32_t { + AMFM_FREQUENCY = 1, // kHz + RDS_PI, // 16bit + + /** + * 64bit compound primary identifier for HD Radio. + * + * Consists of (from the LSB): + * - 32bit: Station ID number; + * - 4bit: HD_SUBCHANNEL; + * - 18bit: AMFM_FREQUENCY. + * The remaining bits should be set to zeros when writing on the chip side + * and ignored when read. + */ + HD_STATION_ID_EXT, + + /** + * HD Radio subchannel - a value of range 0-7. + * + * The subchannel index is 0-based (where 0 is MPS and 1..7 are SPS), + * as opposed to HD Radio standard (where it's 1-based). + */ + HD_SUBCHANNEL, + + /** + * 24bit compound primary identifier for DAB. + * + * Consists of (from the LSB): + * - 16bit: SId; + * - 8bit: ECC code. + * The remaining bits should be set to zeros when writing on the chip side + * and ignored when read. + */ + DAB_SIDECC, + + DAB_ENSEMBLE, // 16bit + DAB_SCID, // 12bit + DAB_FREQUENCY, // kHz + DRMO_SERVICE_ID, // 24bit + DRMO_FREQUENCY, // kHz + SXM_SERVICE_ID, // 32bit + SXM_CHANNEL, // 0-999 range + + /** + * Primary identifier for vendor-specific radio technology. + * The value format is determined by a vendor. + * + * It must not be used in any other programType than VENDOR. + */ + VENDOR_PRIMARY, +}; + +/** + * A single program identifier component, eg. frequency or channel ID. + * + * The uint32_t type field maps to IdentifierType enum. It's not straight, + * because the enum may be extended in future versions of the HAL. Values out of + * the enum range must not be used when writing and ignored when reading. + * + * The uint64_t value field holds the value in format described in comments for + * IdentifierType enum. + */ +struct ProgramIdentifier { + uint32_t type; // IdentifierType + uint64_t value; +}; + +/** + * A set of identifiers necessary to tune to a given station. + * + * This can hold various identifiers, like + * - AM/FM frequency + * - HD Radio subchannel + * - DAB channel info + * + * The uint32_t programType field maps to ProgramType enum. It's not straight, + * because the enum may be extended in future versions of the HAL. Values out of + * the enum range must not be used when writing and ignored when reading. + * + * The primary ID uniquely identifies a station and can be used for equality + * check. The secondary IDs are supplementary and can speed up tuning process, + * but the primary ID is sufficient (ie. after a full band scan). + * + * Two selectors with different secondary IDs, but the same primary ID are + * considered equal. In particular, secondary IDs vector may get updated for + * an entry on the program list (ie. when a better frequency for a given + * station is found). + * + * The primaryId of a given programType MUST be of a specific type: + * - AM, FM: RDS_PI if the station broadcasts RDS, AMFM_FREQUENCY otherwise; + * - AM_HD, FM_HD: HD_STATION_ID_EXT; + * - DAB: DAB_SIDECC; + * - DRMO: DRMO_SERVICE_ID; + * - SXM: SXM_SERVICE_ID; + * - VENDOR: VENDOR_PRIMARY. + */ +struct ProgramSelector { + uint32_t programType; // ProgramType + ProgramIdentifier primaryId; // uniquely identifies a station + vec secondaryIds; + + /** + * Opaque vendor-specific identifiers, to be passed to front-end + * without changes. + * + * The order is meaningful, ie. the first element may be defined as + * frequency, second as the subchannel etc. + * + * The vector is not serialized (either locally or to the cloud), + * unless it's a VENDOR program type. + */ + vec vendorIds; +}; + /** * Radio program information. Returned by the HAL with event RADIO_EVENT_TUNED. * Contains information on currently tuned channel. */ struct ProgramInfo { @1.0::ProgramInfo base; + + ProgramSelector selector; + bitfield flags; /** diff --git a/broadcastradio/1.1/utils/Android.bp b/broadcastradio/1.1/utils/Android.bp index fab6517938..df5e8e02c1 100644 --- a/broadcastradio/1.1/utils/Android.bp +++ b/broadcastradio/1.1/utils/Android.bp @@ -24,7 +24,11 @@ cc_library_static { "-Werror", ], srcs: [ + "Utils.cpp", "WorkerThread.cpp", ], export_include_dirs: ["."], + shared_libs: [ + "android.hardware.broadcastradio@1.1", + ], } diff --git a/broadcastradio/1.1/utils/Utils.cpp b/broadcastradio/1.1/utils/Utils.cpp new file mode 100644 index 0000000000..9dc0a53cd3 --- /dev/null +++ b/broadcastradio/1.1/utils/Utils.cpp @@ -0,0 +1,207 @@ +/* + * Copyright (C) 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 "BroadcastRadioDefault.utils" +//#define LOG_NDEBUG 0 + +#include "Utils.h" + +#include + +namespace android { +namespace hardware { +namespace broadcastradio { +namespace V1_1 { +namespace implementation { +namespace utils { + +using V1_0::Band; + +static bool isCompatibleProgramType(const uint32_t ia, const uint32_t ib) { + auto a = static_cast(ia); + auto b = static_cast(ib); + + if (a == b) return true; + if (a == ProgramType::AM && b == ProgramType::AM_HD) return true; + if (a == ProgramType::AM_HD && b == ProgramType::AM) return true; + if (a == ProgramType::FM && b == ProgramType::FM_HD) return true; + if (a == ProgramType::FM_HD && b == ProgramType::FM) return true; + return false; +} + +static bool bothHaveId(const ProgramSelector& a, const ProgramSelector& b, + const IdentifierType type) { + return hasId(a, type) && hasId(b, type); +} + +static bool anyHaveId(const ProgramSelector& a, const ProgramSelector& b, + const IdentifierType type) { + return hasId(a, type) || hasId(b, type); +} + +static bool haveEqualIds(const ProgramSelector& a, const ProgramSelector& b, + const IdentifierType type) { + if (!bothHaveId(a, b, type)) return false; + // TODO(b/36864090): we should check all Ids of a given type (ie. other AF), not just one + auto aId = getId(a, type); + auto bId = getId(b, type); + return aId == bId; +} + +bool tunesTo(const ProgramSelector& a, const ProgramSelector& b) { + if (!isCompatibleProgramType(a.programType, b.programType)) return false; + + auto type = getType(a); + + switch (type) { + case ProgramType::AM: + case ProgramType::AM_HD: + case ProgramType::FM: + case ProgramType::FM_HD: + if (haveEqualIds(a, b, IdentifierType::HD_STATION_ID_EXT)) return true; + + // if HD Radio subchannel is specified, it must match + if (anyHaveId(a, b, IdentifierType::HD_SUBCHANNEL)) { + // missing subchannel (analog) is an equivalent of first subchannel (MPS) + auto aCh = getId(a, IdentifierType::HD_SUBCHANNEL, 0); + auto bCh = getId(b, IdentifierType::HD_SUBCHANNEL, 0); + if (aCh != bCh) return false; + } + + if (haveEqualIds(a, b, IdentifierType::RDS_PI)) return true; + + return haveEqualIds(a, b, IdentifierType::AMFM_FREQUENCY); + case ProgramType::DAB: + return haveEqualIds(a, b, IdentifierType::DAB_SIDECC); + case ProgramType::DRMO: + return haveEqualIds(a, b, IdentifierType::DRMO_SERVICE_ID); + case ProgramType::SXM: + if (anyHaveId(a, b, IdentifierType::SXM_SERVICE_ID)) { + return haveEqualIds(a, b, IdentifierType::SXM_SERVICE_ID); + } + return haveEqualIds(a, b, IdentifierType::SXM_CHANNEL); + case ProgramType::VENDOR: + default: + ALOGW("Unsupported program type: %s", toString(type).c_str()); + return false; + } +} + +ProgramType getType(const ProgramSelector& sel) { + return static_cast(sel.programType); +} + +bool isAmFm(const ProgramType type) { + switch (type) { + case ProgramType::AM: + case ProgramType::FM: + case ProgramType::AM_HD: + case ProgramType::FM_HD: + return true; + default: + return false; + } +} + +bool hasId(const ProgramSelector& sel, const IdentifierType type) { + auto itype = static_cast(type); + if (sel.primaryId.type == itype) return true; + // not optimal, but we don't care in default impl + for (auto&& id : sel.secondaryIds) { + if (id.type == itype) return true; + } + return false; +} + +uint64_t getId(const ProgramSelector& sel, const IdentifierType type) { + auto itype = static_cast(type); + if (sel.primaryId.type == itype) return sel.primaryId.value; + // not optimal, but we don't care in default impl + for (auto&& id : sel.secondaryIds) { + if (id.type == itype) return id.value; + } + ALOGW("Identifier %s not found", toString(type).c_str()); + return 0; +} + +uint64_t getId(const ProgramSelector& sel, const IdentifierType type, uint64_t defval) { + if (!hasId(sel, type)) return defval; + return getId(sel, type); +} + +ProgramSelector make_selector(Band band, uint32_t channel, uint32_t subChannel) { + ProgramSelector sel = {}; + + ALOGW_IF((subChannel > 0) && (band == Band::AM || band == Band::FM), + "got subChannel for non-HD AM/FM"); + + // we can't use ProgramType::AM_HD or FM_HD, because we don't know HD station ID + ProgramType type; + switch (band) { + case Band::AM: + case Band::AM_HD: + type = ProgramType::AM; + break; + case Band::FM: + case Band::FM_HD: + type = ProgramType::FM; + break; + default: + LOG_ALWAYS_FATAL("Unsupported band: %s", toString(band).c_str()); + } + + sel.programType = static_cast(type); + sel.primaryId.type = static_cast(IdentifierType::AMFM_FREQUENCY); + sel.primaryId.value = channel; + if (subChannel > 0) { + // stating sub channel for AM/FM channel does not give any guarantees, + // but we can't do much more without HD station ID + sel.secondaryIds = hidl_vec{ + {static_cast(IdentifierType::HD_SUBCHANNEL), subChannel}, + }; + } + + return sel; +} + +bool getLegacyChannel(const ProgramSelector& sel, uint32_t& channelOut, uint32_t& subChannelOut) { + if (isAmFm(getType(sel))) { + channelOut = getId(sel, IdentifierType::AMFM_FREQUENCY); + subChannelOut = getId(sel, IdentifierType::HD_SUBCHANNEL, 0); + return true; + } else { + channelOut = 0; + subChannelOut = 0; + return false; + } +} + +bool isDigital(const ProgramSelector& sel) { + switch (getType(sel)) { + case ProgramType::AM: + case ProgramType::FM: + return false; + default: + // VENDOR might not be digital, but it doesn't matter for default impl. + return true; + } +} + +} // namespace utils +} // namespace implementation +} // namespace V1_1 +} // namespace broadcastradio +} // namespace hardware +} // namespace android diff --git a/broadcastradio/1.1/utils/Utils.h b/broadcastradio/1.1/utils/Utils.h new file mode 100644 index 0000000000..1110e79f6d --- /dev/null +++ b/broadcastradio/1.1/utils/Utils.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 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. + */ +#ifndef ANDROID_HARDWARE_BROADCASTRADIO_V1_1_UTILS_H +#define ANDROID_HARDWARE_BROADCASTRADIO_V1_1_UTILS_H + +#include +#include +#include +#include + +namespace android { +namespace hardware { +namespace broadcastradio { +namespace V1_1 { +namespace implementation { +namespace utils { + +/** + * Checks, if {@code pointer} tunes to {@channel}. + * + * For example, having a channel {AMFM_FREQUENCY = 103.3}: + * - selector {AMFM_FREQUENCY = 103.3, HD_SUBCHANNEL = 0} can tune to this channel; + * - selector {AMFM_FREQUENCY = 103.3, HD_SUBCHANNEL = 1} can't. + * + * @param pointer selector we're trying to match against channel. + * @param channel existing channel. + */ +bool tunesTo(const ProgramSelector& pointer, const ProgramSelector& channel); + +ProgramType getType(const ProgramSelector& sel); +bool isAmFm(const ProgramType type); + +bool hasId(const ProgramSelector& sel, const IdentifierType type); + +/** + * Returns ID (either primary or secondary) for a given program selector. + * + * If the selector does not contain given type, returns 0 and emits a warning. + */ +uint64_t getId(const ProgramSelector& sel, const IdentifierType type); + +/** + * Returns ID (either primary or secondary) for a given program selector. + * + * If the selector does not contain given type, returns default value. + */ +uint64_t getId(const ProgramSelector& sel, const IdentifierType type, uint64_t defval); + +ProgramSelector make_selector(V1_0::Band band, uint32_t channel, uint32_t subChannel = 0); + +bool getLegacyChannel(const ProgramSelector& sel, uint32_t& channelOut, uint32_t& subChannelOut); + +bool isDigital(const ProgramSelector& sel); + +} // namespace utils +} // namespace implementation +} // namespace V1_1 +} // namespace broadcastradio +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_BROADCASTRADIO_V1_1_UTILS_H diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index b45c8d5b65..0de6fa5c78 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -48,7 +48,7 @@ using ::android::hardware::broadcastradio::V1_1::ITunerCallback; using ::android::hardware::broadcastradio::V1_1::ProgramInfo; using ::android::hardware::broadcastradio::V1_1::Result; using ::android::hardware::broadcastradio::V1_1::ProgramListResult; - +using ::android::hardware::hidl_vec; // The main test class for Broadcast Radio HIDL HAL. @@ -134,7 +134,9 @@ class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase { return Void(); } - virtual Return backgroundScanComplete(ProgramListResult result __unused) { + virtual Return backgroundScanComplete(ProgramListResult result) { + ALOGV("%s", __func__); + mParentTest->onProgramListResultCallback(result); return Void(); } @@ -176,6 +178,15 @@ class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase { onCallback_l(); } + /** + * Method called by MyCallback when a callback with status is received + */ + void onProgramListResultCallback(ProgramListResult result) { + Mutex::Autolock _l(mLock); + mProgramListResultCallbackData = result; + onCallback_l(); + } + /** * Method called by MyCallback when a boolean indication is received */ @@ -221,6 +232,7 @@ class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase { static const nsecs_t kConfigCallbacktimeoutNs = seconds_to_nanoseconds(10); static const nsecs_t kTuneCallbacktimeoutNs = seconds_to_nanoseconds(30); + static const nsecs_t kFullScanTimeoutNs = seconds_to_nanoseconds(60); sp mRadio; Properties mHalProperties; @@ -231,6 +243,7 @@ class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase { bool mCallbackCalled; bool mBoolCallbackData; Result mResultCallbackData; + ProgramListResult mProgramListResultCallbackData; bool mHwFailure; }; @@ -467,6 +480,53 @@ TEST_F(BroadcastRadioHidlTest, TuneAndGetProgramInformationAndCancel) { EXPECT_EQ(Result::OK, hidlResult); } +TEST_F(BroadcastRadioHidlTest, TuneFromProgramList) { + ASSERT_TRUE(openTuner()); + ASSERT_TRUE(checkAntenna()); + + ProgramInfo firstProgram; + bool isListEmpty; + ProgramListResult getListResult = ProgramListResult::NOT_INITIALIZED; + auto getListCb = [&](ProgramListResult result, const hidl_vec& list) { + getListResult = result; + if (result != ProgramListResult::OK) return; + isListEmpty = (list.size() == 0); + // don't copy the whole list out, it might be heavy + if (!isListEmpty) firstProgram = list[0]; + }; + + // first try... + auto hidlReturn = mTuner->getProgramList("", getListCb); + ASSERT_TRUE(hidlReturn.isOk()); + + if (getListResult == ProgramListResult::NOT_STARTED) { + auto result = mTuner->startBackgroundScan(); + ASSERT_TRUE(result.isOk()); + ASSERT_EQ(ProgramListResult::OK, result); + getListResult = ProgramListResult::NOT_READY; // continue as in NOT_READY case + } + if (getListResult == ProgramListResult::NOT_READY) { + ASSERT_TRUE(waitForCallback(kFullScanTimeoutNs)); + ASSERT_EQ(ProgramListResult::OK, mProgramListResultCallbackData); + + // second (last) try... + hidlReturn = mTuner->getProgramList("", getListCb); + ASSERT_TRUE(hidlReturn.isOk()); + ASSERT_EQ(ProgramListResult::OK, getListResult); + } + + if (isListEmpty) { + std::cout << "[ SKIPPED ] Program list is empty. " << std::endl; + return; + } + + auto tuneResult = mTuner->tune_1_1(firstProgram.selector); + ASSERT_TRUE(tuneResult.isOk()); + EXPECT_EQ(Result::OK, tuneResult); + EXPECT_EQ(true, waitForCallback(kTuneCallbacktimeoutNs)); + // TODO(b/36864490): check this too, when mProgramInfoCallbackData is cherry-picked from 1.0 + // EXPECT_EQ(firstProgram.selector.primaryId, mProgramInfoCallbackData.selector.primaryId); +} int main(int argc, char** argv) { ::testing::AddGlobalTestEnvironment(new BroadcastRadioHidlEnvironment); From 7a5614bc9edc70c82525524674d18dcefe3f5398 Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Fri, 7 Jul 2017 17:17:11 -0700 Subject: [PATCH 035/265] Revert "Revert of "Audio: Add XML schema for audio effects configuration"" Add the configuration back on the master development branch. This reverts commit d5196af81437013e6238823e71e48ca51d39addc. Bug: 37492580 Change-Id: Ie2d3218d942a995aec4d6b73fb7813e76604066b Test: not needed --- .../2.0/xml/audio_effects_conf_V2_0.xsd | 238 ++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd diff --git a/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd b/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd new file mode 100644 index 0000000000..64647de2a3 --- /dev/null +++ b/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd @@ -0,0 +1,238 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + List of effect libraries to load. Each library element must have "name" and + "path" attributes. The latter is giving the full path of the library .so file. + + Example: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + List of effects to load. Each effect element must contain "name", + "library", and "uuid" attrs. The value of the "library" attr must + correspond to the name of a "library" element. The name of the effect + element is indicative, only the value of the "uuid" element designates + the effect for the audio framework. The uuid is the implementation + specific UUID as specified by the effect vendor. This is not the generic + effect type UUID. + + For effect proxy implementations, SW and HW implemetations of the effect + can be specified. + + Example: + + + + + + + + + + + + + + + + + + + + + + + + + + Audio preprocessing configuration. The processing configuration consists + of a list of elements each describing processing settings for a given + input stream. Valid input stream types are listed in "streamInputType". + + Each stream element contains a list of "apply" elements. The value of the + "effect" attr must correspond to the name of an "effect" element. + + Example: + + + + + + + + + + + + + + + + + + Audio postprocessing configuration. The processing configuration consists + of a list of elements each describing processing settings for a given + output stream. Valid output stream types are listed in "streamOutputType". + + Each stream element contains a list of "apply" elements. The value of the + "effect" attr must correspond to the name of an "effect" element. + + Example: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 627fdaae3d59bff8adb9c4ee9e47f0ac1ecdc7e1 Mon Sep 17 00:00:00 2001 From: Kevin Rocard Date: Wed, 7 Jun 2017 15:25:03 -0700 Subject: [PATCH 036/265] Audio effect XSD: Give effect proxy its own tag Effect and effect proxy do not have the same xml structure. As they had the same xml tag, it was impossible to discriminate them in the xsd. Leading to xsd validating incorrect xml. This patch changes the xsd to force proxy effect to have the type instead of . With this patch, effects have to be explicit about being a proxy and they are forced to have a hw *and* a sw library. Bug: 37492580 Test: validated xsd against converted effects.conf Test: vendor/box/user/mnaganov/audio-effects-conf/test.sh Change-Id: Idf8a1040feccbfd6a346ab9bc892f3b7e87df530 Signed-off-by: Kevin Rocard --- .../2.0/xml/audio_effects_conf_V2_0.xsd | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd b/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd index 64647de2a3..52653032bc 100644 --- a/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd +++ b/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd @@ -58,7 +58,7 @@ - + List of effect libraries to load. Each library element must have "name" and @@ -83,18 +83,24 @@ - + - - - - - + + + + + + + + + + + List of effects to load. Each effect element must contain "name", @@ -111,16 +117,17 @@ Example: - + - + - - - + + + + @@ -185,8 +192,8 @@ - - + + From 3296cee7e533de55eb6bb20c3518fa53261004a3 Mon Sep 17 00:00:00 2001 From: Kevin Rocard Date: Mon, 26 Jun 2017 15:50:33 -0700 Subject: [PATCH 037/265] Configure audio effects libraries with relative path audio effects.conf legacy format had the libraries specified in absolute path. Nevertheless those libraries must be in specific folders. The .conf loader used to strip the prefix of the paths then try to load the libraries in those specific folders. With new xml format the user only has to specify the name of the library and the loader will load it from the known folders. Test: run xmllint against a config with absolute paths Bug: 37492580 Change-Id: I2863e04b3cdf0c6758d9f7be33796621fee527ed Signed-off-by: Kevin Rocard --- audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd b/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd index 52653032bc..9ae1621f12 100644 --- a/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd +++ b/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd @@ -56,17 +56,22 @@ + + + + + List of effect libraries to load. Each library element must have "name" and - "path" attributes. The latter is giving the full path of the library .so file. + "path" attributes. The latter is giving the path of the library .so file + relative to the standard effect folders: /(vendor|odm|system)/lib(64)?/soundfx/ - Example: - - + Example for a library in "/vendor/lib/soundfx/lib.so": + @@ -74,7 +79,7 @@ - + From 6a0af3c51b3fa26bd1023facba771fc242a53b60 Mon Sep 17 00:00:00 2001 From: Kevin Rocard Date: Mon, 26 Jun 2017 15:50:33 -0700 Subject: [PATCH 038/265] Can not specify an audio effect for the default stream The default stream is an alias to an other stream. One can not allocate effects for it in the configuration as it could conflict with the stream it aliases. Test: run xmllint against all audio effect configs Bug: 37492580 Change-Id: Ia2bbc13b5cf2a0a40e5eeff7ee22a7423ec16767 Signed-off-by: Kevin Rocard --- audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd | 1 - 1 file changed, 1 deletion(-) diff --git a/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd b/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd index 9ae1621f12..ca6a7dc65b 100644 --- a/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd +++ b/audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd @@ -43,7 +43,6 @@ - From 6301fc325e194538952f4dff334d239571084934 Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Thu, 6 Jul 2017 17:42:08 -0700 Subject: [PATCH 039/265] Add VTS test for validating audio effects config against XML schema If the device contains /vendor/etc/audio_effects.xml (the new XML format for the audio effects configuration), the test validates this config against the schema contained in audio/effect/2.0/xml/audio_effects_conf_V2_0.xsd (pushed to the device by the VTS test runner) Change-Id: Ib57d30e3c1e32ce5d74f906a216f9bb8f635a28c Test: this is a test Bug: 37492580 --- audio/effect/2.0/vts/functional/Android.bp | 6 +++- .../ValidateAudioEffectsConfiguration.cpp | 30 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 audio/effect/2.0/vts/functional/ValidateAudioEffectsConfiguration.cpp diff --git a/audio/effect/2.0/vts/functional/Android.bp b/audio/effect/2.0/vts/functional/Android.bp index 8a370cd12d..b3002a4c90 100644 --- a/audio/effect/2.0/vts/functional/Android.bp +++ b/audio/effect/2.0/vts/functional/Android.bp @@ -17,7 +17,8 @@ cc_test { name: "VtsHalAudioEffectV2_0TargetTest", defaults: ["hidl_defaults"], - srcs: ["VtsHalAudioEffectV2_0TargetTest.cpp"], + srcs: ["VtsHalAudioEffectV2_0TargetTest.cpp", + "ValidateAudioEffectsConfiguration.cpp"], shared_libs: [ "libbase", "liblog", @@ -26,7 +27,9 @@ cc_test { "libhidltransport", "libnativehelper", "libutils", + "libxml2", "android.hardware.audio.common@2.0", + "android.hardware.audio.common.test.utility", "android.hardware.audio.effect@2.0", "android.hidl.allocator@1.0", "android.hidl.memory@1.0", @@ -35,5 +38,6 @@ cc_test { cflags: [ "-O0", "-g", + "-Wextra", ], } diff --git a/audio/effect/2.0/vts/functional/ValidateAudioEffectsConfiguration.cpp b/audio/effect/2.0/vts/functional/ValidateAudioEffectsConfiguration.cpp new file mode 100644 index 0000000000..fdc1347497 --- /dev/null +++ b/audio/effect/2.0/vts/functional/ValidateAudioEffectsConfiguration.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (C) 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. + */ + +#include + +#include "utility/ValidateXml.h" + +TEST(CheckConfig, audioEffectsConfigurationValidation) { + RecordProperty("description", + "Verify that the effects configuration file is valid according to the schema"); + const char* xmlConfigFile = "/vendor/etc/audio_effects.xml"; + // Not every device uses XML configuration, so only validate + // if the XML configuration actually exists. + if (access(xmlConfigFile, F_OK) == 0) { + ASSERT_VALID_XML(xmlConfigFile, "/data/local/tmp/audio_effects_conf_V2_0.xsd"); + } +} From ec648686db533589ee493bfd42f3ee03592a827c Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Mon, 10 Jul 2017 12:35:51 +0900 Subject: [PATCH 040/265] Build camera.device@1.0-impl with BOARD_VNDK_VERSION Add the dependency to media_plugin_headers since global include path is not provided when building with BOARD_VNDK_VERSION Bug: 37342627 Test: BOARD_VNDK_VERSION=current m -j camera.device@1.0-impl.vendor (cherry picked from commit ef25b10aeb5134046c9acc3fbddbda1783fd32f0) Change-Id: I506ad4d70b708d129cdc7842cc772c20d9b4197b --- camera/device/1.0/default/Android.bp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/camera/device/1.0/default/Android.bp b/camera/device/1.0/default/Android.bp index 1a349d6a3e..e0b31f0a48 100644 --- a/camera/device/1.0/default/Android.bp +++ b/camera/device/1.0/default/Android.bp @@ -26,6 +26,9 @@ cc_library_shared { static_libs: [ "android.hardware.camera.common@1.0-helper" ], + header_libs: [ + "media_plugin_headers", + ], include_dirs: [ "frameworks/native/include/media/openmax" ], From cb198f79904a7844e82e06b8e613b7e3a9466f64 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Mon, 10 Jul 2017 13:27:05 +0900 Subject: [PATCH 041/265] Build android.hardware.bluetooth* modules with BOARD_VNDK_VERSION Add missing headers that aren't automatically included when BOARD_VNDK_VERSION is set. Bug: 37342627 Test: BOARD_VNDK_VERSION=current m -j where is android.hardware.bluetooth-async.vendor, android.hardware.bluetooth@1.0-impl.vendor, and android.hardware.bluetooth-hci.vendor Change-Id: Ifb14d254fa358fbd2b9fbeecb028d6efd18e9483 --- bluetooth/1.0/default/async_fd_watcher.cc | 2 +- bluetooth/1.0/default/bluetooth_address.cc | 1 + bluetooth/1.0/default/h4_protocol.cc | 1 + bluetooth/1.0/default/hci_packetizer.cc | 1 + bluetooth/1.0/default/hci_protocol.cc | 1 + 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/bluetooth/1.0/default/async_fd_watcher.cc b/bluetooth/1.0/default/async_fd_watcher.cc index bc0bc928d2..78676b2fe4 100644 --- a/bluetooth/1.0/default/async_fd_watcher.cc +++ b/bluetooth/1.0/default/async_fd_watcher.cc @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include "fcntl.h" #include "sys/select.h" diff --git a/bluetooth/1.0/default/bluetooth_address.cc b/bluetooth/1.0/default/bluetooth_address.cc index 65dc6a6164..fd53e78ac7 100644 --- a/bluetooth/1.0/default/bluetooth_address.cc +++ b/bluetooth/1.0/default/bluetooth_address.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include namespace android { diff --git a/bluetooth/1.0/default/h4_protocol.cc b/bluetooth/1.0/default/h4_protocol.cc index 2008b00093..054ed39a5a 100644 --- a/bluetooth/1.0/default/h4_protocol.cc +++ b/bluetooth/1.0/default/h4_protocol.cc @@ -22,6 +22,7 @@ #include #include #include +#include namespace android { namespace hardware { diff --git a/bluetooth/1.0/default/hci_packetizer.cc b/bluetooth/1.0/default/hci_packetizer.cc index 2da1254531..fde08ac1cb 100644 --- a/bluetooth/1.0/default/hci_packetizer.cc +++ b/bluetooth/1.0/default/hci_packetizer.cc @@ -21,6 +21,7 @@ #include #include #include +#include #include namespace { diff --git a/bluetooth/1.0/default/hci_protocol.cc b/bluetooth/1.0/default/hci_protocol.cc index 5d6f1d1396..bf94dfe884 100644 --- a/bluetooth/1.0/default/hci_protocol.cc +++ b/bluetooth/1.0/default/hci_protocol.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include namespace android { From 2ee400dd9fb0a81a6ba8e688e52e3acd61783b59 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Mon, 10 Jul 2017 18:23:39 +0900 Subject: [PATCH 042/265] Build android.hardware.cas@1.0-service with BOARD_VNDK_VERSION Add libstagefright_foundation_headers and media_plugin_headers explicitly since global include paths are not provided when building with BOARD_VNDK_VERSION set. Bug: 37342627 Test: BOARD_VNDK_VERSION=current m -j android.hardware.cas@1.0-service Change-Id: I6b0b38a5c66a96d92b00d84904b2254b9e70d458 --- cas/1.0/default/Android.bp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cas/1.0/default/Android.bp b/cas/1.0/default/Android.bp index 953aa37238..6da5cc442c 100644 --- a/cas/1.0/default/Android.bp +++ b/cas/1.0/default/Android.bp @@ -32,4 +32,8 @@ cc_binary { "liblog", "libutils", ], + header_libs: [ + "libstagefright_foundation_headers", + "media_plugin_headers", + ], } From c9ba646a72975c003224edafad73e0ce55eaa9ef Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Fri, 7 Jul 2017 13:28:00 -0700 Subject: [PATCH 043/265] Refactor Broadcast Radio 1.1 VTS test. Also apply some minor fixes and log tweaks to the default implementation. Bug: b/36864490 Test: VTS Change-Id: I16558d71c6cdee71854ecae9106b8a1c78032439 --- broadcastradio/1.1/default/BroadcastRadio.cpp | 2 +- .../1.1/default/BroadcastRadioFactory.cpp | 2 +- broadcastradio/1.1/default/Tuner.cpp | 16 +- broadcastradio/1.1/default/Tuner.h | 1 + broadcastradio/1.1/vts/functional/Android.bp | 20 +- .../VtsHalBroadcastradioV1_1TargetTest.cpp | 666 ++++++------------ .../1.1/vts/functional/call-barrier.cpp | 45 ++ .../1.1/vts/functional/call-barrier.h | 59 ++ .../1.1/vts/functional/mock-timeout.h | 103 +++ 9 files changed, 457 insertions(+), 457 deletions(-) create mode 100644 broadcastradio/1.1/vts/functional/call-barrier.cpp create mode 100644 broadcastradio/1.1/vts/functional/call-barrier.h create mode 100644 broadcastradio/1.1/vts/functional/mock-timeout.h diff --git a/broadcastradio/1.1/default/BroadcastRadio.cpp b/broadcastradio/1.1/default/BroadcastRadio.cpp index 3aac127afa..1119ffd854 100644 --- a/broadcastradio/1.1/default/BroadcastRadio.cpp +++ b/broadcastradio/1.1/default/BroadcastRadio.cpp @@ -121,7 +121,7 @@ Return BroadcastRadio::getProperties_1_1(getProperties_1_1_cb _hidl_cb) { Return BroadcastRadio::openTuner(const BandConfig& config, bool audio __unused, const sp& callback, openTuner_cb _hidl_cb) { - ALOGV("%s", __func__); + ALOGV("%s(%s)", __func__, toString(config.type).c_str()); lock_guard lk(mMut); auto oldTuner = mTuner.promote(); diff --git a/broadcastradio/1.1/default/BroadcastRadioFactory.cpp b/broadcastradio/1.1/default/BroadcastRadioFactory.cpp index c2c1158618..f57bc79feb 100644 --- a/broadcastradio/1.1/default/BroadcastRadioFactory.cpp +++ b/broadcastradio/1.1/default/BroadcastRadioFactory.cpp @@ -48,7 +48,7 @@ BroadcastRadioFactory::BroadcastRadioFactory() { } Return BroadcastRadioFactory::connectModule(Class classId, connectModule_cb _hidl_cb) { - ALOGV("%s", __func__); + ALOGV("%s(%s)", __func__, toString(classId).c_str()); auto moduleIt = mRadioModules.find(classId); if (moduleIt == mRadioModules.end()) { diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index bb07f36a5a..a36ec3f13b 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -105,9 +105,14 @@ static ProgramInfo makeDummyProgramInfo(const ProgramSelector& selector) { return info11; } +bool Tuner::isFmLocked() { + if (!utils::isAmFm(utils::getType(mCurrentProgram))) return false; + return mAmfmConfig.type == Band::FM_HD || mAmfmConfig.type == Band::FM; +} + void Tuner::tuneInternalLocked(const ProgramSelector& sel) { VirtualRadio* virtualRadio = nullptr; - if (mAmfmConfig.type == Band::FM_HD || mAmfmConfig.type == Band::FM) { + if (isFmLocked()) { virtualRadio = &mVirtualFm; } @@ -132,11 +137,11 @@ Return Tuner::scan(Direction direction, bool skipSubChannel __unused) { lock_guard lk(mMut); vector list; - if (mAmfmConfig.type == Band::FM_HD || mAmfmConfig.type == Band::FM) { + if (isFmLocked()) { list = mVirtualFm.getProgramList(); } - if (list.size() == 0) { + if (list.empty()) { mIsTuneCompleted = false; auto task = [this, direction]() { ALOGI("Performing failed scan %s", toString(direction).c_str()); @@ -288,14 +293,17 @@ Return Tuner::startBackgroundScan() { Return Tuner::getProgramList(const hidl_string& filter __unused, getProgramList_cb _hidl_cb) { ALOGV("%s", __func__); + lock_guard lk(mMut); auto& virtualRadio = mVirtualFm; - if (mAmfmConfig.type != Band::FM_HD && mAmfmConfig.type != Band::FM) { + if (!isFmLocked()) { + ALOGI("bands other than FM are not supported yet"); _hidl_cb(ProgramListResult::OK, {}); return Void(); } auto list = virtualRadio.getProgramList(); + ALOGD("returning a list of %zu programs", list.size()); _hidl_cb(ProgramListResult::OK, vector(list.begin(), list.end())); return Void(); } diff --git a/broadcastradio/1.1/default/Tuner.h b/broadcastradio/1.1/default/Tuner.h index 17ee99f0d1..5c8a7e571c 100644 --- a/broadcastradio/1.1/default/Tuner.h +++ b/broadcastradio/1.1/default/Tuner.h @@ -65,6 +65,7 @@ struct Tuner : public ITuner { ProgramInfo mCurrentProgramInfo = {}; void tuneInternalLocked(const ProgramSelector& sel); + bool isFmLocked(); // TODO(b/36864090): make it generic, not FM only }; } // namespace implementation diff --git a/broadcastradio/1.1/vts/functional/Android.bp b/broadcastradio/1.1/vts/functional/Android.bp index a4c0849cf2..c1360198a1 100644 --- a/broadcastradio/1.1/vts/functional/Android.bp +++ b/broadcastradio/1.1/vts/functional/Android.bp @@ -29,9 +29,27 @@ cc_test { "android.hardware.broadcastradio@1.0", "android.hardware.broadcastradio@1.1", ], - static_libs: ["VtsHalHidlTargetTestBase"], + static_libs: [ + "VtsHalHidlTargetTestBase", + "broadcastradio-vts-call-barrier", + "libgmock", + ], cflags: [ + "-Wextra", "-O0", "-g", ], } + +cc_library_static { + name: "broadcastradio-vts-call-barrier", + srcs: [ + "call-barrier.cpp", + ], + export_include_dirs: ["."], + cflags: [ + "-Wall", + "-Wextra", + "-Werror", + ], +} diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index 0de6fa5c78..6e6ab44e76 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -14,480 +14,236 @@ * limitations under the License. */ -#define LOG_TAG "BroadcastRadioHidlHalTest" +#define LOG_TAG "broadcastradio.vts" + #include #include +#include #include #include +#include #include #include +#include + +#include #include -#include #include #include #include +#include "mock-timeout.h" -namespace V1_0 = ::android::hardware::broadcastradio::V1_0; +namespace android { +namespace hardware { +namespace broadcastradio { +namespace V1_1 { +namespace vts { -using ::android::sp; -using ::android::Mutex; -using ::android::Condition; -using ::android::hardware::Return; -using ::android::hardware::Void; -using ::android::hardware::broadcastradio::V1_0::BandConfig; -using ::android::hardware::broadcastradio::V1_0::Class; -using ::android::hardware::broadcastradio::V1_0::Direction; -using ::android::hardware::broadcastradio::V1_0::IBroadcastRadio; -using ::android::hardware::broadcastradio::V1_0::MetaData; -using ::android::hardware::broadcastradio::V1_0::Properties; -using ::android::hardware::broadcastradio::V1_1::IBroadcastRadioFactory; -using ::android::hardware::broadcastradio::V1_1::ITuner; -using ::android::hardware::broadcastradio::V1_1::ITunerCallback; -using ::android::hardware::broadcastradio::V1_1::ProgramInfo; -using ::android::hardware::broadcastradio::V1_1::Result; -using ::android::hardware::broadcastradio::V1_1::ProgramListResult; -using ::android::hardware::hidl_vec; +using namespace std::chrono_literals; -// The main test class for Broadcast Radio HIDL HAL. +using testing::_; +using testing::AnyNumber; +using testing::ByMove; +using testing::DoAll; +using testing::SaveArg; -class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase { - protected: - virtual void SetUp() override { - auto factory = ::testing::VtsHalHidlTargetTestBase::getService(); - ASSERT_NE(nullptr, factory.get()); - Result halResult; - factory->connectModule(Class::AM_FM, [&](Result retval, const sp& result) { - halResult = retval; - if (retval == Result::OK) { - mRadio = IBroadcastRadio::castFrom(result); - } - }); - ASSERT_EQ(Result::OK, halResult); - mTunerCallback = new MyCallback(this); - ASSERT_NE(nullptr, mRadio.get()); - ASSERT_NE(nullptr, mTunerCallback.get()); - } +using broadcastradio::vts::CallBarrier; +using V1_0::BandConfig; +using V1_0::Class; +using V1_0::MetaData; - virtual void TearDown() override { - mTuner.clear(); - mRadio.clear(); - } +static constexpr auto kConfigTimeout = 10s; +static constexpr auto kConnectModuleTimeout = 1s; +static constexpr auto kTuneTimeout = 30s; +static constexpr auto kFullScanTimeout = 1min; - class MyCallback : public ITunerCallback { - public: - - // ITunerCallback methods (see doc in ITunerCallback.hal) - virtual Return hardwareFailure() { - ALOGI("%s", __FUNCTION__); - mParentTest->onHwFailureCallback(); - return Void(); - } - - virtual Return configChange(Result result, const BandConfig& config __unused) { - ALOGI("%s result %d", __FUNCTION__, result); - mParentTest->onResultCallback(result); - return Void(); - } - - virtual Return tuneComplete(Result result __unused, const V1_0::ProgramInfo& info __unused) { - return Void(); - } - - virtual Return tuneComplete_1_1(Result result, const ProgramInfo& info __unused) { - ALOGI("%s result %d", __FUNCTION__, result); - mParentTest->onResultCallback(result); - return Void(); - } - - virtual Return afSwitch(const V1_0::ProgramInfo& info __unused) { - return Void(); - } - - virtual Return afSwitch_1_1(const ProgramInfo& info __unused) { - return Void(); - } - - virtual Return antennaStateChange(bool connected) { - ALOGI("%s connected %d", __FUNCTION__, connected); - return Void(); - } - - virtual Return trafficAnnouncement(bool active) { - ALOGI("%s active %d", __FUNCTION__, active); - return Void(); - } - - virtual Return emergencyAnnouncement(bool active) { - ALOGI("%s active %d", __FUNCTION__, active); - return Void(); - } - - virtual Return newMetadata(uint32_t channel __unused, uint32_t subChannel __unused, - const ::android::hardware::hidl_vec& metadata __unused) { - ALOGI("%s", __FUNCTION__); - return Void(); - } - - virtual Return backgroundScanAvailable(bool isAvailable __unused) { - return Void(); - } - - virtual Return backgroundScanComplete(ProgramListResult result) { - ALOGV("%s", __func__); - mParentTest->onProgramListResultCallback(result); - return Void(); - } - - virtual Return programListChanged() { - return Void(); - } - - MyCallback(BroadcastRadioHidlTest *parentTest) : mParentTest(parentTest) {} - - private: - // BroadcastRadioHidlTest instance to which callbacks will be notified. - BroadcastRadioHidlTest *mParentTest; - }; - - - /** - * Method called by MyCallback when a callback with no status or boolean value is received - */ - void onCallback() { - Mutex::Autolock _l(mLock); - onCallback_l(); - } - - /** - * Method called by MyCallback when hardwareFailure() callback is received - */ - void onHwFailureCallback() { - Mutex::Autolock _l(mLock); - mHwFailure = true; - onCallback_l(); - } - - /** - * Method called by MyCallback when a callback with status is received - */ - void onResultCallback(Result result) { - Mutex::Autolock _l(mLock); - mResultCallbackData = result; - onCallback_l(); - } - - /** - * Method called by MyCallback when a callback with status is received - */ - void onProgramListResultCallback(ProgramListResult result) { - Mutex::Autolock _l(mLock); - mProgramListResultCallbackData = result; - onCallback_l(); - } - - /** - * Method called by MyCallback when a boolean indication is received - */ - void onBoolCallback(bool result) { - Mutex::Autolock _l(mLock); - mBoolCallbackData = result; - onCallback_l(); - } - - - BroadcastRadioHidlTest() : - mCallbackCalled(false), mBoolCallbackData(false), - mResultCallbackData(Result::OK), mHwFailure(false) {} - - void onCallback_l() { - if (!mCallbackCalled) { - mCallbackCalled = true; - mCallbackCond.broadcast(); - } - } - - - bool waitForCallback(nsecs_t reltime = 0) { - Mutex::Autolock _l(mLock); - nsecs_t endTime = systemTime() + reltime; - while (!mCallbackCalled) { - if (reltime == 0) { - mCallbackCond.wait(mLock); - } else { - nsecs_t now = systemTime(); - if (now > endTime) { - return false; - } - mCallbackCond.waitRelative(mLock, endTime - now); - } - } - return true; - } - - bool getProperties(); - bool openTuner(); - bool checkAntenna(); - - static const nsecs_t kConfigCallbacktimeoutNs = seconds_to_nanoseconds(10); - static const nsecs_t kTuneCallbacktimeoutNs = seconds_to_nanoseconds(30); - static const nsecs_t kFullScanTimeoutNs = seconds_to_nanoseconds(60); - - sp mRadio; - Properties mHalProperties; - sp mTuner; - sp mTunerCallback; - Mutex mLock; - Condition mCallbackCond; - bool mCallbackCalled; - bool mBoolCallbackData; - Result mResultCallbackData; - ProgramListResult mProgramListResultCallbackData; - bool mHwFailure; -}; - -// A class for test environment setup (kept since this file is a template). -class BroadcastRadioHidlEnvironment : public ::testing::Environment { - public: - virtual void SetUp() {} - virtual void TearDown() {} -}; - -bool BroadcastRadioHidlTest::getProperties() -{ - if (mHalProperties.bands.size() == 0) { - Result halResult = Result::NOT_INITIALIZED; - Return hidlReturn = - mRadio->getProperties([&](Result result, const Properties& properties) { - halResult = result; - if (result == Result::OK) { - mHalProperties = properties; - } - }); - - EXPECT_TRUE(hidlReturn.isOk()); - EXPECT_EQ(Result::OK, halResult); - EXPECT_EQ(Class::AM_FM, mHalProperties.classId); - EXPECT_GT(mHalProperties.numTuners, 0u); - EXPECT_GT(mHalProperties.bands.size(), 0u); - } - return mHalProperties.bands.size() > 0; +static void printSkipped(std::string msg) { + std::cout << "[ SKIPPED ] " << msg << std::endl; } -bool BroadcastRadioHidlTest::openTuner() -{ - if (!getProperties()) { - return false; +class TunerCallbackMock : public ITunerCallback { + public: + MOCK_METHOD0(hardwareFailure, Return()); + MOCK_TIMEOUT_METHOD2(configChange, Return(Result, const BandConfig&)); + MOCK_METHOD2(tuneComplete, Return(Result, const V1_0::ProgramInfo&)); + MOCK_TIMEOUT_METHOD2(tuneComplete_1_1, Return(Result, const ProgramInfo&)); + MOCK_METHOD1(afSwitch, Return(const V1_0::ProgramInfo&)); + MOCK_METHOD1(afSwitch_1_1, Return(const ProgramInfo&)); + MOCK_METHOD1(antennaStateChange, Return(bool connected)); + MOCK_METHOD1(trafficAnnouncement, Return(bool active)); + MOCK_METHOD1(emergencyAnnouncement, Return(bool active)); + MOCK_METHOD3(newMetadata, Return(uint32_t ch, uint32_t subCh, const hidl_vec&)); + MOCK_METHOD1(backgroundScanAvailable, Return(bool)); + MOCK_TIMEOUT_METHOD1(backgroundScanComplete, Return(ProgramListResult)); + MOCK_METHOD0(programListChanged, Return()); +}; + +class BroadcastRadioHalTest : public ::testing::VtsHalHidlTargetTestBase, + public ::testing::WithParamInterface { + protected: + virtual void SetUp() override; + virtual void TearDown() override; + + // TODO(b/36864490): check all bands for good test conditions (ie. FM is more likely to have + // any stations on the list, so don't pick AM blindly). + bool openTuner(unsigned band); + const BandConfig& getBand(unsigned idx); + + Class radioClass; + bool skipped = false; + + sp mRadioModule; + sp mTuner; + sp mCallback = new TunerCallbackMock(); + + private: + hidl_vec mBands; +}; + +void BroadcastRadioHalTest::SetUp() { + radioClass = GetParam(); + + // set general expectations for a callback + EXPECT_CALL(*mCallback, hardwareFailure()).Times(0); + + // lookup HIDL service + auto factory = getService(); + ASSERT_NE(nullptr, factory.get()); + + // connect radio module + Result connectResult; + CallBarrier onConnect; + factory->connectModule(radioClass, [&](Result ret, const sp& radio) { + connectResult = ret; + if (ret == Result::OK) mRadioModule = IBroadcastRadio::castFrom(radio); + onConnect.call(); + }); + ASSERT_TRUE(onConnect.waitForCall(kConnectModuleTimeout)); + + if (connectResult == Result::INVALID_ARGUMENTS) { + printSkipped("This device class is not supported."); + skipped = true; + return; } - if (mTuner.get() == nullptr) { + ASSERT_EQ(connectResult, Result::OK); + ASSERT_NE(nullptr, mRadioModule.get()); + + // get module properties + Properties prop11; + auto& prop10 = prop11.base; + auto propResult = + mRadioModule->getProperties_1_1([&](const Properties& properties) { prop11 = properties; }); + + ASSERT_TRUE(propResult.isOk()); + EXPECT_EQ(radioClass, prop10.classId); + EXPECT_GT(prop10.numTuners, 0u); + if (radioClass == Class::AM_FM) { + EXPECT_GT(prop10.bands.size(), 0u); + } + mBands = prop10.bands; +} + +void BroadcastRadioHalTest::TearDown() { + mTuner.clear(); + mRadioModule.clear(); + // TODO(b/36864490): wait (with timeout) until mCallback has only one reference +} + +bool BroadcastRadioHalTest::openTuner(unsigned band) { + EXPECT_EQ(nullptr, mTuner.get()); + + if (radioClass == Class::AM_FM) { + EXPECT_TIMEOUT_CALL(*mCallback, configChange, Result::OK, _); + } + + Result halResult = Result::NOT_INITIALIZED; + auto openCb = [&](Result result, const sp& tuner) { + halResult = result; + if (result != Result::OK) return; + mTuner = ITuner::castFrom(tuner); + }; + auto hidlResult = mRadioModule->openTuner(getBand(band), true, mCallback, openCb); + + EXPECT_TRUE(hidlResult.isOk()); + EXPECT_EQ(Result::OK, halResult); + EXPECT_NE(nullptr, mTuner.get()); + if (radioClass == Class::AM_FM && mTuner != nullptr) { + EXPECT_TIMEOUT_CALL_WAIT(*mCallback, configChange, kConfigTimeout); + + BandConfig halConfig; Result halResult = Result::NOT_INITIALIZED; - auto hidlReturn = mRadio->openTuner(mHalProperties.bands[0], true, mTunerCallback, - [&](Result result, const sp& tuner) { - halResult = result; - if (result == Result::OK) { - mTuner = ITuner::castFrom(tuner); - } - }); - EXPECT_TRUE(hidlReturn.isOk()); + mTuner->getConfiguration([&](Result result, const BandConfig& config) { + halResult = result; + halConfig = config; + }); EXPECT_EQ(Result::OK, halResult); - EXPECT_NE(nullptr, mTuner.get()); - EXPECT_TRUE(waitForCallback(kConfigCallbacktimeoutNs)); + EXPECT_TRUE(halConfig.antennaConnected); } + EXPECT_NE(nullptr, mTuner.get()); return nullptr != mTuner.get(); } -bool BroadcastRadioHidlTest::checkAntenna() -{ - BandConfig halConfig; - Result halResult = Result::NOT_INITIALIZED; - Return hidlReturn = - mTuner->getConfiguration([&](Result result, const BandConfig& config) { - halResult = result; - if (result == Result::OK) { - halConfig = config; - } - }); +const BandConfig& BroadcastRadioHalTest::getBand(unsigned idx) { + static const BandConfig dummyBandConfig = {}; - return ((halResult == Result::OK) && (halConfig.antennaConnected == true)); -} - - -/** - * Test IBroadcastRadio::getProperties() method - * - * Verifies that: - * - the HAL implements the method - * - the method returns 0 (no error) - * - the implementation class is AM_FM - * - the implementation supports at least one tuner - * - the implementation supports at one band - */ -TEST_F(BroadcastRadioHidlTest, GetProperties) { - EXPECT_TRUE(getProperties()); -} - -/** - * Test IBroadcastRadio::openTuner() method - * - * Verifies that: - * - the HAL implements the method - * - the method returns 0 (no error) and a valid ITuner interface - */ -TEST_F(BroadcastRadioHidlTest, OpenTuner) { - EXPECT_TRUE(openTuner()); -} - -/** - * Test ITuner::setConfiguration() and getConfiguration methods - * - * Verifies that: - * - the HAL implements both methods - * - the methods return 0 (no error) - * - the configuration callback is received within kConfigCallbacktimeoutNs ns - * - the configuration read back from HAl has the same class Id - */ -TEST_F(BroadcastRadioHidlTest, SetAndGetConfiguration) { - ASSERT_TRUE(openTuner()); - // test setConfiguration - mCallbackCalled = false; - Return hidlResult = mTuner->setConfiguration(mHalProperties.bands[0]); - EXPECT_TRUE(hidlResult.isOk()); - EXPECT_EQ(Result::OK, hidlResult); - EXPECT_TRUE(waitForCallback(kConfigCallbacktimeoutNs)); - EXPECT_EQ(Result::OK, mResultCallbackData); - - // test getConfiguration - BandConfig halConfig; - Result halResult; - Return hidlReturn = - mTuner->getConfiguration([&](Result result, const BandConfig& config) { - halResult = result; - if (result == Result::OK) { - halConfig = config; - } - }); - EXPECT_TRUE(hidlReturn.isOk()); - EXPECT_EQ(Result::OK, halResult); - EXPECT_EQ(mHalProperties.bands[0].type, halConfig.type); -} - -/** - * Test ITuner::scan - * - * Verifies that: - * - the HAL implements the method - * - the method returns 0 (no error) - * - the tuned callback is received within kTuneCallbacktimeoutNs ns - */ -TEST_F(BroadcastRadioHidlTest, Scan) { - ASSERT_TRUE(openTuner()); - ASSERT_TRUE(checkAntenna()); - // test scan UP - mCallbackCalled = false; - Return hidlResult = mTuner->scan(Direction::UP, true); - EXPECT_TRUE(hidlResult.isOk()); - EXPECT_EQ(Result::OK, hidlResult); - EXPECT_TRUE(waitForCallback(kTuneCallbacktimeoutNs)); - - // test scan DOWN - mCallbackCalled = false; - hidlResult = mTuner->scan(Direction::DOWN, true); - EXPECT_TRUE(hidlResult.isOk()); - EXPECT_EQ(Result::OK, hidlResult); - EXPECT_TRUE(waitForCallback(kTuneCallbacktimeoutNs)); -} - -/** - * Test ITuner::step - * - * Verifies that: - * - the HAL implements the method - * - the method returns 0 (no error) - * - the tuned callback is received within kTuneCallbacktimeoutNs ns - */ -TEST_F(BroadcastRadioHidlTest, Step) { - ASSERT_TRUE(openTuner()); - ASSERT_TRUE(checkAntenna()); - // test step UP - mCallbackCalled = false; - Return hidlResult = mTuner->step(Direction::UP, true); - EXPECT_TRUE(hidlResult.isOk()); - EXPECT_EQ(Result::OK, hidlResult); - EXPECT_TRUE(waitForCallback(kTuneCallbacktimeoutNs)); - - // test step DOWN - mCallbackCalled = false; - hidlResult = mTuner->step(Direction::DOWN, true); - EXPECT_TRUE(hidlResult.isOk()); - EXPECT_EQ(Result::OK, hidlResult); - EXPECT_TRUE(waitForCallback(kTuneCallbacktimeoutNs)); -} - -/** - * Test ITuner::tune, getProgramInformation and cancel methods - * - * Verifies that: - * - the HAL implements the methods - * - the methods return 0 (no error) - * - the tuned callback is received within kTuneCallbacktimeoutNs ns after tune() - */ -TEST_F(BroadcastRadioHidlTest, TuneAndGetProgramInformationAndCancel) { - ASSERT_TRUE(openTuner()); - ASSERT_TRUE(checkAntenna()); - - // test tune - ASSERT_GT(mHalProperties.bands[0].spacings.size(), 0u); - ASSERT_GT(mHalProperties.bands[0].upperLimit, mHalProperties.bands[0].lowerLimit); - - // test scan UP - uint32_t lowerLimit = mHalProperties.bands[0].lowerLimit; - uint32_t upperLimit = mHalProperties.bands[0].upperLimit; - uint32_t spacing = mHalProperties.bands[0].spacings[0]; - - uint32_t channel = - lowerLimit + (((upperLimit - lowerLimit) / 2 + spacing - 1) / spacing) * spacing; - mCallbackCalled = false; - mResultCallbackData = Result::NOT_INITIALIZED; - Return hidlResult = mTuner->tune(channel, 0); - EXPECT_TRUE(hidlResult.isOk()); - EXPECT_EQ(Result::OK, hidlResult); - EXPECT_TRUE(waitForCallback(kTuneCallbacktimeoutNs)); - - // test getProgramInformation - ProgramInfo halInfo; - Result halResult = Result::NOT_INITIALIZED; - Return hidlReturn = mTuner->getProgramInformation_1_1( - [&](Result result, const ProgramInfo& info) { - halResult = result; - if (result == Result::OK) { - halInfo = info; - } - }); - EXPECT_TRUE(hidlReturn.isOk()); - EXPECT_EQ(Result::OK, halResult); - auto &halInfo_1_1 = halInfo.base; - if (mResultCallbackData == Result::OK) { - EXPECT_LE(halInfo_1_1.channel, upperLimit); - EXPECT_GE(halInfo_1_1.channel, lowerLimit); + if (radioClass != Class::AM_FM) { + ALOGD("Not AM/FM radio, returning dummy band config"); + return dummyBandConfig; } - // test cancel - mTuner->tune(lowerLimit, 0); - hidlResult = mTuner->cancel(); - EXPECT_TRUE(hidlResult.isOk()); - EXPECT_EQ(Result::OK, hidlResult); + EXPECT_GT(mBands.size(), idx); + if (mBands.size() <= idx) { + ALOGD("Band index out of bound, returning dummy band config"); + return dummyBandConfig; + } + + auto& band = mBands[idx]; + ALOGD("Returning %s band", toString(band.type).c_str()); + return band; } -TEST_F(BroadcastRadioHidlTest, TuneFromProgramList) { - ASSERT_TRUE(openTuner()); - ASSERT_TRUE(checkAntenna()); +/** + * Test IBroadcastRadio::openTuner() method called twice. + * + * Verifies that: + * - the openTuner method succeeds when called for the second time without + * deleting previous ITuner instance. + * + * This is a more strict requirement than in 1.0, where a second openTuner + * might fail. + */ +TEST_P(BroadcastRadioHalTest, OpenTunerTwice) { + if (skipped) return; + ASSERT_TRUE(openTuner(0)); + + Result halResult = Result::NOT_INITIALIZED; + auto openCb = [&](Result result, const sp&) { halResult = result; }; + auto hidlResult = mRadioModule->openTuner(getBand(0), true, mCallback, openCb); + ASSERT_TRUE(hidlResult.isOk()); + ASSERT_EQ(Result::OK, halResult); +} + +/** + * Test tuning to program list entry. + * + * Verifies that: + * - getProgramList either succeeds or returns NOT_STARTED/NOT_READY status; + * - if the program list is NOT_STARTED, startBackgroundScan makes it completed + * within a full scan timeout and the next getProgramList call succeeds; + * - if the program list is not empty, tune_1_1 call succeeds. + */ +TEST_P(BroadcastRadioHalTest, TuneFromProgramList) { + if (skipped) return; + ASSERT_TRUE(openTuner(0)); ProgramInfo firstProgram; bool isListEmpty; ProgramListResult getListResult = ProgramListResult::NOT_INITIALIZED; auto getListCb = [&](ProgramListResult result, const hidl_vec& list) { + ALOGD("getListCb(%s, ProgramInfo[%zu])", toString(result).c_str(), list.size()); getListResult = result; if (result != ProgramListResult::OK) return; isListEmpty = (list.size() == 0); @@ -496,40 +252,50 @@ TEST_F(BroadcastRadioHidlTest, TuneFromProgramList) { }; // first try... - auto hidlReturn = mTuner->getProgramList("", getListCb); - ASSERT_TRUE(hidlReturn.isOk()); + EXPECT_TIMEOUT_CALL(*mCallback, backgroundScanComplete, ProgramListResult::OK) + .Times(AnyNumber()); + auto hidlResult = mTuner->getProgramList("", getListCb); + ASSERT_TRUE(hidlResult.isOk()); if (getListResult == ProgramListResult::NOT_STARTED) { auto result = mTuner->startBackgroundScan(); - ASSERT_TRUE(result.isOk()); ASSERT_EQ(ProgramListResult::OK, result); getListResult = ProgramListResult::NOT_READY; // continue as in NOT_READY case } if (getListResult == ProgramListResult::NOT_READY) { - ASSERT_TRUE(waitForCallback(kFullScanTimeoutNs)); - ASSERT_EQ(ProgramListResult::OK, mProgramListResultCallbackData); + EXPECT_TIMEOUT_CALL_WAIT(*mCallback, backgroundScanComplete, kFullScanTimeout); // second (last) try... - hidlReturn = mTuner->getProgramList("", getListCb); - ASSERT_TRUE(hidlReturn.isOk()); + hidlResult = mTuner->getProgramList("", getListCb); + ASSERT_TRUE(hidlResult.isOk()); ASSERT_EQ(ProgramListResult::OK, getListResult); } if (isListEmpty) { - std::cout << "[ SKIPPED ] Program list is empty. " << std::endl; + printSkipped("Program list is empty."); return; } + ProgramInfo infoCb; + EXPECT_CALL(*mCallback, tuneComplete(_, _)); + EXPECT_TIMEOUT_CALL(*mCallback, tuneComplete_1_1, Result::OK, _) + .WillOnce(DoAll(SaveArg<1>(&infoCb), testing::Return(ByMove(Void())))); auto tuneResult = mTuner->tune_1_1(firstProgram.selector); - ASSERT_TRUE(tuneResult.isOk()); - EXPECT_EQ(Result::OK, tuneResult); - EXPECT_EQ(true, waitForCallback(kTuneCallbacktimeoutNs)); - // TODO(b/36864490): check this too, when mProgramInfoCallbackData is cherry-picked from 1.0 - // EXPECT_EQ(firstProgram.selector.primaryId, mProgramInfoCallbackData.selector.primaryId); + ASSERT_EQ(Result::OK, tuneResult); + EXPECT_TIMEOUT_CALL_WAIT(*mCallback, tuneComplete_1_1, kTuneTimeout); + EXPECT_EQ(firstProgram.selector.primaryId, infoCb.selector.primaryId); } +INSTANTIATE_TEST_CASE_P(BroadcastRadioHalTestCases, BroadcastRadioHalTest, + ::testing::Values(Class::AM_FM, Class::SAT, Class::DT)); + +} // namespace vts +} // namespace V1_1 +} // namespace broadcastradio +} // namespace hardware +} // namespace android + int main(int argc, char** argv) { - ::testing::AddGlobalTestEnvironment(new BroadcastRadioHidlEnvironment); ::testing::InitGoogleTest(&argc, argv); int status = RUN_ALL_TESTS(); ALOGI("Test result = %d", status); diff --git a/broadcastradio/1.1/vts/functional/call-barrier.cpp b/broadcastradio/1.1/vts/functional/call-barrier.cpp new file mode 100644 index 0000000000..fede297ad1 --- /dev/null +++ b/broadcastradio/1.1/vts/functional/call-barrier.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (C) 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. + */ +#include "call-barrier.h" + +namespace android { +namespace hardware { +namespace broadcastradio { +namespace vts { + +using std::lock_guard; +using std::mutex; +using std::unique_lock; + +void CallBarrier::call() { + lock_guard lk(mMut); + mWasCalled = true; + mCond.notify_all(); +} + +bool CallBarrier::waitForCall(std::chrono::milliseconds timeout) { + unique_lock lk(mMut); + + if (mWasCalled) return true; + + auto status = mCond.wait_for(lk, timeout); + return status == std::cv_status::no_timeout; +} + +} // namespace vts +} // namespace broadcastradio +} // namespace hardware +} // namespace android diff --git a/broadcastradio/1.1/vts/functional/call-barrier.h b/broadcastradio/1.1/vts/functional/call-barrier.h new file mode 100644 index 0000000000..462396a55b --- /dev/null +++ b/broadcastradio/1.1/vts/functional/call-barrier.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 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. + */ +#ifndef ANDROID_HARDWARE_BROADCASTRADIO_V1_1_CALL_BARRIER +#define ANDROID_HARDWARE_BROADCASTRADIO_V1_1_CALL_BARRIER + +#include +#include + +namespace android { +namespace hardware { +namespace broadcastradio { +namespace vts { + +/** + * A barrier for thread synchronization, where one should wait for another to + * reach a specific point in execution. + */ +class CallBarrier { + public: + /** + * Notify the other thread it may continue execution. + * + * This may be called before the other thread starts waiting on the barrier. + */ + void call(); + + /** + * Wait for the other thread to reach call() execution point. + * + * @param timeout a maximum time to wait. + * @returns {@code false} if timed out, {@code true} otherwise. + */ + bool waitForCall(std::chrono::milliseconds timeout); + + private: + bool mWasCalled = false; + std::mutex mMut; + std::condition_variable mCond; +}; + +} // namespace vts +} // namespace broadcastradio +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_BROADCASTRADIO_V1_1_CALL_BARRIER diff --git a/broadcastradio/1.1/vts/functional/mock-timeout.h b/broadcastradio/1.1/vts/functional/mock-timeout.h new file mode 100644 index 0000000000..fa1114f0a7 --- /dev/null +++ b/broadcastradio/1.1/vts/functional/mock-timeout.h @@ -0,0 +1,103 @@ +/* + * Copyright (C) 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. + */ +#ifndef ANDROID_HARDWARE_BROADCASTRADIO_V1_1_MOCK_TIMEOUT +#define ANDROID_HARDWARE_BROADCASTRADIO_V1_1_MOCK_TIMEOUT + +#include +#include + +/** + * Common helper objects for gmock timeout extension. + * + * INTERNAL IMPLEMENTATION - don't use in user code. + */ +#define EGMOCK_TIMEOUT_METHOD_DEF_(Method, ...) \ + std::atomic egmock_called_##Method; \ + std::mutex egmock_mut_##Method; \ + std::condition_variable egmock_cond_##Method; + +/** + * Common method body for gmock timeout extension. + * + * INTERNAL IMPLEMENTATION - don't use in user code. + */ +#define EGMOCK_TIMEOUT_METHOD_BODY_(Method, ...) \ + auto ret = egmock_##Method(__VA_ARGS__); \ + { \ + std::lock_guard lk(egmock_mut_##Method); \ + egmock_called_##Method = true; \ + egmock_cond_##Method.notify_all(); \ + } \ + return ret; + +/** + * Gmock MOCK_METHOD1 timeout-capable extension. + */ +#define MOCK_TIMEOUT_METHOD1(Method, ...) \ + MOCK_METHOD1(egmock_##Method, __VA_ARGS__); \ + EGMOCK_TIMEOUT_METHOD_DEF_(Method); \ + virtual GMOCK_RESULT_(, __VA_ARGS__) Method(GMOCK_ARG_(, 1, __VA_ARGS__) egmock_a1) { \ + EGMOCK_TIMEOUT_METHOD_BODY_(Method, egmock_a1); \ + } + +/** + * Gmock MOCK_METHOD2 timeout-capable extension. + */ +#define MOCK_TIMEOUT_METHOD2(Method, ...) \ + MOCK_METHOD2(egmock_##Method, __VA_ARGS__); \ + EGMOCK_TIMEOUT_METHOD_DEF_(Method); \ + virtual GMOCK_RESULT_(, __VA_ARGS__) \ + Method(GMOCK_ARG_(, 1, __VA_ARGS__) egmock_a1, GMOCK_ARG_(, 2, __VA_ARGS__) egmock_a2) { \ + EGMOCK_TIMEOUT_METHOD_BODY_(Method, egmock_a1, egmock_a2); \ + } + +/** + * Gmock EXPECT_CALL timeout-capable extension. + * + * It has slightly different syntax from the original macro, to make method name accessible. + * So, instead of typing + * EXPECT_CALL(account, charge(100, Currency::USD)); + * you need to inline arguments + * EXPECT_TIMEOUT_CALL(account, charge, 100, Currency::USD); + */ +#define EXPECT_TIMEOUT_CALL(obj, Method, ...) \ + (obj).egmock_called_##Method = false; \ + EXPECT_CALL(obj, egmock_##Method(__VA_ARGS__)) + +/** + * Waits for an earlier EXPECT_TIMEOUT_CALL to execute. + * + * It does not fully support special constraints of the EXPECT_CALL clause, just proceeds when the + * first call to a given method comes. For example, in the following code: + * EXPECT_TIMEOUT_CALL(account, charge, 100, _); + * account.charge(50, Currency::USD); + * EXPECT_TIMEOUT_CALL_WAIT(account, charge, 500ms); + * the wait clause will just continue, as the charge method was called. + * + * @param obj object for a call + * @param Method the method to wait for + * @param timeout the maximum time for waiting + */ +#define EXPECT_TIMEOUT_CALL_WAIT(obj, Method, timeout) \ + { \ + std::unique_lock lk((obj).egmock_mut_##Method); \ + if (!(obj).egmock_called_##Method) { \ + auto status = (obj).egmock_cond_##Method.wait_for(lk, timeout); \ + EXPECT_EQ(std::cv_status::no_timeout, status); \ + } \ + } + +#endif // ANDROID_HARDWARE_BROADCASTRADIO_V1_1_MOCK_TIMEOUT From c1cad35a5a3d1bbc7fcef1c0e6cece8db2d381e7 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Mon, 10 Jul 2017 16:06:46 -0700 Subject: [PATCH 044/265] Compile health hal with the VNDK. Test: builds with BOARD_VNDK_VERSION=current Change-Id: I38ea5afed47026f6068e9aac5de3435ec031f836 --- health/1.0/default/Android.bp | 24 ++++++++++++++++++++++++ health/1.0/default/Android.mk | 18 +++--------------- health/1.0/default/libhealthd/Android.bp | 10 ++++++++++ health/1.0/default/libhealthd/Android.mk | 10 ---------- health/Android.bp | 1 + 5 files changed, 38 insertions(+), 25 deletions(-) create mode 100644 health/1.0/default/Android.bp create mode 100644 health/1.0/default/libhealthd/Android.bp delete mode 100644 health/1.0/default/libhealthd/Android.mk diff --git a/health/1.0/default/Android.bp b/health/1.0/default/Android.bp new file mode 100644 index 0000000000..c57152f01a --- /dev/null +++ b/health/1.0/default/Android.bp @@ -0,0 +1,24 @@ +subdirs = [ + "libhealthd", +] + +cc_library_static { + name: "android.hardware.health@1.0-convert", + vendor_available: true, + srcs: ["convert.cpp"], + include_dirs: [ + "system/core/base/include", + ], + header_libs: ["libhealthd_headers"], + export_header_lib_headers: ["libhealthd_headers"], + export_include_dirs: ["include"], + shared_libs: [ + "libcutils", + "libhidlbase", + "libhidltransport", + "libutils", + "android.hardware.health@1.0", + ], + +} + diff --git a/health/1.0/default/Android.mk b/health/1.0/default/Android.mk index 96ff91fe7b..199ab4120d 100644 --- a/health/1.0/default/Android.mk +++ b/health/1.0/default/Android.mk @@ -4,10 +4,12 @@ include $(CLEAR_VARS) LOCAL_MODULE := android.hardware.health@1.0-impl LOCAL_PROPRIETARY_MODULE := true LOCAL_MODULE_RELATIVE_PATH := hw -LOCAL_C_INCLUDES := system/core/healthd/include system/core/base/include +LOCAL_C_INCLUDES := system/core/base/include LOCAL_SRC_FILES := \ Health.cpp \ +LOCAL_HEADER_LIBRARIES := libhealthd_headers + LOCAL_SHARED_LIBRARIES := \ libcutils \ libhidlbase \ @@ -22,20 +24,6 @@ LOCAL_HAL_STATIC_LIBRARIES := libhealthd include $(BUILD_SHARED_LIBRARY) -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.health@1.0-convert -LOCAL_SRC_FILES := convert.cpp -LOCAL_C_INCLUDES := system/core/healthd/include system/core/base/include -LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include -LOCAL_SHARED_LIBRARIES := \ - libcutils \ - libhidlbase \ - libhidltransport \ - libutils \ - android.hardware.health@1.0 \ - -include $(BUILD_STATIC_LIBRARY) - include $(CLEAR_VARS) LOCAL_PROPRIETARY_MODULE := true LOCAL_MODULE_RELATIVE_PATH := hw diff --git a/health/1.0/default/libhealthd/Android.bp b/health/1.0/default/libhealthd/Android.bp new file mode 100644 index 0000000000..ce02e28cc2 --- /dev/null +++ b/health/1.0/default/libhealthd/Android.bp @@ -0,0 +1,10 @@ +// Copyright 2016 The Android Open Source Project + +cc_library_static { + srcs: ["healthd_board_default.cpp"], + name: "libhealthd.default", + vendor_available: true, + cflags: ["-Werror"], + include_dirs: ["system/core/base/include"], + header_libs: ["libhealthd_headers"], +} diff --git a/health/1.0/default/libhealthd/Android.mk b/health/1.0/default/libhealthd/Android.mk deleted file mode 100644 index a5f4445edc..0000000000 --- a/health/1.0/default/libhealthd/Android.mk +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright 2016 The Android Open Source Project - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_SRC_FILES := healthd_board_default.cpp -LOCAL_MODULE := libhealthd.default -LOCAL_CFLAGS := -Werror -LOCAL_C_INCLUDES := system/core/healthd/include system/core/base/include -include $(BUILD_STATIC_LIBRARY) diff --git a/health/Android.bp b/health/Android.bp index 33f70ebae2..ed19a37034 100644 --- a/health/Android.bp +++ b/health/Android.bp @@ -1,5 +1,6 @@ // This is an autogenerated file, do not edit. subdirs = [ "1.0", + "1.0/default", "1.0/vts/functional", ] From fc87140da9c978101b148b6717e88cecd727b592 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Mon, 10 Jul 2017 17:13:23 -0700 Subject: [PATCH 045/265] convert vehicle to .bp Test: cd hardware/interfaces/automotive && mma -j64 Change-Id: I851c9b2ff956b0f6d9d7a6076d495aad9038a66a --- automotive/Android.bp | 3 + automotive/vehicle/2.0/default/Android.bp | 111 ++++++++++ automotive/vehicle/2.0/default/Android.mk | 194 ------------------ .../default/impl/vhal_v2_0/proto/Android.bp | 26 +++ automotive/vehicle/2.1/default/Android.bp | 84 ++++++++ automotive/vehicle/2.1/default/Android.mk | 121 ----------- 6 files changed, 224 insertions(+), 315 deletions(-) create mode 100644 automotive/vehicle/2.0/default/Android.bp delete mode 100644 automotive/vehicle/2.0/default/Android.mk create mode 100644 automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/Android.bp create mode 100644 automotive/vehicle/2.1/default/Android.bp delete mode 100644 automotive/vehicle/2.1/default/Android.mk diff --git a/automotive/Android.bp b/automotive/Android.bp index aec8865f89..d9a6355024 100644 --- a/automotive/Android.bp +++ b/automotive/Android.bp @@ -4,5 +4,8 @@ subdirs = [ "evs/1.0/default", "evs/1.0/vts/functional", "vehicle/2.0", + "vehicle/2.0/default", + "vehicle/2.0/default/impl/vhal_v2_0/proto", "vehicle/2.1", + "vehicle/2.1/default", ] diff --git a/automotive/vehicle/2.0/default/Android.bp b/automotive/vehicle/2.0/default/Android.bp new file mode 100644 index 0000000000..6d3e902ffa --- /dev/null +++ b/automotive/vehicle/2.0/default/Android.bp @@ -0,0 +1,111 @@ +// Copyright (C) 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. + +cc_defaults { + name: "vhal_v2_0_defaults", + shared_libs: [ + "libhidlbase", + "libhidltransport", + "liblog", + "libutils", + "android.hardware.automotive.vehicle@2.0", + ], + cflags: [ + "-Wall", + "-Wextra", + "-Werror", + ], +} + +cc_library_headers { + name: "vhal_v2_0_common_headers", + export_include_dirs: ["common/include/vhal_v2_0"], +} + +// Vehicle reference implementation lib +cc_library_static { + name: "android.hardware.automotive.vehicle@2.0-manager-lib", + defaults: ["vhal_v2_0_defaults"], + srcs: [ + "common/src/SubscriptionManager.cpp", + "common/src/VehicleHalManager.cpp", + "common/src/VehicleObjectPool.cpp", + "common/src/VehiclePropertyStore.cpp", + "common/src/VehicleUtils.cpp", + ], + local_include_dirs: ["common/include/vhal_v2_0"], + export_include_dirs: ["common/include"], +} + +cc_library_shared { + name: "android.hardware.automotive.vehicle@2.0-manager-lib-shared", + static_libs: ["android.hardware.automotive.vehicle@2.0-manager-lib"], + export_static_lib_headers: ["android.hardware.automotive.vehicle@2.0-manager-lib"], +} + +// Vehicle default VehicleHAL implementation +cc_library_static { + name: "android.hardware.automotive.vehicle@2.0-default-impl-lib", + defaults: ["vhal_v2_0_defaults"], + srcs: [ + "impl/vhal_v2_0/EmulatedVehicleHal.cpp", + "impl/vhal_v2_0/VehicleEmulator.cpp", + "impl/vhal_v2_0/PipeComm.cpp", + "impl/vhal_v2_0/SocketComm.cpp", + ], + local_include_dirs: ["common/include/vhal_v2_0"], + export_include_dirs: ["impl"], + whole_static_libs: ["android.hardware.automotive.vehicle@2.0-manager-lib"], + shared_libs: [ + "libbase", + "libprotobuf-cpp-lite", + ], + static_libs: [ + "libqemu_pipe", + "android.hardware.automotive.vehicle@2.0-libproto-native", + ], +} + +cc_test { + name: "android.hardware.automotive.vehicle@2.0-manager-unit-tests", + defaults: ["vhal_v2_0_defaults"], + whole_static_libs: ["android.hardware.automotive.vehicle@2.0-manager-lib"], + srcs: [ + "tests/RecurrentTimer_test.cpp", + "tests/SubscriptionManager_test.cpp", + "tests/VehicleHalManager_test.cpp", + "tests/VehicleObjectPool_test.cpp", + "tests/VehiclePropConfigIndex_test.cpp", + ], + header_libs: ["libbase_headers"], +} + +cc_binary { + name: "android.hardware.automotive.vehicle@2.0-service", + defaults: ["vhal_v2_0_defaults"], + init_rc: ["android.hardware.automotive.vehicle@2.0-service.rc"], + proprietary: true, + relative_install_path: "hw", + srcs: ["VehicleService.cpp"], + shared_libs: [ + "libbase", + "libprotobuf-cpp-lite", + ], + static_libs: [ + "android.hardware.automotive.vehicle@2.0-manager-lib", + "android.hardware.automotive.vehicle@2.0-default-impl-lib", + "android.hardware.automotive.vehicle@2.0-libproto-native", + "libqemu_pipe", + ], +} diff --git a/automotive/vehicle/2.0/default/Android.mk b/automotive/vehicle/2.0/default/Android.mk deleted file mode 100644 index 72e1364fc6..0000000000 --- a/automotive/vehicle/2.0/default/Android.mk +++ /dev/null @@ -1,194 +0,0 @@ -# Copyright (C) 2016 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) - -vhal_v2_0 = android.hardware.automotive.vehicle@2.0 - -############################################################################### -# Vehicle reference implementation lib -############################################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(vhal_v2_0)-manager-lib -LOCAL_SRC_FILES := \ - common/src/SubscriptionManager.cpp \ - common/src/VehicleHalManager.cpp \ - common/src/VehicleObjectPool.cpp \ - common/src/VehiclePropertyStore.cpp \ - common/src/VehicleUtils.cpp \ - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/common/include/vhal_v2_0 - -LOCAL_EXPORT_C_INCLUDE_DIRS := \ - $(LOCAL_PATH)/common/include - -LOCAL_SHARED_LIBRARIES := \ - libhidlbase \ - libhidltransport \ - liblog \ - libutils \ - $(vhal_v2_0) \ - -include $(BUILD_STATIC_LIBRARY) - - -include $(CLEAR_VARS) -LOCAL_MODULE := $(vhal_v2_0)-manager-lib-shared -LOCAL_SRC_FILES := \ - common/src/SubscriptionManager.cpp \ - common/src/VehicleHalManager.cpp \ - common/src/VehicleObjectPool.cpp \ - common/src/VehiclePropertyStore.cpp \ - common/src/VehicleUtils.cpp \ - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/common/include/vhal_v2_0 - -LOCAL_EXPORT_C_INCLUDE_DIRS := \ - $(LOCAL_PATH)/common/include - -LOCAL_SHARED_LIBRARIES := \ - libhidlbase \ - libhidltransport \ - liblog \ - libutils \ - $(vhal_v2_0) \ - -include $(BUILD_SHARED_LIBRARY) - -############################################################################### -# Vehicle HAL Protobuf library -############################################################################### -include $(CLEAR_VARS) -LOCAL_SRC_FILES := $(call all-proto-files-under, impl/vhal_v2_0/proto) - -LOCAL_PROTOC_OPTIMIZE_TYPE := nano - -LOCAL_MODULE := $(vhal_v2_0)-libproto-native -LOCAL_MODULE_CLASS := STATIC_LIBRARIES - -LOCAL_MODULE_TAGS := optional - -LOCAL_STRIP_MODULE := keep_symbols - -generated_sources_dir := $(call local-generated-sources-dir) -LOCAL_EXPORT_C_INCLUDE_DIRS := \ - $(generated_sources_dir)/proto/$(LOCAL_PATH)/impl/vhal_v2_0/proto - -include $(BUILD_STATIC_LIBRARY) - - -############################################################################### -# Vehicle default VehicleHAL implementation -############################################################################### -include $(CLEAR_VARS) - -LOCAL_MODULE:= $(vhal_v2_0)-default-impl-lib -LOCAL_SRC_FILES:= \ - impl/vhal_v2_0/EmulatedVehicleHal.cpp \ - impl/vhal_v2_0/VehicleEmulator.cpp \ - impl/vhal_v2_0/PipeComm.cpp \ - impl/vhal_v2_0/SocketComm.cpp \ - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/impl/vhal_v2_0 - -LOCAL_EXPORT_C_INCLUDE_DIRS := \ - $(LOCAL_PATH)/impl - -LOCAL_WHOLE_STATIC_LIBRARIES := \ - $(vhal_v2_0)-manager-lib \ - -LOCAL_SHARED_LIBRARIES := \ - libbase \ - libhidlbase \ - libhidltransport \ - liblog \ - libprotobuf-cpp-lite \ - libutils \ - $(vhal_v2_0) \ - -LOCAL_STATIC_LIBRARIES := \ - libqemu_pipe \ - $(vhal_v2_0)-libproto-native \ - -LOCAL_CFLAGS += -Wall -Wextra -Werror - -include $(BUILD_STATIC_LIBRARY) - - -############################################################################### -# Vehicle reference implementation unit tests -############################################################################### -include $(CLEAR_VARS) - -LOCAL_MODULE:= $(vhal_v2_0)-manager-unit-tests - -LOCAL_WHOLE_STATIC_LIBRARIES := \ - $(vhal_v2_0)-manager-lib \ - -LOCAL_SRC_FILES:= \ - tests/RecurrentTimer_test.cpp \ - tests/SubscriptionManager_test.cpp \ - tests/VehicleHalManager_test.cpp \ - tests/VehicleObjectPool_test.cpp \ - tests/VehiclePropConfigIndex_test.cpp \ - -LOCAL_HEADER_LIBRARIES := \ - libbase_headers - -LOCAL_SHARED_LIBRARIES := \ - libhidlbase \ - libhidltransport \ - liblog \ - libutils \ - $(vhal_v2_0) \ - -LOCAL_CFLAGS += -Wall -Wextra -Werror -LOCAL_MODULE_TAGS := tests - -include $(BUILD_NATIVE_TEST) - - -############################################################################### -# Vehicle HAL service -############################################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(vhal_v2_0)-service -LOCAL_INIT_RC := $(vhal_v2_0)-service.rc -LOCAL_PROPRIETARY_MODULE := true -LOCAL_MODULE_RELATIVE_PATH := hw - -LOCAL_SRC_FILES := \ - VehicleService.cpp - -LOCAL_SHARED_LIBRARIES := \ - libbase \ - libhidlbase \ - libhidltransport \ - liblog \ - libprotobuf-cpp-lite \ - libutils \ - $(vhal_v2_0) \ - -LOCAL_STATIC_LIBRARIES := \ - $(vhal_v2_0)-manager-lib \ - $(vhal_v2_0)-default-impl-lib \ - $(vhal_v2_0)-libproto-native \ - libqemu_pipe \ - -LOCAL_CFLAGS += -Wall -Wextra -Werror - -include $(BUILD_EXECUTABLE) diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/Android.bp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/Android.bp new file mode 100644 index 0000000000..7d68f9e4cd --- /dev/null +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/Android.bp @@ -0,0 +1,26 @@ +// Copyright (C) 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. + +// Vehicle HAL Protobuf library +cc_library_static { + name: "android.hardware.automotive.vehicle@2.0-libproto-native", + proto: { + export_proto_headers: true, + type: "lite", + }, + strip: { + keep_symbols: true, + }, + srcs: ["VehicleHalProto.proto"] +} diff --git a/automotive/vehicle/2.1/default/Android.bp b/automotive/vehicle/2.1/default/Android.bp new file mode 100644 index 0000000000..0697767927 --- /dev/null +++ b/automotive/vehicle/2.1/default/Android.bp @@ -0,0 +1,84 @@ +// Copyright (C) 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. + +cc_defaults { + name: "vhal_v2_1_defaults", + defaults: ["vhal_v2_0_defaults"], + shared_libs: [ + "libhwbinder", + "android.hardware.automotive.vehicle@2.1", + ], +} + +// Vehicle reference implementation lib +cc_library_static { + name: "android.hardware.automotive.vehicle@2.1-manager-lib", + defaults: ["vhal_v2_1_defaults"], + srcs: [ + "common/src/Obd2SensorStore.cpp", + ], + local_include_dirs: ["common/include/vhal_v2_1"], + header_libs: ["vhal_v2_0_common_headers"], + export_include_dirs: ["common/include"], +} + +// Vehicle default VehicleHAL implementation +cc_library_static { + name: "android.hardware.automotive.vehicle@2.1-default-impl-lib", + defaults: ["vhal_v2_1_defaults"], + srcs: [ + "impl/vhal_v2_1/EmulatedVehicleHal.cpp", + ], + local_include_dirs: [ + "impl/vhal_v2_1", + "common/include", + ], + export_include_dirs: [ + "impl", + "common/include", + ], + static_libs: [ + "android.hardware.automotive.vehicle@2.0-default-impl-lib", + "android.hardware.automotive.vehicle@2.0-libproto-native", + "android.hardware.automotive.vehicle@2.0-manager-lib", + "android.hardware.automotive.vehicle@2.1-manager-lib", + "libqemu_pipe", + ], + shared_libs: [ + "libbase", + "libprotobuf-cpp-lite", + ], +} + +cc_binary { + name: "android.hardware.automotive.vehicle@2.1-service", + defaults: ["vhal_v2_1_defaults"], + init_rc: ["android.hardware.automotive.vehicle@2.1-service.rc"], + proprietary: true, + relative_install_path: "hw", + srcs: ["service.cpp"], + whole_static_libs: ["android.hardware.automotive.vehicle@2.0-libproto-native"], + static_libs: [ + "android.hardware.automotive.vehicle@2.0-default-impl-lib", + "android.hardware.automotive.vehicle@2.0-manager-lib", + "android.hardware.automotive.vehicle@2.1-default-impl-lib", + "android.hardware.automotive.vehicle@2.1-manager-lib", + "libqemu_pipe", + ], + shared_libs: [ + "libbase", + "libhwbinder", + "libprotobuf-cpp-lite", + ], +} diff --git a/automotive/vehicle/2.1/default/Android.mk b/automotive/vehicle/2.1/default/Android.mk deleted file mode 100644 index f19263c7d1..0000000000 --- a/automotive/vehicle/2.1/default/Android.mk +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright (C) 2016 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) - -vhal_v2_0 = android.hardware.automotive.vehicle@2.0 -vhal_v2_1 = android.hardware.automotive.vehicle@2.1 - -############################################################################### -# Vehicle reference implementation lib -############################################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(vhal_v2_1)-manager-lib -LOCAL_SRC_FILES := \ - common/src/Obd2SensorStore.cpp - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/common/include/vhal_v2_1 \ - $(LOCAL_PATH)/../../2.0/default/common/include/vhal_v2_0 \ - -LOCAL_EXPORT_C_INCLUDE_DIRS := \ - $(LOCAL_PATH)/common/include - -LOCAL_SHARED_LIBRARIES := \ - libhidlbase \ - libhidltransport \ - libhwbinder \ - liblog \ - libutils \ - $(vhal_v2_1) \ - -include $(BUILD_STATIC_LIBRARY) - -############################################################################### -# Vehicle default VehicleHAL implementation -############################################################################### -include $(CLEAR_VARS) - -LOCAL_MODULE:= $(vhal_v2_1)-default-impl-lib -LOCAL_SRC_FILES:= \ - impl/vhal_v2_1/EmulatedVehicleHal.cpp \ - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/impl/vhal_v2_1 \ - $(LOCAL_PATH)/common/include - -LOCAL_EXPORT_C_INCLUDE_DIRS := \ - $(LOCAL_PATH)/impl \ - $(LOCAL_PATH)/common/include - - -# LOCAL_WHOLE_STATIC_LIBRARIES := \ - -LOCAL_STATIC_LIBRARIES := \ - $(vhal_v2_0)-default-impl-lib \ - $(vhal_v2_0)-manager-lib \ - libqemu_pipe \ - $(vhal_v2_1)-manager-lib \ - $(vhal_v2_0)-libproto-native - -LOCAL_SHARED_LIBRARIES := \ - libbase \ - libhidlbase \ - libhidltransport \ - libhwbinder \ - liblog \ - libutils \ - libprotobuf-cpp-lite \ - $(vhal_v2_0) \ - $(vhal_v2_1) \ - -LOCAL_CFLAGS += -Wall -Wextra -Werror - -include $(BUILD_STATIC_LIBRARY) - -############################################################################### -# Vehicle HAL service -############################################################################### -include $(CLEAR_VARS) -LOCAL_MODULE := $(vhal_v2_1)-service -LOCAL_INIT_RC := $(vhal_v2_1)-service.rc -LOCAL_MODULE_RELATIVE_PATH := hw -LOCAL_PROPRIETARY_MODULE := true -LOCAL_SRC_FILES := \ - service.cpp - -LOCAL_WHOLE_STATIC_LIBRARIES := \ - $(vhal_v2_0)-libproto-native \ - -LOCAL_STATIC_LIBRARIES := \ - $(vhal_v2_0)-manager-lib \ - $(vhal_v2_0)-default-impl-lib \ - $(vhal_v2_1)-default-impl-lib \ - libqemu_pipe \ - $(vhal_v2_1)-manager-lib \ - -LOCAL_SHARED_LIBRARIES := \ - libbase \ - libhidlbase \ - libhidltransport \ - libhwbinder \ - liblog \ - libutils \ - libprotobuf-cpp-lite \ - $(vhal_v2_0) \ - $(vhal_v2_1) \ - -LOCAL_CFLAGS += -Wall -Wextra -Werror - -include $(BUILD_EXECUTABLE) From b96305d7cba2b822824f8fff184c776d25d7a214 Mon Sep 17 00:00:00 2001 From: Timur Iskhakov Date: Fri, 7 Jul 2017 13:28:56 -0700 Subject: [PATCH 046/265] Interface for configureRpcThreadpool tests Test: links, compiles Change-Id: I58996c4eeba5889c73407b1d71f03638b23d73d1 --- tests/Android.bp | 2 + tests/multithread/1.0/Android.bp | 59 ++++++++++++++ tests/multithread/1.0/Android.mk | 76 +++++++++++++++++++ tests/multithread/1.0/IMultithread.hal | 40 ++++++++++ tests/multithread/1.0/default/Android.bp | 17 +++++ tests/multithread/1.0/default/Multithread.cpp | 63 +++++++++++++++ tests/multithread/1.0/default/Multithread.h | 48 ++++++++++++ 7 files changed, 305 insertions(+) create mode 100644 tests/multithread/1.0/Android.bp create mode 100644 tests/multithread/1.0/Android.mk create mode 100644 tests/multithread/1.0/IMultithread.hal create mode 100644 tests/multithread/1.0/default/Android.bp create mode 100644 tests/multithread/1.0/default/Multithread.cpp create mode 100644 tests/multithread/1.0/default/Multithread.h diff --git a/tests/Android.bp b/tests/Android.bp index ddf300b8a8..9583bfda91 100644 --- a/tests/Android.bp +++ b/tests/Android.bp @@ -20,6 +20,8 @@ subdirs = [ "memory/1.0/default", "msgq/1.0", "msgq/1.0/default", + "multithread/1.0", + "multithread/1.0/default", "pointer/1.0", "pointer/1.0/default", "pointer/1.0/default/lib", diff --git a/tests/multithread/1.0/Android.bp b/tests/multithread/1.0/Android.bp new file mode 100644 index 0000000000..c3782a0d6d --- /dev/null +++ b/tests/multithread/1.0/Android.bp @@ -0,0 +1,59 @@ +// This file is autogenerated by hidl-gen. Do not edit manually. + +filegroup { + name: "android.hardware.tests.multithread@1.0_hal", + srcs: [ + "IMultithread.hal", + ], +} + +genrule { + name: "android.hardware.tests.multithread@1.0_genc++", + tools: ["hidl-gen"], + cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.tests.multithread@1.0", + srcs: [ + ":android.hardware.tests.multithread@1.0_hal", + ], + out: [ + "android/hardware/tests/multithread/1.0/MultithreadAll.cpp", + ], +} + +genrule { + name: "android.hardware.tests.multithread@1.0_genc++_headers", + tools: ["hidl-gen"], + cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.tests.multithread@1.0", + srcs: [ + ":android.hardware.tests.multithread@1.0_hal", + ], + out: [ + "android/hardware/tests/multithread/1.0/IMultithread.h", + "android/hardware/tests/multithread/1.0/IHwMultithread.h", + "android/hardware/tests/multithread/1.0/BnHwMultithread.h", + "android/hardware/tests/multithread/1.0/BpHwMultithread.h", + "android/hardware/tests/multithread/1.0/BsMultithread.h", + ], +} + +cc_library_shared { + name: "android.hardware.tests.multithread@1.0", + defaults: ["hidl-module-defaults"], + generated_sources: ["android.hardware.tests.multithread@1.0_genc++"], + generated_headers: ["android.hardware.tests.multithread@1.0_genc++_headers"], + export_generated_headers: ["android.hardware.tests.multithread@1.0_genc++_headers"], + vendor_available: true, + shared_libs: [ + "libhidlbase", + "libhidltransport", + "libhwbinder", + "liblog", + "libutils", + "libcutils", + ], + export_shared_lib_headers: [ + "libhidlbase", + "libhidltransport", + "libhwbinder", + "libutils", + ], +} diff --git a/tests/multithread/1.0/Android.mk b/tests/multithread/1.0/Android.mk new file mode 100644 index 0000000000..f63381d24c --- /dev/null +++ b/tests/multithread/1.0/Android.mk @@ -0,0 +1,76 @@ +# This file is autogenerated by hidl-gen. Do not edit manually. + +LOCAL_PATH := $(call my-dir) + +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.tests.multithread-V1.0-java +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java \ + + +# +# Build IMultithread.hal +# +GEN := $(intermediates)/android/hardware/tests/multithread/V1_0/IMultithread.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IMultithread.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.multithread@1.0::IMultithread + +$(GEN): $(LOCAL_PATH)/IMultithread.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_JAVA_LIBRARY) + + +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.tests.multithread-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build IMultithread.hal +# +GEN := $(intermediates)/android/hardware/tests/multithread/V1_0/IMultithread.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IMultithread.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.multithread@1.0::IMultithread + +$(GEN): $(LOCAL_PATH)/IMultithread.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + + +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/multithread/1.0/IMultithread.hal b/tests/multithread/1.0/IMultithread.hal new file mode 100644 index 0000000000..19dc4f6810 --- /dev/null +++ b/tests/multithread/1.0/IMultithread.hal @@ -0,0 +1,40 @@ +/* + * Copyright (C) 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. + */ + +package android.hardware.tests.multithread@1.0; + +/** + * IMultithread tests configureRpcThreadpool + * + * Makes calls finish only when specific number of them are running in parallel + */ +interface IMultithread { + /** + * Sets up controller + * Must be called for each test + * @param maxThreads arg passed to configureRpcThreadpool + * Could not be decremented by future calls + * @param numThreads number of calls in parallel to finish + */ + setNumThreads(int32_t maxThreads, int32_t numThreads); + + /** + * Makes a new call + * @return noTimeout numThreads appeared in parallel before timeout + * Shall return the same value for one setNumThreads call + */ + runNewThread() generates (bool noTimeout); +}; diff --git a/tests/multithread/1.0/default/Android.bp b/tests/multithread/1.0/default/Android.bp new file mode 100644 index 0000000000..72b9e91da6 --- /dev/null +++ b/tests/multithread/1.0/default/Android.bp @@ -0,0 +1,17 @@ +cc_library_shared { + name: "android.hardware.tests.multithread@1.0-impl", + defaults: ["hidl_defaults"], + relative_install_path: "hw", + proprietary: true, + srcs: [ + "Multithread.cpp", + ], + shared_libs: [ + "libbase", + "libhidlbase", + "libhidltransport", + "liblog", + "libutils", + "android.hardware.tests.multithread@1.0", + ], +} diff --git a/tests/multithread/1.0/default/Multithread.cpp b/tests/multithread/1.0/default/Multithread.cpp new file mode 100644 index 0000000000..1fb267c03c --- /dev/null +++ b/tests/multithread/1.0/default/Multithread.cpp @@ -0,0 +1,63 @@ +#define LOG_TAG "hidl_test" + +#include +#include "Multithread.h" +#include +#include + +#include + +namespace android { +namespace hardware { +namespace tests { +namespace multithread { +namespace V1_0 { +namespace implementation { + +// Methods from ::android::hardware::tests::multithread::V1_0::IMultithread follow. +Return Multithread::setNumThreads(int32_t maxThreads, int32_t numThreads) { + LOG(INFO) << "SERVER(Multithread) setNumThreads(" + << maxThreads << ", " << numThreads << ")"; + + LOG(INFO) << "SERVER(Multithread) call configureRpcThreadpool(" + << maxThreads << ")"; + ::android::hardware::configureRpcThreadpool(maxThreads, /*willjoin*/ false); + + mNumThreads = numThreads; + mNoTimeout = true; + + return Void(); +} + +Return Multithread::runNewThread() { + LOG(INFO) << "SERVER(Multithread) runNewThread()"; + + std::unique_lock lk(mCvMutex); + --mNumThreads; + + LOG(INFO) << "SERVER(Multithread) runNewThread()"; + LOG(INFO) << mNumThreads << "threads left"; + + mCv.notify_all(); + bool noTimeout = mCv.wait_for(lk, kTimeoutDuration, + [&] { return mNumThreads <= 0 || !mNoTimeout; }); + + if (!noTimeout) { + mNoTimeout = false; + mCv.notify_all(); + } + return mNoTimeout; +} + +IMultithread* HIDL_FETCH_IMultithread(const char* /* name */) { + return new Multithread(); +} + +decltype(Multithread::kTimeoutDuration) Multithread::kTimeoutDuration; + +} // namespace implementation +} // namespace V1_0 +} // namespace multithread +} // namespace tests +} // namespace hardware +} // namespace android diff --git a/tests/multithread/1.0/default/Multithread.h b/tests/multithread/1.0/default/Multithread.h new file mode 100644 index 0000000000..0d4a007833 --- /dev/null +++ b/tests/multithread/1.0/default/Multithread.h @@ -0,0 +1,48 @@ +#ifndef ANDROID_HARDWARE_TESTS_MULTITHREAD_V1_0_MULTITHREAD_H +#define ANDROID_HARDWARE_TESTS_MULTITHREAD_V1_0_MULTITHREAD_H + +#include +#include + +#include +#include +#include + +namespace android { +namespace hardware { +namespace tests { +namespace multithread { +namespace V1_0 { +namespace implementation { + +using ::android::hardware::tests::multithread::V1_0::IMultithread; +using ::android::hardware::Return; +using ::android::hardware::Void; + +using namespace std::chrono_literals; + +struct Multithread : public IMultithread { + // Methods from ::android::hardware::tests::multithread::V1_0::IMultithread follow. + virtual Return setNumThreads(int32_t maxThreads, int32_t numThreads) override; + virtual Return runNewThread() override; + + private: + int32_t mNumThreads; + bool mNoTimeout; + + std::condition_variable mCv; + std::mutex mCvMutex; + + static constexpr auto kTimeoutDuration = 100ms; +}; + +extern "C" IMultithread* HIDL_FETCH_IMultithread(const char* name); + +} // namespace implementation +} // namespace V1_0 +} // namespace multithread +} // namespace tests +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_TESTS_MULTITHREAD_V1_0_MULTITHREAD_H From bb5f29c9fb85d75656d3bd11bab625070ba83d71 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Mon, 10 Jul 2017 19:37:57 -0700 Subject: [PATCH 047/265] Use broadcastradio 1.1 default implementation by default. Also, remove a warning for 1.1 interface, as the hidl freeze mechanism is now in place. Bug: b/34348946 Test: VTS, instrumentalization Change-Id: I82025a7de8abd0758ba8b196bbbfc48b9322ac3b --- audio/2.0/default/Android.mk | 4 ---- audio/2.0/default/service.cpp | 16 ++-------------- broadcastradio/1.1/WARNING | 1 - 3 files changed, 2 insertions(+), 19 deletions(-) delete mode 100644 broadcastradio/1.1/WARNING diff --git a/audio/2.0/default/Android.mk b/audio/2.0/default/Android.mk index 621853cb0e..8dec48209c 100644 --- a/audio/2.0/default/Android.mk +++ b/audio/2.0/default/Android.mk @@ -84,8 +84,4 @@ else LOCAL_MULTILIB := $(AUDIOSERVER_MULTILIB) endif -ifeq ($(TARGET_USES_BCRADIO_FUTURE_FEATURES),true) -LOCAL_CFLAGS += -DTARGET_USES_BCRADIO_FUTURE_FEATURES -endif - include $(BUILD_EXECUTABLE) diff --git a/audio/2.0/default/service.cpp b/audio/2.0/default/service.cpp index 7f28d7df84..f71f1b4735 100644 --- a/audio/2.0/default/service.cpp +++ b/audio/2.0/default/service.cpp @@ -32,13 +32,7 @@ using android::hardware::audio::effect::V2_0::IEffectsFactory; using android::hardware::audio::V2_0::IDevicesFactory; using android::hardware::soundtrigger::V2_0::ISoundTriggerHw; using android::hardware::registerPassthroughServiceImplementation; -namespace broadcastradio = android::hardware::broadcastradio; - -#ifdef TARGET_USES_BCRADIO_FUTURE_FEATURES -static const bool useBroadcastRadioFutureFeatures = true; -#else -static const bool useBroadcastRadioFutureFeatures = false; -#endif +using android::hardware::broadcastradio::V1_1::IBroadcastRadioFactory; using android::OK; @@ -52,13 +46,7 @@ int main(int /* argc */, char* /* argv */ []) { // Soundtrigger and FM radio might be not present. status = registerPassthroughServiceImplementation(); ALOGE_IF(status != OK, "Error while registering soundtrigger service: %d", status); - if (useBroadcastRadioFutureFeatures) { - status = registerPassthroughServiceImplementation< - broadcastradio::V1_1::IBroadcastRadioFactory>(); - } else { - status = registerPassthroughServiceImplementation< - broadcastradio::V1_0::IBroadcastRadioFactory>(); - } + status = registerPassthroughServiceImplementation(); ALOGE_IF(status != OK, "Error while registering fm radio service: %d", status); joinRpcThreadpool(); return status; diff --git a/broadcastradio/1.1/WARNING b/broadcastradio/1.1/WARNING deleted file mode 100644 index e867cfa362..0000000000 --- a/broadcastradio/1.1/WARNING +++ /dev/null @@ -1 +0,0 @@ -This is experimental interface, do not use it yet. From 22b2d6817021560d67fa1fca813287a0c864a1c6 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Tue, 11 Jul 2017 12:53:12 -0700 Subject: [PATCH 048/265] Build automotive hals with VNDK. Bug: 37342627 Test: cd hardware/interfaces/automotive && BOARD_VNDK_VERSION=current mma -j64 -k Change-Id: I89e9af8a5fded3a31eedb9942cfba8e8d9614f53 --- CleanSpec.mk | 6 +++++- automotive/vehicle/2.0/default/Android.bp | 7 ++++++- .../vehicle/2.0/default/impl/vhal_v2_0/proto/Android.bp | 1 + automotive/vehicle/2.1/default/Android.bp | 4 +++- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CleanSpec.mk b/CleanSpec.mk index 01b5e7b7f9..91515abba9 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -55,4 +55,8 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/init/android.hardware.bl $(call add-clean-step, rm -rf $(OUT)/soong/.intermediates/) $(call add-clean-step, rm -rf $(OUT_DIR)/soong/.intermediates/hardware/interfaces/) $(call add-clean-step, rm -rf $(OUT_DIR)/soong/.intermediates/hardware/interfaces/) -$(call add-clean-step, find $(PRODUCT_OUT)/system $(PRODUCT_OUT)/vendor -type f -name "android\.hardware\.configstore*" -print0 | xargs -0 rm -f) \ No newline at end of file +$(call add-clean-step, find $(PRODUCT_OUT)/system $(PRODUCT_OUT)/vendor -type f -name "android\.hardware\.configstore*" -print0 | xargs -0 rm -f) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/hw/android.hardware.automotive*) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/hw/android.hardware.automotive*) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib64/hw/android.hardware.automotive*) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/init/android.hardware.automotive*) diff --git a/automotive/vehicle/2.0/default/Android.bp b/automotive/vehicle/2.0/default/Android.bp index 6d3e902ffa..3e3ff2c852 100644 --- a/automotive/vehicle/2.0/default/Android.bp +++ b/automotive/vehicle/2.0/default/Android.bp @@ -30,12 +30,14 @@ cc_defaults { cc_library_headers { name: "vhal_v2_0_common_headers", + vendor: true, export_include_dirs: ["common/include/vhal_v2_0"], } // Vehicle reference implementation lib cc_library_static { name: "android.hardware.automotive.vehicle@2.0-manager-lib", + vendor: true, defaults: ["vhal_v2_0_defaults"], srcs: [ "common/src/SubscriptionManager.cpp", @@ -50,6 +52,7 @@ cc_library_static { cc_library_shared { name: "android.hardware.automotive.vehicle@2.0-manager-lib-shared", + vendor: true, static_libs: ["android.hardware.automotive.vehicle@2.0-manager-lib"], export_static_lib_headers: ["android.hardware.automotive.vehicle@2.0-manager-lib"], } @@ -57,6 +60,7 @@ cc_library_shared { // Vehicle default VehicleHAL implementation cc_library_static { name: "android.hardware.automotive.vehicle@2.0-default-impl-lib", + vendor: true, defaults: ["vhal_v2_0_defaults"], srcs: [ "impl/vhal_v2_0/EmulatedVehicleHal.cpp", @@ -79,6 +83,7 @@ cc_library_static { cc_test { name: "android.hardware.automotive.vehicle@2.0-manager-unit-tests", + vendor: true, defaults: ["vhal_v2_0_defaults"], whole_static_libs: ["android.hardware.automotive.vehicle@2.0-manager-lib"], srcs: [ @@ -95,7 +100,7 @@ cc_binary { name: "android.hardware.automotive.vehicle@2.0-service", defaults: ["vhal_v2_0_defaults"], init_rc: ["android.hardware.automotive.vehicle@2.0-service.rc"], - proprietary: true, + vendor: true, relative_install_path: "hw", srcs: ["VehicleService.cpp"], shared_libs: [ diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/Android.bp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/Android.bp index 7d68f9e4cd..ec352000c6 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/Android.bp +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/Android.bp @@ -15,6 +15,7 @@ // Vehicle HAL Protobuf library cc_library_static { name: "android.hardware.automotive.vehicle@2.0-libproto-native", + vendor: true, proto: { export_proto_headers: true, type: "lite", diff --git a/automotive/vehicle/2.1/default/Android.bp b/automotive/vehicle/2.1/default/Android.bp index 0697767927..f6743f261f 100644 --- a/automotive/vehicle/2.1/default/Android.bp +++ b/automotive/vehicle/2.1/default/Android.bp @@ -24,6 +24,7 @@ cc_defaults { // Vehicle reference implementation lib cc_library_static { name: "android.hardware.automotive.vehicle@2.1-manager-lib", + vendor: true, defaults: ["vhal_v2_1_defaults"], srcs: [ "common/src/Obd2SensorStore.cpp", @@ -36,6 +37,7 @@ cc_library_static { // Vehicle default VehicleHAL implementation cc_library_static { name: "android.hardware.automotive.vehicle@2.1-default-impl-lib", + vendor: true, defaults: ["vhal_v2_1_defaults"], srcs: [ "impl/vhal_v2_1/EmulatedVehicleHal.cpp", @@ -65,7 +67,7 @@ cc_binary { name: "android.hardware.automotive.vehicle@2.1-service", defaults: ["vhal_v2_1_defaults"], init_rc: ["android.hardware.automotive.vehicle@2.1-service.rc"], - proprietary: true, + vendor: true, relative_install_path: "hw", srcs: ["service.cpp"], whole_static_libs: ["android.hardware.automotive.vehicle@2.0-libproto-native"], From 2834b95b12edb0b234594b21bcb4b44cc797fc90 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Wed, 12 Jul 2017 14:17:09 -0700 Subject: [PATCH 049/265] Move utils lib out from implementation namespace. RadioService may benefit from it too. Also, fix subchannel base, as I found a tiny comment about it in the 1.0 HAL. Bug: b/32621193 Test: instrumentalization Change-Id: I11939025b72bdeab4cc6393e25159f53164e22ed --- broadcastradio/1.1/default/Tuner.cpp | 2 +- broadcastradio/1.1/default/VirtualProgram.cpp | 2 +- broadcastradio/1.1/types.hal | 10 ++++++- broadcastradio/1.1/utils/Utils.cpp | 27 ++++++++++--------- broadcastradio/1.1/utils/Utils.h | 4 +-- 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index a36ec3f13b..3c43c2eed8 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -98,7 +98,7 @@ static ProgramInfo makeDummyProgramInfo(const ProgramSelector& selector) { ProgramInfo info11 = {}; auto& info10 = info11.base; - utils::getLegacyChannel(selector, info10.channel, info10.subChannel); + utils::getLegacyChannel(selector, &info10.channel, &info10.subChannel); info11.selector = selector; info11.flags |= ProgramInfoFlags::MUTED; diff --git a/broadcastradio/1.1/default/VirtualProgram.cpp b/broadcastradio/1.1/default/VirtualProgram.cpp index ef8bd1c43d..babf0d8b60 100644 --- a/broadcastradio/1.1/default/VirtualProgram.cpp +++ b/broadcastradio/1.1/default/VirtualProgram.cpp @@ -31,7 +31,7 @@ VirtualProgram::operator ProgramInfo() const { ProgramInfo info11 = {}; auto& info10 = info11.base; - utils::getLegacyChannel(selector, info10.channel, info10.subChannel); + utils::getLegacyChannel(selector, &info10.channel, &info10.subChannel); info11.selector = selector; info10.tuned = true; info10.stereo = true; diff --git a/broadcastradio/1.1/types.hal b/broadcastradio/1.1/types.hal index dee38b8c45..004184f5bb 100644 --- a/broadcastradio/1.1/types.hal +++ b/broadcastradio/1.1/types.hal @@ -80,7 +80,15 @@ enum ProgramType : uint32_t { DAB, // Digital audio broadcasting DRMO, // Digital Radio Mondiale SXM, // SiriusXM Satellite Radio - VENDOR, // vendor-specific, not synced across devices + + /** + * Vendor-specific, not synced across devices. + * + * If it's necessary to support multiple vendor-specific program types, the + * type of vendor radio technology may be encoded in high bits + * of IDENTIFIER_TYPE_VENDOR_PRIMARY. + */ + VENDOR, }; /** diff --git a/broadcastradio/1.1/utils/Utils.cpp b/broadcastradio/1.1/utils/Utils.cpp index 9dc0a53cd3..270aabbb01 100644 --- a/broadcastradio/1.1/utils/Utils.cpp +++ b/broadcastradio/1.1/utils/Utils.cpp @@ -24,7 +24,6 @@ namespace android { namespace hardware { namespace broadcastradio { namespace V1_1 { -namespace implementation { namespace utils { using V1_0::Band; @@ -166,26 +165,31 @@ ProgramSelector make_selector(Band band, uint32_t channel, uint32_t subChannel) sel.primaryId.type = static_cast(IdentifierType::AMFM_FREQUENCY); sel.primaryId.value = channel; if (subChannel > 0) { - // stating sub channel for AM/FM channel does not give any guarantees, - // but we can't do much more without HD station ID + /* stating sub channel for AM/FM channel does not give any guarantees, + * but we can't do much more without HD station ID + * + * The legacy APIs had 1-based subChannels, while ProgramSelector is 0-based. + */ sel.secondaryIds = hidl_vec{ - {static_cast(IdentifierType::HD_SUBCHANNEL), subChannel}, + {static_cast(IdentifierType::HD_SUBCHANNEL), subChannel - 1}, }; } return sel; } -bool getLegacyChannel(const ProgramSelector& sel, uint32_t& channelOut, uint32_t& subChannelOut) { +bool getLegacyChannel(const ProgramSelector& sel, uint32_t* channelOut, uint32_t* subChannelOut) { + if (channelOut) *channelOut = 0; + if (subChannelOut) *subChannelOut = 0; if (isAmFm(getType(sel))) { - channelOut = getId(sel, IdentifierType::AMFM_FREQUENCY); - subChannelOut = getId(sel, IdentifierType::HD_SUBCHANNEL, 0); + if (channelOut) *channelOut = getId(sel, IdentifierType::AMFM_FREQUENCY); + if (subChannelOut && hasId(sel, IdentifierType::HD_SUBCHANNEL)) { + // The legacy APIs had 1-based subChannels, while ProgramSelector is 0-based. + *subChannelOut = getId(sel, IdentifierType::HD_SUBCHANNEL) + 1; + } return true; - } else { - channelOut = 0; - subChannelOut = 0; - return false; } + return false; } bool isDigital(const ProgramSelector& sel) { @@ -200,7 +204,6 @@ bool isDigital(const ProgramSelector& sel) { } } // namespace utils -} // namespace implementation } // namespace V1_1 } // namespace broadcastradio } // namespace hardware diff --git a/broadcastradio/1.1/utils/Utils.h b/broadcastradio/1.1/utils/Utils.h index 1110e79f6d..cd86ffaadc 100644 --- a/broadcastradio/1.1/utils/Utils.h +++ b/broadcastradio/1.1/utils/Utils.h @@ -25,7 +25,6 @@ namespace android { namespace hardware { namespace broadcastradio { namespace V1_1 { -namespace implementation { namespace utils { /** @@ -61,12 +60,11 @@ uint64_t getId(const ProgramSelector& sel, const IdentifierType type, uint64_t d ProgramSelector make_selector(V1_0::Band band, uint32_t channel, uint32_t subChannel = 0); -bool getLegacyChannel(const ProgramSelector& sel, uint32_t& channelOut, uint32_t& subChannelOut); +bool getLegacyChannel(const ProgramSelector& sel, uint32_t* channelOut, uint32_t* subChannelOut); bool isDigital(const ProgramSelector& sel); } // namespace utils -} // namespace implementation } // namespace V1_1 } // namespace broadcastradio } // namespace hardware From cc2714629889f6688a3325d4fbe121e92411026a Mon Sep 17 00:00:00 2001 From: sqian Date: Thu, 13 Jul 2017 18:44:00 -0700 Subject: [PATCH 050/265] Fix some VTS for 2017 devices - sendDeviceState - setIndicationFilter Mentioned in b/63148938 - getNeighboringCids Add Request_not_support for Apis mentioned in Bugs: - 62989786 - 62986286 - 62987946 Test: run vts Bug: 63130111 Bug: 63148938 Bug: 62989786 Bug: 62986286 Bug: 62987946 Change-Id: Ib51f67d403bb27f409018a98c07d6aa6aa6d19f8 --- .../vts/functional/radio_hidl_hal_misc.cpp | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp index 13c23a88c2..864f84413e 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp @@ -248,7 +248,8 @@ TEST_F(RadioHidlTest, getNeighboringCids) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -280,7 +281,8 @@ TEST_F(RadioHidlTest, setCdmaRoamingPreference) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); } } @@ -345,7 +347,8 @@ TEST_F(RadioHidlTest, setPreferredVoicePrivacy) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); } } @@ -361,7 +364,8 @@ TEST_F(RadioHidlTest, getPreferredVoicePrivacy) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); } } @@ -494,7 +498,8 @@ TEST_F(RadioHidlTest, setCellInfoListRate) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); } } @@ -562,7 +567,8 @@ TEST_F(RadioHidlTest, nvResetConfig) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); } } @@ -651,7 +657,6 @@ TEST_F(RadioHidlTest, setRadioCapability) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || radioRsp->rspInfo.error == RadioError::INVALID_STATE); @@ -670,7 +675,6 @@ TEST_F(RadioHidlTest, startLceService) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::RADIO_NOT_AVAILABLE || radioRsp->rspInfo.error == RadioError::LCE_NOT_SUPPORTED || radioRsp->rspInfo.error == RadioError::INTERNAL_ERR); @@ -690,7 +694,8 @@ TEST_F(RadioHidlTest, stopLceService) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || - radioRsp->rspInfo.error == RadioError::LCE_NOT_SUPPORTED); + radioRsp->rspInfo.error == RadioError::LCE_NOT_SUPPORTED || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); } } @@ -724,7 +729,8 @@ TEST_F(RadioHidlTest, getModemActivityInfo) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); } } @@ -778,7 +784,8 @@ TEST_F(RadioHidlTest, getAllowedCarriers) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - EXPECT_EQ(radioRsp->rspInfo.error, RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); } } @@ -793,9 +800,11 @@ TEST_F(RadioHidlTest, sendDeviceState) { EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type); EXPECT_EQ(serial, radioRsp->rspInfo.serial); + std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; + if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(CheckGeneralError() || - radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); } } @@ -810,9 +819,11 @@ TEST_F(RadioHidlTest, setIndicationFilter) { EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type); EXPECT_EQ(serial, radioRsp->rspInfo.serial); + std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; + if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(CheckGeneralError() || - radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); } } @@ -828,7 +839,6 @@ TEST_F(RadioHidlTest, setSimCardPower) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); } From e786494ff3dce28f3c398455a0787570f4225308 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Fri, 14 Jul 2017 10:53:26 +0900 Subject: [PATCH 051/265] Remove TODO comment for configstore threadpool size No problem with current configuration has been reported. Bug: 34857894 Test: not required Change-Id: Ie23b234eccb2707323032e37b27b387eb96918e5 --- configstore/1.1/default/service.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/configstore/1.1/default/service.cpp b/configstore/1.1/default/service.cpp index 3a4cd3fd67..52db025107 100644 --- a/configstore/1.1/default/service.cpp +++ b/configstore/1.1/default/service.cpp @@ -30,7 +30,6 @@ using android::status_t; using android::OK; int main() { - // TODO(b/34857894): tune the max thread count. configureRpcThreadpool(10, true); sp surfaceFlingerConfigs = new SurfaceFlingerConfigs; From 815b52d80037f91f5c970e544253ce80d3293717 Mon Sep 17 00:00:00 2001 From: bansukkim Date: Wed, 12 Jul 2017 14:55:24 +0900 Subject: [PATCH 052/265] Rename VtsHalEvsV1_0 Target Test: mma Bug: 62349323 Change-Id: I9f5c9ab808a524b5aebe1ff1ac8e411d196d2d15 --- automotive/evs/1.0/vts/functional/Android.bp | 5 ++--- ...{VtsEvsV1_0TargetTest.cpp => VtsHalEvsV1_0TargetTest.cpp} | 0 2 files changed, 2 insertions(+), 3 deletions(-) rename automotive/evs/1.0/vts/functional/{VtsEvsV1_0TargetTest.cpp => VtsHalEvsV1_0TargetTest.cpp} (100%) diff --git a/automotive/evs/1.0/vts/functional/Android.bp b/automotive/evs/1.0/vts/functional/Android.bp index e86e9bcdd8..555ff5bc42 100644 --- a/automotive/evs/1.0/vts/functional/Android.bp +++ b/automotive/evs/1.0/vts/functional/Android.bp @@ -15,10 +15,10 @@ // cc_test { - name: "VtsEvsV1_0Target", + name: "VtsHalEvsV1_0Target", srcs: [ - "VtsEvsV1_0TargetTest.cpp", + "VtsHalEvsV1_0TargetTest.cpp", "FrameHandler.cpp", "FormatConvert.cpp" ], @@ -43,4 +43,3 @@ cc_test { "-g", ], } - diff --git a/automotive/evs/1.0/vts/functional/VtsEvsV1_0TargetTest.cpp b/automotive/evs/1.0/vts/functional/VtsHalEvsV1_0TargetTest.cpp similarity index 100% rename from automotive/evs/1.0/vts/functional/VtsEvsV1_0TargetTest.cpp rename to automotive/evs/1.0/vts/functional/VtsHalEvsV1_0TargetTest.cpp From afae4643767360a40fac9bb5adbd036b68c12486 Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Thu, 13 Jul 2017 11:16:15 -0700 Subject: [PATCH 053/265] Add OWNERS for audio-related HAL default implementations Test: not needed Change-Id: Idefe7be10bde22866be82f87118b9b54e74c3f40 --- audio/2.0/default/OWNERS | 3 +++ audio/common/2.0/default/OWNERS | 3 +++ audio/common/test/utility/OWNERS | 3 +++ audio/effect/2.0/default/OWNERS | 3 +++ broadcastradio/1.0/default/OWNERS | 4 ++++ soundtrigger/2.0/default/OWNERS | 3 +++ 6 files changed, 19 insertions(+) create mode 100644 audio/2.0/default/OWNERS create mode 100644 audio/common/2.0/default/OWNERS create mode 100644 audio/common/test/utility/OWNERS create mode 100644 audio/effect/2.0/default/OWNERS create mode 100644 broadcastradio/1.0/default/OWNERS create mode 100644 soundtrigger/2.0/default/OWNERS diff --git a/audio/2.0/default/OWNERS b/audio/2.0/default/OWNERS new file mode 100644 index 0000000000..6fdc97ca29 --- /dev/null +++ b/audio/2.0/default/OWNERS @@ -0,0 +1,3 @@ +elaurent@google.com +krocard@google.com +mnaganov@google.com diff --git a/audio/common/2.0/default/OWNERS b/audio/common/2.0/default/OWNERS new file mode 100644 index 0000000000..6fdc97ca29 --- /dev/null +++ b/audio/common/2.0/default/OWNERS @@ -0,0 +1,3 @@ +elaurent@google.com +krocard@google.com +mnaganov@google.com diff --git a/audio/common/test/utility/OWNERS b/audio/common/test/utility/OWNERS new file mode 100644 index 0000000000..6fdc97ca29 --- /dev/null +++ b/audio/common/test/utility/OWNERS @@ -0,0 +1,3 @@ +elaurent@google.com +krocard@google.com +mnaganov@google.com diff --git a/audio/effect/2.0/default/OWNERS b/audio/effect/2.0/default/OWNERS new file mode 100644 index 0000000000..6fdc97ca29 --- /dev/null +++ b/audio/effect/2.0/default/OWNERS @@ -0,0 +1,3 @@ +elaurent@google.com +krocard@google.com +mnaganov@google.com diff --git a/broadcastradio/1.0/default/OWNERS b/broadcastradio/1.0/default/OWNERS new file mode 100644 index 0000000000..b159083944 --- /dev/null +++ b/broadcastradio/1.0/default/OWNERS @@ -0,0 +1,4 @@ +elaurent@google.com +krocard@google.com +mnaganov@google.com +twasilczyk@google.com diff --git a/soundtrigger/2.0/default/OWNERS b/soundtrigger/2.0/default/OWNERS new file mode 100644 index 0000000000..6fdc97ca29 --- /dev/null +++ b/soundtrigger/2.0/default/OWNERS @@ -0,0 +1,3 @@ +elaurent@google.com +krocard@google.com +mnaganov@google.com From 6e87e4c8645bd03938c46d4e23cfba80ad83f310 Mon Sep 17 00:00:00 2001 From: Zhuoyao Zhang Date: Thu, 13 Jul 2017 22:32:46 -0700 Subject: [PATCH 054/265] Update VtsHalCameraProviderV2_4TargetTest * Use VtsHalHidlTargetTestEnvBase to run test against different service name Bug:62946472 Test: make vts vts-tradefed run vts -m VtsHalCameraProviderV2_4Target Change-Id: I12edce57c237cb6674e0aff437c3389e5ad9e028 --- .../VtsHalCameraProviderV2_4TargetTest.cpp | 3424 ++++++++--------- 1 file changed, 1565 insertions(+), 1859 deletions(-) diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index 2ae48535f1..1eea6402ce 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -43,6 +43,7 @@ #include #include +#include using ::android::hardware::Return; using ::android::hardware::Void; @@ -100,7 +101,6 @@ using ::android::hardware::kSynchronizedReadWrite; using ResultMetadataQueue = MessageQueue; using ::android::hidl::manager::V1_0::IServiceManager; -const char kCameraPassthroughServiceName[] = "legacy/0"; const char *kProviderFQName = "android.hardware.camera.provider@2.4::ICameraProvider"; const uint32_t kMaxPreviewWidth = 1920; const uint32_t kMaxPreviewHeight = 1080; @@ -219,66 +219,28 @@ namespace { } // Test environment for camera -class CameraHidlEnvironment : public ::testing::Environment { -public: +class CameraHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase { + public: // get the test environment singleton static CameraHidlEnvironment* Instance() { static CameraHidlEnvironment* instance = new CameraHidlEnvironment; return instance; } - virtual void SetUp() override; - virtual void TearDown() override; + virtual void HidlSetUp() override { ALOGI("SetUp CameraHidlEnvironment"); } - std::unordered_map > mProviders; + virtual void HidlTearDown() override { ALOGI("TearDown CameraHidlEnvironment"); } -private: + virtual void registerTestServices() override { + registerTestService("android.hardware.camera.provider", "2.4", "ICameraProvider"); + } + + private: CameraHidlEnvironment() {} GTEST_DISALLOW_COPY_AND_ASSIGN_(CameraHidlEnvironment); }; -void CameraHidlEnvironment::SetUp() { - sp manager = IServiceManager::getService(); - ASSERT_NE(manager, nullptr); - - manager->listByInterface(kProviderFQName, - [this](const hidl_vec ®istered) { - std::string name; - uint32_t id; - sp provider = nullptr; - for (size_t i = 0; i < registered.size(); i++) { - ASSERT_TRUE(parseProviderName(registered[i], - &name /*out*/, &id /*out*/)); - provider = ICameraProvider::tryGetService(registered[i]); - ALOGI_IF(provider, "provider is not nullptr, %p", provider.get()); - if (nullptr != provider.get()) { - mProviders.emplace(name, provider); - } - } - }); - - std::string legacyName; - uint32_t legacyId; - ASSERT_TRUE(parseProviderName(kCameraPassthroughServiceName, - &legacyName /*out*/, &legacyId /*out*/)); - auto legacyIt = mProviders.find(legacyName); - //Add any legacy passthrough implementations - if (legacyIt == mProviders.end()) { - sp provider = ICameraProvider::tryGetService( - kCameraPassthroughServiceName); - if (nullptr != provider.get()) { - mProviders.emplace(legacyName, provider); - } - } - - ASSERT_FALSE(mProviders.empty()); -} - -void CameraHidlEnvironment::TearDown() { - ALOGI("TearDown CameraHidlEnvironment"); -} - struct BufferItemHander: public BufferItemConsumer::FrameAvailableListener { BufferItemHander(wp consumer) : mConsumer(consumer) {} @@ -521,23 +483,32 @@ Return PreviewWindowCb::setTimestamp(int64_t timestamp) { // The main test class for camera HIDL HAL. class CameraHidlTest : public ::testing::VtsHalHidlTargetTestBase { public: - virtual void SetUp() override {} - virtual void TearDown() override {} + virtual void SetUp() override { + string service_name = CameraHidlEnvironment::Instance()->getServiceName(kProviderFQName); + ALOGI("get service with name: %s", service_name.c_str()); + mProvider = ::testing::VtsHalHidlTargetTestBase::getService(service_name); + ASSERT_NE(mProvider, nullptr); - hidl_vec getCameraDeviceNames(sp provider); + uint32_t id; + ASSERT_TRUE(parseProviderName(service_name, &mProviderType, &id)); + } + virtual void TearDown() override {} - struct EmptyDeviceCb : public ICameraDeviceCallback { - virtual Return processCaptureResult(const hidl_vec& /*results*/) override { - ALOGI("processCaptureResult callback"); - ADD_FAILURE(); // Empty callback should not reach here - return Void(); - } + hidl_vec getCameraDeviceNames(sp provider); - virtual Return notify(const hidl_vec& /*msgs*/) override { - ALOGI("notify callback"); - ADD_FAILURE(); // Empty callback should not reach here - return Void(); - } + struct EmptyDeviceCb : public ICameraDeviceCallback { + virtual Return processCaptureResult( + const hidl_vec& /*results*/) override { + ALOGI("processCaptureResult callback"); + ADD_FAILURE(); // Empty callback should not reach here + return Void(); + } + + virtual Return notify(const hidl_vec& /*msgs*/) override { + ALOGI("notify callback"); + ADD_FAILURE(); // Empty callback should not reach here + return Void(); + } }; struct DeviceCb : public ICameraDeviceCallback { @@ -731,6 +702,11 @@ protected: // Holds camera registered buffers std::unordered_map > mMemoryPool; + + // Camera provider service + sp mProvider; + // Camera provider type. + std::string mProviderType; }; Return CameraHidlTest::Camera1DeviceCb::notifyCallback( @@ -1032,59 +1008,45 @@ hidl_vec CameraHidlTest::getCameraDeviceNames(sp p // Test if ICameraProvider::isTorchModeSupported returns Status::OK TEST_F(CameraHidlTest, isTorchModeSupported) { Return ret; - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - ret = provider.second->isSetTorchModeSupported( - [&](auto status, bool support) { - ALOGI("isSetTorchModeSupported returns status:%d supported:%d", - (int)status, support); - ASSERT_EQ(Status::OK, status); - }); - ASSERT_TRUE(ret.isOk()); - } + ret = mProvider->isSetTorchModeSupported([&](auto status, bool support) { + ALOGI("isSetTorchModeSupported returns status:%d supported:%d", (int)status, support); + ASSERT_EQ(Status::OK, status); + }); + ASSERT_TRUE(ret.isOk()); } // TODO: consider removing this test if getCameraDeviceNames() has the same coverage TEST_F(CameraHidlTest, getCameraIdList) { Return ret; - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - ret = provider.second->getCameraIdList( - [&](auto status, const auto& idList) { - ALOGI("getCameraIdList returns status:%d", (int)status); - for (size_t i = 0; i < idList.size(); i++) { - ALOGI("Camera Id[%zu] is %s", i, idList[i].c_str()); - } - ASSERT_EQ(Status::OK, status); - // This is true for internal camera provider. - // Not necessary hold for external cameras providers - ASSERT_GT(idList.size(), 0u); - }); - ASSERT_TRUE(ret.isOk()); - } + ret = mProvider->getCameraIdList([&](auto status, const auto& idList) { + ALOGI("getCameraIdList returns status:%d", (int)status); + for (size_t i = 0; i < idList.size(); i++) { + ALOGI("Camera Id[%zu] is %s", i, idList[i].c_str()); + } + ASSERT_EQ(Status::OK, status); + // This is true for internal camera provider. + // Not necessary hold for external cameras providers + ASSERT_GT(idList.size(), 0u); + }); + ASSERT_TRUE(ret.isOk()); } // Test if ICameraProvider::getVendorTags returns Status::OK TEST_F(CameraHidlTest, getVendorTags) { Return ret; - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - ret = provider.second->getVendorTags( - [&](auto status, const auto& vendorTagSecs) { - ALOGI("getVendorTags returns status:%d numSections %zu", - (int)status, vendorTagSecs.size()); - for (size_t i = 0; i < vendorTagSecs.size(); i++) { - ALOGI("Vendor tag section %zu name %s", - i, vendorTagSecs[i].sectionName.c_str()); - for (size_t j = 0; j < vendorTagSecs[i].tags.size(); j++) { - const auto& tag = vendorTagSecs[i].tags[j]; - ALOGI("Vendor tag id %u name %s type %d", - tag.tagId, - tag.tagName.c_str(), - (int) tag.tagType); - } - } - ASSERT_EQ(Status::OK, status); - }); - ASSERT_TRUE(ret.isOk()); - } + ret = mProvider->getVendorTags([&](auto status, const auto& vendorTagSecs) { + ALOGI("getVendorTags returns status:%d numSections %zu", (int)status, vendorTagSecs.size()); + for (size_t i = 0; i < vendorTagSecs.size(); i++) { + ALOGI("Vendor tag section %zu name %s", i, vendorTagSecs[i].sectionName.c_str()); + for (size_t j = 0; j < vendorTagSecs[i].tags.size(); j++) { + const auto& tag = vendorTagSecs[i].tags[j]; + ALOGI("Vendor tag id %u name %s type %d", tag.tagId, tag.tagName.c_str(), + (int)tag.tagType); + } + } + ASSERT_EQ(Status::OK, status); + }); + ASSERT_TRUE(ret.isOk()); } // Test if ICameraProvider::setCallback returns Status::OK @@ -1107,45 +1069,34 @@ TEST_F(CameraHidlTest, setCallback) { } }; sp cb = new ProviderCb; - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - auto status = provider.second->setCallback(cb); - ASSERT_TRUE(status.isOk()); - ASSERT_EQ(Status::OK, status); - } + auto status = mProvider->setCallback(cb); + ASSERT_TRUE(status.isOk()); + ASSERT_EQ(Status::OK, status); } // Test if ICameraProvider::getCameraDeviceInterface returns Status::OK and non-null device TEST_F(CameraHidlTest, getCameraDeviceInterface) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - Return ret; - ret = provider.second->getCameraDeviceInterface_V3_x( - name, - [&](auto status, const auto& device3_2) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", - (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device3_2, nullptr); - }); - ASSERT_TRUE(ret.isOk()); - } else if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - Return ret; - ret = provider.second->getCameraDeviceInterface_V1_x( - name, - [&](auto status, const auto& device1) { - ALOGI("getCameraDeviceInterface_V1_x returns status:%d", - (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device1, nullptr); - }); - ASSERT_TRUE(ret.isOk()); - } + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + Return ret; + ret = mProvider->getCameraDeviceInterface_V3_x( + name, [&](auto status, const auto& device3_2) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device3_2, nullptr); + }); + ASSERT_TRUE(ret.isOk()); + } else if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + Return ret; + ret = mProvider->getCameraDeviceInterface_V1_x( + name, [&](auto status, const auto& device1) { + ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device1, nullptr); + }); + ASSERT_TRUE(ret.isOk()); } } } @@ -1153,66 +1104,55 @@ TEST_F(CameraHidlTest, getCameraDeviceInterface) { // Verify that the device resource cost can be retrieved and the values are // sane. TEST_F(CameraHidlTest, getResourceCost) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; - ALOGI("getResourceCost: Testing camera device %s", name.c_str()); - Return ret; - ret = provider.second->getCameraDeviceInterface_V3_x( - name, - [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", - (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device3_2 = device; - }); - ASSERT_TRUE(ret.isOk()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; + ALOGI("getResourceCost: Testing camera device %s", name.c_str()); + Return ret; + ret = mProvider->getCameraDeviceInterface_V3_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device3_2 = device; + }); + ASSERT_TRUE(ret.isOk()); - ret = device3_2->getResourceCost( - [&](auto status, const auto& resourceCost) { - ALOGI("getResourceCost returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ALOGI(" Resource cost is %d", resourceCost.resourceCost); - ASSERT_LE(resourceCost.resourceCost, 100u); - for (const auto& name : resourceCost.conflictingDevices) { - ALOGI(" Conflicting device: %s", name.c_str()); - } - }); - ASSERT_TRUE(ret.isOk()); - } else { - ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - ALOGI("getResourceCost: Testing camera device %s", name.c_str()); - Return ret; - ret = provider.second->getCameraDeviceInterface_V1_x( - name, - [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V1_x returns status:%d", - (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device1 = device; - }); - ASSERT_TRUE(ret.isOk()); + ret = device3_2->getResourceCost([&](auto status, const auto& resourceCost) { + ALOGI("getResourceCost returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ALOGI(" Resource cost is %d", resourceCost.resourceCost); + ASSERT_LE(resourceCost.resourceCost, 100u); + for (const auto& name : resourceCost.conflictingDevices) { + ALOGI(" Conflicting device: %s", name.c_str()); + } + }); + ASSERT_TRUE(ret.isOk()); + } else { + ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + ALOGI("getResourceCost: Testing camera device %s", name.c_str()); + Return ret; + ret = mProvider->getCameraDeviceInterface_V1_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device1 = device; + }); + ASSERT_TRUE(ret.isOk()); - ret = device1->getResourceCost( - [&](auto status, const auto& resourceCost) { - ALOGI("getResourceCost returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ALOGI(" Resource cost is %d", - resourceCost.resourceCost); - ASSERT_LE(resourceCost.resourceCost, 100u); - for (const auto& name : resourceCost.conflictingDevices) { - ALOGI(" Conflicting device: %s", name.c_str()); - } - }); - ASSERT_TRUE(ret.isOk()); - } + ret = device1->getResourceCost([&](auto status, const auto& resourceCost) { + ALOGI("getResourceCost returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ALOGI(" Resource cost is %d", resourceCost.resourceCost); + ASSERT_LE(resourceCost.resourceCost, 100u); + for (const auto& name : resourceCost.conflictingDevices) { + ALOGI(" Conflicting device: %s", name.c_str()); + } + }); + ASSERT_TRUE(ret.isOk()); } } } @@ -1220,143 +1160,117 @@ TEST_F(CameraHidlTest, getResourceCost) { // Verify that the static camera info can be retrieved // successfully. TEST_F(CameraHidlTest, getCameraInfo) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - ALOGI("getCameraCharacteristics: Testing camera device %s", - name.c_str()); - Return ret; - ret = provider.second->getCameraDeviceInterface_V1_x( - name, - [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V1_x returns status:%d", - (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device1 = device; - }); - ASSERT_TRUE(ret.isOk()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + ALOGI("getCameraCharacteristics: Testing camera device %s", name.c_str()); + Return ret; + ret = mProvider->getCameraDeviceInterface_V1_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device1 = device; + }); + ASSERT_TRUE(ret.isOk()); - ret = device1->getCameraInfo( - [&](auto status, const auto& info) { - ALOGI("getCameraInfo returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - switch(info.orientation) { - case 0: - case 90: - case 180: - case 270: - //Expected cases - ALOGI("camera orientation: %d", info.orientation); - break; - default: - FAIL() << "Unexpected camera orientation:" << info.orientation; - } - switch(info.facing) { - case CameraFacing::BACK: - case CameraFacing::FRONT: - case CameraFacing::EXTERNAL: - //Expected cases - ALOGI("camera facing: %d", info.facing); - break; - default: - FAIL() << "Unexpected camera facing:" << static_cast ( - info.facing); - } - }); - ASSERT_TRUE(ret.isOk()); - } + ret = device1->getCameraInfo([&](auto status, const auto& info) { + ALOGI("getCameraInfo returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + switch (info.orientation) { + case 0: + case 90: + case 180: + case 270: + // Expected cases + ALOGI("camera orientation: %d", info.orientation); + break; + default: + FAIL() << "Unexpected camera orientation:" << info.orientation; + } + switch (info.facing) { + case CameraFacing::BACK: + case CameraFacing::FRONT: + case CameraFacing::EXTERNAL: + // Expected cases + ALOGI("camera facing: %d", info.facing); + break; + default: + FAIL() << "Unexpected camera facing:" << static_cast(info.facing); + } + }); + ASSERT_TRUE(ret.isOk()); } } } // Check whether preview window can be configured TEST_F(CameraHidlTest, setPreviewWindow) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); - sp bufferItemConsumer; - sp bufferHandler; - setupPreviewWindow(device1, - &bufferItemConsumer /*out*/, &bufferHandler /*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); + sp bufferItemConsumer; + sp bufferHandler; + setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); - Return ret; - ret = device1->close(); - ASSERT_TRUE(ret.isOk()); - } + Return ret; + ret = device1->close(); + ASSERT_TRUE(ret.isOk()); } } } // Verify that setting preview window fails in case device is not open TEST_F(CameraHidlTest, setPreviewWindowInvalid) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - ALOGI("getCameraCharacteristics: Testing camera device %s", - name.c_str()); - Return ret; - ret = provider.second->getCameraDeviceInterface_V1_x( - name, - [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V1_x returns status:%d", - (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device1 = device; - }); - ASSERT_TRUE(ret.isOk()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + ALOGI("getCameraCharacteristics: Testing camera device %s", name.c_str()); + Return ret; + ret = mProvider->getCameraDeviceInterface_V1_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device1 = device; + }); + ASSERT_TRUE(ret.isOk()); - Return returnStatus = device1->setPreviewWindow(nullptr); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OPERATION_NOT_SUPPORTED, returnStatus); - } + Return returnStatus = device1->setPreviewWindow(nullptr); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OPERATION_NOT_SUPPORTED, returnStatus); } } } // Start and stop preview checking whether it gets enabled in between. TEST_F(CameraHidlTest, startStopPreview) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); - sp bufferItemConsumer; - sp bufferHandler; - setupPreviewWindow(device1, - &bufferItemConsumer /*out*/, &bufferHandler /*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); + sp bufferItemConsumer; + sp bufferHandler; + setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); - startPreview(device1); + startPreview(device1); - Return returnBoolStatus = device1->previewEnabled(); - ASSERT_TRUE(returnBoolStatus.isOk()); - ASSERT_TRUE(returnBoolStatus); + Return returnBoolStatus = device1->previewEnabled(); + ASSERT_TRUE(returnBoolStatus.isOk()); + ASSERT_TRUE(returnBoolStatus); - stopPreviewAndClose(device1); - } + stopPreviewAndClose(device1); } } } @@ -1364,646 +1278,552 @@ TEST_F(CameraHidlTest, startStopPreview) { // Start preview without active preview window. Preview should start as soon // as a valid active window gets configured. TEST_F(CameraHidlTest, startStopPreviewDelayed) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); - Return returnStatus = device1->setPreviewWindow(nullptr); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); + Return returnStatus = device1->setPreviewWindow(nullptr); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); - startPreview(device1); + startPreview(device1); - sp bufferItemConsumer; - sp bufferHandler; - setupPreviewWindow(device1, &bufferItemConsumer /*out*/, - &bufferHandler /*out*/); + sp bufferItemConsumer; + sp bufferHandler; + setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); - //Preview should get enabled now - Return returnBoolStatus = device1->previewEnabled(); - ASSERT_TRUE(returnBoolStatus.isOk()); - ASSERT_TRUE(returnBoolStatus); + // Preview should get enabled now + Return returnBoolStatus = device1->previewEnabled(); + ASSERT_TRUE(returnBoolStatus.isOk()); + ASSERT_TRUE(returnBoolStatus); - stopPreviewAndClose(device1); - } + stopPreviewAndClose(device1); } } } // Verify that image capture behaves as expected along with preview callbacks. TEST_F(CameraHidlTest, takePicture) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); - sp bufferItemConsumer; - sp bufferHandler; - setupPreviewWindow(device1, &bufferItemConsumer /*out*/, - &bufferHandler /*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); + sp bufferItemConsumer; + sp bufferHandler; + setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); - { - std::unique_lock l(mLock); - mDataMessageTypeReceived = DataCallbackMsg::RAW_IMAGE_NOTIFY; - } - - enableMsgType((unsigned int)DataCallbackMsg::PREVIEW_FRAME, - device1); - startPreview(device1); - - { - std::unique_lock l(mLock); - waitForFrameLocked(DataCallbackMsg::PREVIEW_FRAME, l); - } - - disableMsgType((unsigned int)DataCallbackMsg::PREVIEW_FRAME, - device1); - enableMsgType((unsigned int)DataCallbackMsg::COMPRESSED_IMAGE, - device1); - - { - std::unique_lock l(mLock); - mDataMessageTypeReceived = DataCallbackMsg::RAW_IMAGE_NOTIFY; - } - - Return returnStatus = device1->takePicture(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - - { - std::unique_lock l(mLock); - waitForFrameLocked(DataCallbackMsg::COMPRESSED_IMAGE, l); - } - - disableMsgType((unsigned int)DataCallbackMsg::COMPRESSED_IMAGE, - device1); - stopPreviewAndClose(device1); + { + std::unique_lock l(mLock); + mDataMessageTypeReceived = DataCallbackMsg::RAW_IMAGE_NOTIFY; } + + enableMsgType((unsigned int)DataCallbackMsg::PREVIEW_FRAME, device1); + startPreview(device1); + + { + std::unique_lock l(mLock); + waitForFrameLocked(DataCallbackMsg::PREVIEW_FRAME, l); + } + + disableMsgType((unsigned int)DataCallbackMsg::PREVIEW_FRAME, device1); + enableMsgType((unsigned int)DataCallbackMsg::COMPRESSED_IMAGE, device1); + + { + std::unique_lock l(mLock); + mDataMessageTypeReceived = DataCallbackMsg::RAW_IMAGE_NOTIFY; + } + + Return returnStatus = device1->takePicture(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + + { + std::unique_lock l(mLock); + waitForFrameLocked(DataCallbackMsg::COMPRESSED_IMAGE, l); + } + + disableMsgType((unsigned int)DataCallbackMsg::COMPRESSED_IMAGE, device1); + stopPreviewAndClose(device1); } } } // Image capture should fail in case preview didn't get enabled first. TEST_F(CameraHidlTest, takePictureFail) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); - Return returnStatus = device1->takePicture(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_NE(Status::OK, returnStatus); + Return returnStatus = device1->takePicture(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_NE(Status::OK, returnStatus); - Return ret = device1->close(); - ASSERT_TRUE(ret.isOk()); - } + Return ret = device1->close(); + ASSERT_TRUE(ret.isOk()); } } } // Verify that image capture can be cancelled. TEST_F(CameraHidlTest, cancelPicture) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); - sp bufferItemConsumer; - sp bufferHandler; - setupPreviewWindow(device1, &bufferItemConsumer /*out*/, - &bufferHandler /*out*/); - startPreview(device1); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); + sp bufferItemConsumer; + sp bufferHandler; + setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); + startPreview(device1); - Return returnStatus = device1->takePicture(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); + Return returnStatus = device1->takePicture(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); - returnStatus = device1->cancelPicture(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); + returnStatus = device1->cancelPicture(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); - stopPreviewAndClose(device1); - } + stopPreviewAndClose(device1); } } } // Image capture cancel should fail when image capture is not running. TEST_F(CameraHidlTest, cancelPictureFail) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); - sp bufferItemConsumer; - sp bufferHandler; - setupPreviewWindow(device1, &bufferItemConsumer /*out*/, - &bufferHandler /*out*/); - startPreview(device1); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); + sp bufferItemConsumer; + sp bufferHandler; + setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); + startPreview(device1); - Return returnStatus = device1->cancelPicture(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_NE(Status::OK, returnStatus); + Return returnStatus = device1->cancelPicture(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_NE(Status::OK, returnStatus); - stopPreviewAndClose(device1); - } + stopPreviewAndClose(device1); } } } // Test basic video recording. TEST_F(CameraHidlTest, startStopRecording) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); - sp bufferItemConsumer; - sp bufferHandler; - setupPreviewWindow(device1, &bufferItemConsumer /*out*/, - &bufferHandler /*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); + sp bufferItemConsumer; + sp bufferHandler; + setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); - { - std::unique_lock l(mLock); - mDataMessageTypeReceived = DataCallbackMsg::RAW_IMAGE_NOTIFY; - } - - enableMsgType((unsigned int)DataCallbackMsg::PREVIEW_FRAME, - device1); - startPreview(device1); - - { - std::unique_lock l(mLock); - waitForFrameLocked(DataCallbackMsg::PREVIEW_FRAME, l); - mDataMessageTypeReceived = DataCallbackMsg::RAW_IMAGE_NOTIFY; - mVideoBufferIndex = UINT32_MAX; - } - - disableMsgType((unsigned int)DataCallbackMsg::PREVIEW_FRAME, - device1); - - bool videoMetaEnabled = false; - Return returnStatus = device1->storeMetaDataInBuffers( - true); - ASSERT_TRUE(returnStatus.isOk()); - // It is allowed for devices to not support this feature - ASSERT_TRUE((Status::OK == returnStatus) || - (Status::OPERATION_NOT_SUPPORTED == returnStatus)); - if (Status::OK == returnStatus) { - videoMetaEnabled = true; - } - - enableMsgType((unsigned int)DataCallbackMsg::VIDEO_FRAME, - device1); - Return returnBoolStatus = device1->recordingEnabled(); - ASSERT_TRUE(returnBoolStatus.isOk()); - ASSERT_FALSE(returnBoolStatus); - - returnStatus = device1->startRecording(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - - { - std::unique_lock l(mLock); - waitForFrameLocked(DataCallbackMsg::VIDEO_FRAME, l); - ASSERT_NE(UINT32_MAX, mVideoBufferIndex); - disableMsgType((unsigned int)DataCallbackMsg::VIDEO_FRAME, - device1); - } - - returnBoolStatus = device1->recordingEnabled(); - ASSERT_TRUE(returnBoolStatus.isOk()); - ASSERT_TRUE(returnBoolStatus); - - Return ret; - if (videoMetaEnabled) { - ret = device1->releaseRecordingFrameHandle(mVideoData, - mVideoBufferIndex, mVideoNativeHandle); - ASSERT_TRUE(ret.isOk()); - } else { - ret = device1->releaseRecordingFrame(mVideoData, - mVideoBufferIndex); - ASSERT_TRUE(ret.isOk()); - } - - ret = device1->stopRecording(); - ASSERT_TRUE(ret.isOk()); - - stopPreviewAndClose(device1); + { + std::unique_lock l(mLock); + mDataMessageTypeReceived = DataCallbackMsg::RAW_IMAGE_NOTIFY; } + + enableMsgType((unsigned int)DataCallbackMsg::PREVIEW_FRAME, device1); + startPreview(device1); + + { + std::unique_lock l(mLock); + waitForFrameLocked(DataCallbackMsg::PREVIEW_FRAME, l); + mDataMessageTypeReceived = DataCallbackMsg::RAW_IMAGE_NOTIFY; + mVideoBufferIndex = UINT32_MAX; + } + + disableMsgType((unsigned int)DataCallbackMsg::PREVIEW_FRAME, device1); + + bool videoMetaEnabled = false; + Return returnStatus = device1->storeMetaDataInBuffers(true); + ASSERT_TRUE(returnStatus.isOk()); + // It is allowed for devices to not support this feature + ASSERT_TRUE((Status::OK == returnStatus) || + (Status::OPERATION_NOT_SUPPORTED == returnStatus)); + if (Status::OK == returnStatus) { + videoMetaEnabled = true; + } + + enableMsgType((unsigned int)DataCallbackMsg::VIDEO_FRAME, device1); + Return returnBoolStatus = device1->recordingEnabled(); + ASSERT_TRUE(returnBoolStatus.isOk()); + ASSERT_FALSE(returnBoolStatus); + + returnStatus = device1->startRecording(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + + { + std::unique_lock l(mLock); + waitForFrameLocked(DataCallbackMsg::VIDEO_FRAME, l); + ASSERT_NE(UINT32_MAX, mVideoBufferIndex); + disableMsgType((unsigned int)DataCallbackMsg::VIDEO_FRAME, device1); + } + + returnBoolStatus = device1->recordingEnabled(); + ASSERT_TRUE(returnBoolStatus.isOk()); + ASSERT_TRUE(returnBoolStatus); + + Return ret; + if (videoMetaEnabled) { + ret = device1->releaseRecordingFrameHandle(mVideoData, mVideoBufferIndex, + mVideoNativeHandle); + ASSERT_TRUE(ret.isOk()); + } else { + ret = device1->releaseRecordingFrame(mVideoData, mVideoBufferIndex); + ASSERT_TRUE(ret.isOk()); + } + + ret = device1->stopRecording(); + ASSERT_TRUE(ret.isOk()); + + stopPreviewAndClose(device1); } } } // It shouldn't be possible to start recording without enabling preview first. TEST_F(CameraHidlTest, startRecordingFail) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); - Return returnBoolStatus = device1->recordingEnabled(); - ASSERT_TRUE(returnBoolStatus.isOk()); - ASSERT_FALSE(returnBoolStatus); + Return returnBoolStatus = device1->recordingEnabled(); + ASSERT_TRUE(returnBoolStatus.isOk()); + ASSERT_FALSE(returnBoolStatus); - Return returnStatus = device1->startRecording(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_NE(Status::OK, returnStatus); + Return returnStatus = device1->startRecording(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_NE(Status::OK, returnStatus); - Return ret = device1->close(); - ASSERT_TRUE(ret.isOk()); - } + Return ret = device1->close(); + ASSERT_TRUE(ret.isOk()); } } } // Check autofocus support if available. TEST_F(CameraHidlTest, autoFocus) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); - std::vector focusModes = {CameraParameters::FOCUS_MODE_AUTO, - CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE, - CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO}; + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); + std::vector focusModes = {CameraParameters::FOCUS_MODE_AUTO, + CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE, + CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO}; - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); - CameraParameters cameraParams; - getParameters(device1, &cameraParams /*out*/); + CameraParameters cameraParams; + getParameters(device1, &cameraParams /*out*/); - if (Status::OK != isAutoFocusModeAvailable(cameraParams, - CameraParameters::FOCUS_MODE_AUTO)) { - Return ret = device1->close(); - ASSERT_TRUE(ret.isOk()); + if (Status::OK != + isAutoFocusModeAvailable(cameraParams, CameraParameters::FOCUS_MODE_AUTO)) { + Return ret = device1->close(); + ASSERT_TRUE(ret.isOk()); + continue; + } + + sp bufferItemConsumer; + sp bufferHandler; + setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); + startPreview(device1); + enableMsgType((unsigned int)NotifyCallbackMsg::FOCUS, device1); + + for (auto& iter : focusModes) { + if (Status::OK != isAutoFocusModeAvailable(cameraParams, iter)) { continue; } - sp bufferItemConsumer; - sp bufferHandler; - setupPreviewWindow(device1, &bufferItemConsumer /*out*/, - &bufferHandler /*out*/); - startPreview(device1); - enableMsgType((unsigned int)NotifyCallbackMsg::FOCUS, device1); - - for (auto &iter : focusModes) { - if (Status::OK != isAutoFocusModeAvailable(cameraParams, - iter)) { - continue; - } - - cameraParams.set(CameraParameters::KEY_FOCUS_MODE, iter); - setParameters(device1, cameraParams); - { - std::unique_lock l(mLock); - mNotifyMessage = NotifyCallbackMsg::ERROR; - } - - Return returnStatus = device1->autoFocus(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - - { - std::unique_lock l(mLock); - while (NotifyCallbackMsg::FOCUS != mNotifyMessage) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kAutoFocusTimeoutSec); - ASSERT_NE(std::cv_status::timeout, - mResultCondition.wait_until(l, timeout)); - } - } + cameraParams.set(CameraParameters::KEY_FOCUS_MODE, iter); + setParameters(device1, cameraParams); + { + std::unique_lock l(mLock); + mNotifyMessage = NotifyCallbackMsg::ERROR; } - disableMsgType((unsigned int)NotifyCallbackMsg::FOCUS, device1); - stopPreviewAndClose(device1); + Return returnStatus = device1->autoFocus(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + + { + std::unique_lock l(mLock); + while (NotifyCallbackMsg::FOCUS != mNotifyMessage) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kAutoFocusTimeoutSec); + ASSERT_NE(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); + } + } } + + disableMsgType((unsigned int)NotifyCallbackMsg::FOCUS, device1); + stopPreviewAndClose(device1); } } } // In case autofocus is supported verify that it can be cancelled. TEST_F(CameraHidlTest, cancelAutoFocus) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); - CameraParameters cameraParams; - getParameters(device1, &cameraParams /*out*/); + CameraParameters cameraParams; + getParameters(device1, &cameraParams /*out*/); - if (Status::OK != isAutoFocusModeAvailable(cameraParams, - CameraParameters::FOCUS_MODE_AUTO)) { - Return ret = device1->close(); - ASSERT_TRUE(ret.isOk()); - continue; - } - - // It should be fine to call before preview starts. - ASSERT_EQ(Status::OK, device1->cancelAutoFocus()); - - sp bufferItemConsumer; - sp bufferHandler; - setupPreviewWindow(device1, &bufferItemConsumer /*out*/, - &bufferHandler /*out*/); - startPreview(device1); - - // It should be fine to call after preview starts too. - Return returnStatus = device1->cancelAutoFocus(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - - returnStatus = device1->autoFocus(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - - returnStatus = device1->cancelAutoFocus(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - - stopPreviewAndClose(device1); + if (Status::OK != + isAutoFocusModeAvailable(cameraParams, CameraParameters::FOCUS_MODE_AUTO)) { + Return ret = device1->close(); + ASSERT_TRUE(ret.isOk()); + continue; } + + // It should be fine to call before preview starts. + ASSERT_EQ(Status::OK, device1->cancelAutoFocus()); + + sp bufferItemConsumer; + sp bufferHandler; + setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); + startPreview(device1); + + // It should be fine to call after preview starts too. + Return returnStatus = device1->cancelAutoFocus(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + + returnStatus = device1->autoFocus(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + + returnStatus = device1->cancelAutoFocus(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + + stopPreviewAndClose(device1); } } } // Check whether face detection is available and try to enable&disable. TEST_F(CameraHidlTest, sendCommandFaceDetection) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); - CameraParameters cameraParams; - getParameters(device1, &cameraParams /*out*/); + CameraParameters cameraParams; + getParameters(device1, &cameraParams /*out*/); - int32_t hwFaces = cameraParams.getInt( - CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW); - int32_t swFaces = cameraParams.getInt( - CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW); - if ((0 >= hwFaces) && (0 >= swFaces)) { - Return ret = device1->close(); - ASSERT_TRUE(ret.isOk()); - continue; - } - - sp bufferItemConsumer; - sp bufferHandler; - setupPreviewWindow(device1, &bufferItemConsumer /*out*/, - &bufferHandler /*out*/); - startPreview(device1); - - if (0 < hwFaces) { - Return returnStatus = device1->sendCommand( - CommandType::START_FACE_DETECTION, - CAMERA_FACE_DETECTION_HW, 0); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - // TODO(epeev) : Enable and check for face notifications - returnStatus = device1->sendCommand( - CommandType::STOP_FACE_DETECTION, - CAMERA_FACE_DETECTION_HW, 0); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - } - - if (0 < swFaces) { - Return returnStatus = device1->sendCommand( - CommandType::START_FACE_DETECTION, - CAMERA_FACE_DETECTION_SW, 0); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - // TODO(epeev) : Enable and check for face notifications - returnStatus = device1->sendCommand( - CommandType::STOP_FACE_DETECTION, - CAMERA_FACE_DETECTION_SW, 0); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - } - - stopPreviewAndClose(device1); + int32_t hwFaces = cameraParams.getInt(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW); + int32_t swFaces = cameraParams.getInt(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW); + if ((0 >= hwFaces) && (0 >= swFaces)) { + Return ret = device1->close(); + ASSERT_TRUE(ret.isOk()); + continue; } + + sp bufferItemConsumer; + sp bufferHandler; + setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); + startPreview(device1); + + if (0 < hwFaces) { + Return returnStatus = device1->sendCommand( + CommandType::START_FACE_DETECTION, CAMERA_FACE_DETECTION_HW, 0); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + // TODO(epeev) : Enable and check for face notifications + returnStatus = device1->sendCommand(CommandType::STOP_FACE_DETECTION, + CAMERA_FACE_DETECTION_HW, 0); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + } + + if (0 < swFaces) { + Return returnStatus = device1->sendCommand( + CommandType::START_FACE_DETECTION, CAMERA_FACE_DETECTION_SW, 0); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + // TODO(epeev) : Enable and check for face notifications + returnStatus = device1->sendCommand(CommandType::STOP_FACE_DETECTION, + CAMERA_FACE_DETECTION_SW, 0); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + } + + stopPreviewAndClose(device1); } } } // Check whether smooth zoom is available and try to enable&disable. TEST_F(CameraHidlTest, sendCommandSmoothZoom) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); - CameraParameters cameraParams; - getParameters(device1, &cameraParams /*out*/); + CameraParameters cameraParams; + getParameters(device1, &cameraParams /*out*/); - const char *smoothZoomStr = cameraParams.get( - CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED); - bool smoothZoomSupported = ((nullptr != smoothZoomStr) && - (strcmp(smoothZoomStr, CameraParameters::TRUE) == 0)) ? - true : false; - if (!smoothZoomSupported) { - Return ret = device1->close(); - ASSERT_TRUE(ret.isOk()); - continue; - } - - int32_t maxZoom = cameraParams.getInt( - CameraParameters::KEY_MAX_ZOOM); - ASSERT_TRUE(0 < maxZoom); - - sp bufferItemConsumer; - sp bufferHandler; - setupPreviewWindow(device1, &bufferItemConsumer /*out*/, - &bufferHandler /*out*/); - startPreview(device1); - setParameters(device1, cameraParams); - - Return returnStatus = device1->sendCommand( - CommandType::START_SMOOTH_ZOOM, maxZoom, 0); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - // TODO(epeev) : Enable and check for face notifications - returnStatus = device1->sendCommand( - CommandType::STOP_SMOOTH_ZOOM, 0, 0); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - - stopPreviewAndClose(device1); + const char* smoothZoomStr = + cameraParams.get(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED); + bool smoothZoomSupported = + ((nullptr != smoothZoomStr) && (strcmp(smoothZoomStr, CameraParameters::TRUE) == 0)) + ? true + : false; + if (!smoothZoomSupported) { + Return ret = device1->close(); + ASSERT_TRUE(ret.isOk()); + continue; } + + int32_t maxZoom = cameraParams.getInt(CameraParameters::KEY_MAX_ZOOM); + ASSERT_TRUE(0 < maxZoom); + + sp bufferItemConsumer; + sp bufferHandler; + setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); + startPreview(device1); + setParameters(device1, cameraParams); + + Return returnStatus = + device1->sendCommand(CommandType::START_SMOOTH_ZOOM, maxZoom, 0); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + // TODO(epeev) : Enable and check for face notifications + returnStatus = device1->sendCommand(CommandType::STOP_SMOOTH_ZOOM, 0, 0); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + + stopPreviewAndClose(device1); } } } // Basic sanity tests related to camera parameters. TEST_F(CameraHidlTest, getSetParameters) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); - CameraParameters cameraParams; - getParameters(device1, &cameraParams /*out*/); + CameraParameters cameraParams; + getParameters(device1, &cameraParams /*out*/); - int32_t width, height; - cameraParams.getPictureSize(&width, &height); - ASSERT_TRUE((0 < width) && (0 < height)); - cameraParams.getPreviewSize(&width, &height); - ASSERT_TRUE((0 < width) && (0 < height)); - int32_t minFps, maxFps; - cameraParams.getPreviewFpsRange(&minFps, &maxFps); - ASSERT_TRUE((0 < minFps) && (0 < maxFps)); - ASSERT_NE(nullptr, cameraParams.getPreviewFormat()); - ASSERT_NE(nullptr, cameraParams.getPictureFormat()); - ASSERT_TRUE(strcmp(CameraParameters::PIXEL_FORMAT_JPEG, - cameraParams.getPictureFormat()) == 0); + int32_t width, height; + cameraParams.getPictureSize(&width, &height); + ASSERT_TRUE((0 < width) && (0 < height)); + cameraParams.getPreviewSize(&width, &height); + ASSERT_TRUE((0 < width) && (0 < height)); + int32_t minFps, maxFps; + cameraParams.getPreviewFpsRange(&minFps, &maxFps); + ASSERT_TRUE((0 < minFps) && (0 < maxFps)); + ASSERT_NE(nullptr, cameraParams.getPreviewFormat()); + ASSERT_NE(nullptr, cameraParams.getPictureFormat()); + ASSERT_TRUE( + strcmp(CameraParameters::PIXEL_FORMAT_JPEG, cameraParams.getPictureFormat()) == 0); - const char *flashMode = cameraParams.get( - CameraParameters::KEY_FLASH_MODE); - ASSERT_TRUE((nullptr == flashMode) || (strcmp( - CameraParameters::FLASH_MODE_OFF, flashMode) == 0)); + const char* flashMode = cameraParams.get(CameraParameters::KEY_FLASH_MODE); + ASSERT_TRUE((nullptr == flashMode) || + (strcmp(CameraParameters::FLASH_MODE_OFF, flashMode) == 0)); - const char *wbMode = cameraParams.get( - CameraParameters::KEY_WHITE_BALANCE); - ASSERT_TRUE((nullptr == wbMode) || (strcmp( - CameraParameters::WHITE_BALANCE_AUTO, wbMode) == 0)); + const char* wbMode = cameraParams.get(CameraParameters::KEY_WHITE_BALANCE); + ASSERT_TRUE((nullptr == wbMode) || + (strcmp(CameraParameters::WHITE_BALANCE_AUTO, wbMode) == 0)); - const char *effect = cameraParams.get( - CameraParameters::KEY_EFFECT); - ASSERT_TRUE((nullptr == effect) || (strcmp( - CameraParameters::EFFECT_NONE, effect) == 0)); + const char* effect = cameraParams.get(CameraParameters::KEY_EFFECT); + ASSERT_TRUE((nullptr == effect) || + (strcmp(CameraParameters::EFFECT_NONE, effect) == 0)); - ::android::Vector previewSizes; - cameraParams.getSupportedPreviewSizes(previewSizes); - ASSERT_FALSE(previewSizes.empty()); - ::android::Vector pictureSizes; - cameraParams.getSupportedPictureSizes(pictureSizes); - ASSERT_FALSE(pictureSizes.empty()); - const char *previewFormats = cameraParams.get( - CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS); - ASSERT_NE(nullptr, previewFormats); - ::android::String8 previewFormatsString(previewFormats); - ASSERT_TRUE(previewFormatsString.contains( - CameraParameters::PIXEL_FORMAT_YUV420SP)); - ASSERT_NE(nullptr, cameraParams.get( - CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS)); - ASSERT_NE(nullptr, cameraParams.get( - CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES)); - const char *focusModes = cameraParams.get( - CameraParameters::KEY_SUPPORTED_FOCUS_MODES); - ASSERT_NE(nullptr, focusModes); - ::android::String8 focusModesString(focusModes); - const char *focusMode = cameraParams.get( - CameraParameters::KEY_FOCUS_MODE); - ASSERT_NE(nullptr, focusMode); - // Auto focus mode should be default - if (focusModesString.contains( - CameraParameters::FOCUS_MODE_AUTO)) { - ASSERT_TRUE(strcmp( - CameraParameters::FOCUS_MODE_AUTO, focusMode) == 0); - } - ASSERT_TRUE(0 < cameraParams.getInt( - CameraParameters::KEY_FOCAL_LENGTH)); - int32_t horizontalViewAngle = cameraParams.getInt( - CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE); - ASSERT_TRUE((0 < horizontalViewAngle) && - (360 >= horizontalViewAngle)); - int32_t verticalViewAngle = cameraParams.getInt( - CameraParameters::KEY_VERTICAL_VIEW_ANGLE); - ASSERT_TRUE((0 < verticalViewAngle) && - (360 >= verticalViewAngle)); - int32_t jpegQuality = cameraParams.getInt( - CameraParameters::KEY_JPEG_QUALITY); - ASSERT_TRUE((1 <= jpegQuality) && (100 >= jpegQuality)); - int32_t jpegThumbQuality = cameraParams.getInt( - CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); - ASSERT_TRUE((1 <= jpegThumbQuality) && - (100 >= jpegThumbQuality)); - - cameraParams.setPictureSize(pictureSizes[0].width, - pictureSizes[0].height); - cameraParams.setPreviewSize(previewSizes[0].width, - previewSizes[0].height); - - setParameters(device1, cameraParams); - getParameters(device1, &cameraParams /*out*/); - - cameraParams.getPictureSize(&width, &height); - ASSERT_TRUE((pictureSizes[0].width == width) && - (pictureSizes[0].height == height)); - cameraParams.getPreviewSize(&width, &height); - ASSERT_TRUE((previewSizes[0].width == width) && - (previewSizes[0].height == height)); - - Return ret = device1->close(); - ASSERT_TRUE(ret.isOk()); + ::android::Vector previewSizes; + cameraParams.getSupportedPreviewSizes(previewSizes); + ASSERT_FALSE(previewSizes.empty()); + ::android::Vector pictureSizes; + cameraParams.getSupportedPictureSizes(pictureSizes); + ASSERT_FALSE(pictureSizes.empty()); + const char* previewFormats = + cameraParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS); + ASSERT_NE(nullptr, previewFormats); + ::android::String8 previewFormatsString(previewFormats); + ASSERT_TRUE(previewFormatsString.contains(CameraParameters::PIXEL_FORMAT_YUV420SP)); + ASSERT_NE(nullptr, cameraParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS)); + ASSERT_NE(nullptr, + cameraParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES)); + const char* focusModes = cameraParams.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES); + ASSERT_NE(nullptr, focusModes); + ::android::String8 focusModesString(focusModes); + const char* focusMode = cameraParams.get(CameraParameters::KEY_FOCUS_MODE); + ASSERT_NE(nullptr, focusMode); + // Auto focus mode should be default + if (focusModesString.contains(CameraParameters::FOCUS_MODE_AUTO)) { + ASSERT_TRUE(strcmp(CameraParameters::FOCUS_MODE_AUTO, focusMode) == 0); } + ASSERT_TRUE(0 < cameraParams.getInt(CameraParameters::KEY_FOCAL_LENGTH)); + int32_t horizontalViewAngle = + cameraParams.getInt(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE); + ASSERT_TRUE((0 < horizontalViewAngle) && (360 >= horizontalViewAngle)); + int32_t verticalViewAngle = + cameraParams.getInt(CameraParameters::KEY_VERTICAL_VIEW_ANGLE); + ASSERT_TRUE((0 < verticalViewAngle) && (360 >= verticalViewAngle)); + int32_t jpegQuality = cameraParams.getInt(CameraParameters::KEY_JPEG_QUALITY); + ASSERT_TRUE((1 <= jpegQuality) && (100 >= jpegQuality)); + int32_t jpegThumbQuality = + cameraParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); + ASSERT_TRUE((1 <= jpegThumbQuality) && (100 >= jpegThumbQuality)); + + cameraParams.setPictureSize(pictureSizes[0].width, pictureSizes[0].height); + cameraParams.setPreviewSize(previewSizes[0].width, previewSizes[0].height); + + setParameters(device1, cameraParams); + getParameters(device1, &cameraParams /*out*/); + + cameraParams.getPictureSize(&width, &height); + ASSERT_TRUE((pictureSizes[0].width == width) && (pictureSizes[0].height == height)); + cameraParams.getPreviewSize(&width, &height); + ASSERT_TRUE((previewSizes[0].width == width) && (previewSizes[0].height == height)); + + Return ret = device1->close(); + ASSERT_TRUE(ret.isOk()); } } } @@ -2011,50 +1831,36 @@ TEST_F(CameraHidlTest, getSetParameters) { // Verify that the static camera characteristics can be retrieved // successfully. TEST_F(CameraHidlTest, getCameraCharacteristics) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; - ALOGI("getCameraCharacteristics: Testing camera device %s", - name.c_str()); - Return ret; - ret = provider.second->getCameraDeviceInterface_V3_x( - name, - [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", - (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device3_2 = device; - }); - ASSERT_TRUE(ret.isOk()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; + ALOGI("getCameraCharacteristics: Testing camera device %s", name.c_str()); + Return ret; + ret = mProvider->getCameraDeviceInterface_V3_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device3_2 = device; + }); + ASSERT_TRUE(ret.isOk()); - ret = device3_2->getCameraCharacteristics( - [&](auto status, const auto& chars) { - ALOGI("getCameraCharacteristics returns status:%d", - (int)status); - ASSERT_EQ(Status::OK, status); - const camera_metadata_t* metadata = - (camera_metadata_t*) chars.data(); - size_t expectedSize = chars.size(); - int result = validate_camera_metadata_structure( - metadata, &expectedSize); - ASSERT_TRUE((result == 0) || - (result == CAMERA_METADATA_VALIDATION_SHIFTED)); - size_t entryCount = get_camera_metadata_entry_count( - metadata); - // TODO: we can do better than 0 here. Need to check how many required - // characteristics keys we've defined. - ASSERT_GT(entryCount, 0u); - ALOGI("getCameraCharacteristics metadata entry count is %zu", - entryCount); - }); - ASSERT_TRUE(ret.isOk()); - } + ret = device3_2->getCameraCharacteristics([&](auto status, const auto& chars) { + ALOGI("getCameraCharacteristics returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + const camera_metadata_t* metadata = (camera_metadata_t*)chars.data(); + size_t expectedSize = chars.size(); + int result = validate_camera_metadata_structure(metadata, &expectedSize); + ASSERT_TRUE((result == 0) || (result == CAMERA_METADATA_VALIDATION_SHIFTED)); + size_t entryCount = get_camera_metadata_entry_count(metadata); + // TODO: we can do better than 0 here. Need to check how many required + // characteristics keys we've defined. + ASSERT_GT(entryCount, 0u); + ALOGI("getCameraCharacteristics metadata entry count is %zu", entryCount); + }); + ASSERT_TRUE(ret.isOk()); } } } @@ -2062,273 +1868,235 @@ TEST_F(CameraHidlTest, getCameraCharacteristics) { //In case it is supported verify that torch can be enabled. //Check for corresponding toch callbacks as well. TEST_F(CameraHidlTest, setTorchMode) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); - bool torchControlSupported = false; - Return ret; + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); + bool torchControlSupported = false; + Return ret; - ret = provider.second->isSetTorchModeSupported( - [&](auto status, bool support) { - ALOGI("isSetTorchModeSupported returns status:%d supported:%d", - (int)status, support); - ASSERT_EQ(Status::OK, status); - torchControlSupported = support; - }); + ret = mProvider->isSetTorchModeSupported([&](auto status, bool support) { + ALOGI("isSetTorchModeSupported returns status:%d supported:%d", (int)status, support); + ASSERT_EQ(Status::OK, status); + torchControlSupported = support; + }); + sp cb = new TorchProviderCb(this); + Return returnStatus = mProvider->setCallback(cb); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); - sp cb = new TorchProviderCb(this); - Return returnStatus = provider.second->setCallback(cb); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; + ALOGI("setTorchMode: Testing camera device %s", name.c_str()); + ret = mProvider->getCameraDeviceInterface_V3_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device3_2 = device; + }); + ASSERT_TRUE(ret.isOk()); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; - ALOGI("setTorchMode: Testing camera device %s", name.c_str()); - ret = provider.second->getCameraDeviceInterface_V3_x( - name, - [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", - (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device3_2 = device; - }); - ASSERT_TRUE(ret.isOk()); - - mTorchStatus = TorchModeStatus::NOT_AVAILABLE; - returnStatus = device3_2->setTorchMode(TorchMode::ON); - ASSERT_TRUE(returnStatus.isOk()); - if (!torchControlSupported) { - ASSERT_EQ(Status::METHOD_NOT_SUPPORTED, returnStatus); - } else { - ASSERT_TRUE(returnStatus == Status::OK || - returnStatus == Status::OPERATION_NOT_SUPPORTED); - if (returnStatus == Status::OK) { - { - std::unique_lock l(mTorchLock); - while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kTorchTimeoutSec); - ASSERT_NE(std::cv_status::timeout, - mTorchCond.wait_until(l, timeout)); - } - ASSERT_EQ(TorchModeStatus::AVAILABLE_ON, - mTorchStatus); - mTorchStatus = TorchModeStatus::NOT_AVAILABLE; + mTorchStatus = TorchModeStatus::NOT_AVAILABLE; + returnStatus = device3_2->setTorchMode(TorchMode::ON); + ASSERT_TRUE(returnStatus.isOk()); + if (!torchControlSupported) { + ASSERT_EQ(Status::METHOD_NOT_SUPPORTED, returnStatus); + } else { + ASSERT_TRUE(returnStatus == Status::OK || + returnStatus == Status::OPERATION_NOT_SUPPORTED); + if (returnStatus == Status::OK) { + { + std::unique_lock l(mTorchLock); + while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kTorchTimeoutSec); + ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, timeout)); } + ASSERT_EQ(TorchModeStatus::AVAILABLE_ON, mTorchStatus); + mTorchStatus = TorchModeStatus::NOT_AVAILABLE; + } - returnStatus = device3_2->setTorchMode(TorchMode::OFF); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); + returnStatus = device3_2->setTorchMode(TorchMode::OFF); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); - { - std::unique_lock l(mTorchLock); - while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kTorchTimeoutSec); - ASSERT_NE(std::cv_status::timeout, - mTorchCond.wait_until(l, timeout)); - } - ASSERT_EQ(TorchModeStatus::AVAILABLE_OFF, - mTorchStatus); + { + std::unique_lock l(mTorchLock); + while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kTorchTimeoutSec); + ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, timeout)); } + ASSERT_EQ(TorchModeStatus::AVAILABLE_OFF, mTorchStatus); } } - } else if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - ALOGI("dumpState: Testing camera device %s", name.c_str()); - ret = provider.second->getCameraDeviceInterface_V1_x( - name, - [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V1_x returns status:%d", - (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device1 = device; - }); - ASSERT_TRUE(ret.isOk()); - - mTorchStatus = TorchModeStatus::NOT_AVAILABLE; - returnStatus = device1->setTorchMode(TorchMode::ON); - ASSERT_TRUE(returnStatus.isOk()); - if (!torchControlSupported) { - ASSERT_EQ(Status::METHOD_NOT_SUPPORTED, returnStatus); - } else { - ASSERT_TRUE(returnStatus == Status::OK || - returnStatus == Status::OPERATION_NOT_SUPPORTED); - if (returnStatus == Status::OK) { - { - std::unique_lock l(mTorchLock); - while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kTorchTimeoutSec); - ASSERT_NE(std::cv_status::timeout, - mTorchCond.wait_until(l, timeout)); - } - ASSERT_EQ(TorchModeStatus::AVAILABLE_ON, - mTorchStatus); - mTorchStatus = TorchModeStatus::NOT_AVAILABLE; - } - - returnStatus = device1->setTorchMode(TorchMode::OFF); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - - { - std::unique_lock l(mTorchLock); - while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kTorchTimeoutSec); - ASSERT_NE(std::cv_status::timeout, - mTorchCond.wait_until(l, timeout)); - } - ASSERT_EQ(TorchModeStatus::AVAILABLE_OFF, - mTorchStatus); - } - } - } - ret = device1->close(); - ASSERT_TRUE(ret.isOk()); } - } + } else if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + ALOGI("dumpState: Testing camera device %s", name.c_str()); + ret = mProvider->getCameraDeviceInterface_V1_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device1 = device; + }); + ASSERT_TRUE(ret.isOk()); - returnStatus = provider.second->setCallback(nullptr); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); + mTorchStatus = TorchModeStatus::NOT_AVAILABLE; + returnStatus = device1->setTorchMode(TorchMode::ON); + ASSERT_TRUE(returnStatus.isOk()); + if (!torchControlSupported) { + ASSERT_EQ(Status::METHOD_NOT_SUPPORTED, returnStatus); + } else { + ASSERT_TRUE(returnStatus == Status::OK || + returnStatus == Status::OPERATION_NOT_SUPPORTED); + if (returnStatus == Status::OK) { + { + std::unique_lock l(mTorchLock); + while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kTorchTimeoutSec); + ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, timeout)); + } + ASSERT_EQ(TorchModeStatus::AVAILABLE_ON, mTorchStatus); + mTorchStatus = TorchModeStatus::NOT_AVAILABLE; + } + + returnStatus = device1->setTorchMode(TorchMode::OFF); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + + { + std::unique_lock l(mTorchLock); + while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kTorchTimeoutSec); + ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, timeout)); + } + ASSERT_EQ(TorchModeStatus::AVAILABLE_OFF, mTorchStatus); + } + } + } + ret = device1->close(); + ASSERT_TRUE(ret.isOk()); + } } + + returnStatus = mProvider->setCallback(nullptr); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); } // Check dump functionality. TEST_F(CameraHidlTest, dumpState) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); - Return ret; + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); + Return ret; - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - ::android::sp device3_2; - ALOGI("dumpState: Testing camera device %s", name.c_str()); - ret = provider.second->getCameraDeviceInterface_V3_x( - name, - [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", - (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device3_2 = device; - }); - ASSERT_TRUE(ret.isOk()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + ::android::sp device3_2; + ALOGI("dumpState: Testing camera device %s", name.c_str()); + ret = mProvider->getCameraDeviceInterface_V3_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device3_2 = device; + }); + ASSERT_TRUE(ret.isOk()); - native_handle_t* raw_handle = native_handle_create(1, 0); - raw_handle->data[0] = open(kDumpOutput, O_RDWR); - ASSERT_GE(raw_handle->data[0], 0); - hidl_handle handle = raw_handle; - ret= device3_2->dumpState(handle); - ASSERT_TRUE(ret.isOk()); - close(raw_handle->data[0]); - native_handle_delete(raw_handle); - } else if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - ALOGI("dumpState: Testing camera device %s", name.c_str()); - ret = provider.second->getCameraDeviceInterface_V1_x( - name, - [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V1_x returns status:%d", - (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device1 = device; - }); - ASSERT_TRUE(ret.isOk()); + native_handle_t* raw_handle = native_handle_create(1, 0); + raw_handle->data[0] = open(kDumpOutput, O_RDWR); + ASSERT_GE(raw_handle->data[0], 0); + hidl_handle handle = raw_handle; + ret = device3_2->dumpState(handle); + ASSERT_TRUE(ret.isOk()); + close(raw_handle->data[0]); + native_handle_delete(raw_handle); + } else if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + ALOGI("dumpState: Testing camera device %s", name.c_str()); + ret = mProvider->getCameraDeviceInterface_V1_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device1 = device; + }); + ASSERT_TRUE(ret.isOk()); - native_handle_t* raw_handle = native_handle_create(1, 0); - raw_handle->data[0] = open(kDumpOutput, O_RDWR); - ASSERT_GE(raw_handle->data[0], 0); - hidl_handle handle = raw_handle; - Return returnStatus = device1->dumpState(handle); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - close(raw_handle->data[0]); - native_handle_delete(raw_handle); - } + native_handle_t* raw_handle = native_handle_create(1, 0); + raw_handle->data[0] = open(kDumpOutput, O_RDWR); + ASSERT_GE(raw_handle->data[0], 0); + hidl_handle handle = raw_handle; + Return returnStatus = device1->dumpState(handle); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + close(raw_handle->data[0]); + native_handle_delete(raw_handle); } } } // Open, dumpStates, then close TEST_F(CameraHidlTest, openClose) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); - Return ret; + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); + Return ret; - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; - ALOGI("openClose: Testing camera device %s", name.c_str()); - ret = provider.second->getCameraDeviceInterface_V3_x( - name, - [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", - (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device3_2 = device; - }); - ASSERT_TRUE(ret.isOk()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; + ALOGI("openClose: Testing camera device %s", name.c_str()); + ret = mProvider->getCameraDeviceInterface_V3_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device3_2 = device; + }); + ASSERT_TRUE(ret.isOk()); - sp cb = new EmptyDeviceCb; - sp session; - ret = device3_2->open( - cb, - [&](auto status, const auto& newSession) { - ALOGI("device::open returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(newSession, nullptr); - session = newSession; - }); - ASSERT_TRUE(ret.isOk()); + sp cb = new EmptyDeviceCb; + sp session; + ret = device3_2->open(cb, [&](auto status, const auto& newSession) { + ALOGI("device::open returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(newSession, nullptr); + session = newSession; + }); + ASSERT_TRUE(ret.isOk()); - native_handle_t* raw_handle = native_handle_create(1, 0); - raw_handle->data[0] = open(kDumpOutput, O_RDWR); - ASSERT_GE(raw_handle->data[0], 0); - hidl_handle handle = raw_handle; - ret = device3_2->dumpState(handle); - ASSERT_TRUE(ret.isOk()); - close(raw_handle->data[0]); - native_handle_delete(raw_handle); + native_handle_t* raw_handle = native_handle_create(1, 0); + raw_handle->data[0] = open(kDumpOutput, O_RDWR); + ASSERT_GE(raw_handle->data[0], 0); + hidl_handle handle = raw_handle; + ret = device3_2->dumpState(handle); + ASSERT_TRUE(ret.isOk()); + close(raw_handle->data[0]); + native_handle_delete(raw_handle); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); - // TODO: test all session API calls return INTERNAL_ERROR after close - // TODO: keep a wp copy here and verify session cannot be promoted out of this scope - } else if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, provider.second, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); + ret = session->close(); + ASSERT_TRUE(ret.isOk()); + // TODO: test all session API calls return INTERNAL_ERROR after close + // TODO: keep a wp copy here and verify session cannot be promoted out of this scope + } else if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); - native_handle_t* raw_handle = native_handle_create(1, 0); - raw_handle->data[0] = open(kDumpOutput, O_RDWR); - ASSERT_GE(raw_handle->data[0], 0); - hidl_handle handle = raw_handle; - Return returnStatus = device1->dumpState(handle); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - close(raw_handle->data[0]); - native_handle_delete(raw_handle); + native_handle_t* raw_handle = native_handle_create(1, 0); + raw_handle->data[0] = open(kDumpOutput, O_RDWR); + ASSERT_GE(raw_handle->data[0], 0); + hidl_handle handle = raw_handle; + Return returnStatus = device1->dumpState(handle); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + close(raw_handle->data[0]); + native_handle_delete(raw_handle); - ret = device1->close(); - ASSERT_TRUE(ret.isOk()); - } + ret = device1->close(); + ASSERT_TRUE(ret.isOk()); } } } @@ -2336,46 +2104,38 @@ TEST_F(CameraHidlTest, openClose) { // Check whether all common default request settings can be sucessfully // constructed. TEST_F(CameraHidlTest, constructDefaultRequestSettings) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; - Return ret; - ALOGI("constructDefaultRequestSettings: Testing camera device %s", - name.c_str()); - ret = provider.second->getCameraDeviceInterface_V3_x( - name, - [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", - (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device3_2 = device; - }); - ASSERT_TRUE(ret.isOk()); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; + Return ret; + ALOGI("constructDefaultRequestSettings: Testing camera device %s", name.c_str()); + ret = mProvider->getCameraDeviceInterface_V3_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device3_2 = device; + }); + ASSERT_TRUE(ret.isOk()); - sp cb = new EmptyDeviceCb; - sp session; - ret = device3_2->open( - cb, - [&](auto status, const auto& newSession) { - ALOGI("device::open returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(newSession, nullptr); - session = newSession; - }); - ASSERT_TRUE(ret.isOk()); + sp cb = new EmptyDeviceCb; + sp session; + ret = device3_2->open(cb, [&](auto status, const auto& newSession) { + ALOGI("device::open returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(newSession, nullptr); + session = newSession; + }); + ASSERT_TRUE(ret.isOk()); - for (uint32_t t = (uint32_t) RequestTemplate::PREVIEW; - t <= (uint32_t) RequestTemplate::MANUAL; t++) { - RequestTemplate reqTemplate = (RequestTemplate) t; - ret = session->constructDefaultRequestSettings( - reqTemplate, - [&](auto status, const auto& req) { + for (uint32_t t = (uint32_t)RequestTemplate::PREVIEW; + t <= (uint32_t)RequestTemplate::MANUAL; t++) { + RequestTemplate reqTemplate = (RequestTemplate)t; + ret = + session->constructDefaultRequestSettings( + reqTemplate, [&](auto status, const auto& req) { ALOGI("constructDefaultRequestSettings returns status:%d", (int)status); if (reqTemplate == RequestTemplate::ZERO_SHUTTER_LAG || @@ -2406,11 +2166,10 @@ TEST_F(CameraHidlTest, constructDefaultRequestSettings) { ASSERT_EQ(0u, req.size()); } }); - ASSERT_TRUE(ret.isOk()); - } - ret = session->close(); ASSERT_TRUE(ret.isOk()); } + ret = session->close(); + ASSERT_TRUE(ret.isOk()); } } } @@ -2418,138 +2177,131 @@ TEST_F(CameraHidlTest, constructDefaultRequestSettings) { // Verify that all supported stream formats and sizes can be configured // successfully. TEST_F(CameraHidlTest, configureStreamsAvailableOutputs) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); - std::vector outputStreams; + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); + std::vector outputStreams; - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - camera_metadata_t *staticMeta; - Return ret; - sp session; - openEmptyDeviceSession(name, provider.second, &session /*out*/, - &staticMeta /*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + camera_metadata_t* staticMeta; + Return ret; + sp session; + openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); - outputStreams.clear(); - ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, - outputStreams)); - ASSERT_NE(0u, outputStreams.size()); + outputStreams.clear(); + ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputStreams)); + ASSERT_NE(0u, outputStreams.size()); - int32_t streamId = 0; - for (auto &it : outputStreams) { - Stream stream = {streamId, StreamType::OUTPUT, - static_cast (it.width), - static_cast (it.height), - static_cast (it.format), 0, 0, - StreamRotation::ROTATION_0}; - ::android::hardware::hidl_vec streams = {stream}; - StreamConfiguration config = {streams, - StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, [streamId] (Status s, - HalStreamConfiguration halConfig) { + int32_t streamId = 0; + for (auto& it : outputStreams) { + Stream stream = {streamId, + StreamType::OUTPUT, + static_cast(it.width), + static_cast(it.height), + static_cast(it.format), + 0, + 0, + StreamRotation::ROTATION_0}; + ::android::hardware::hidl_vec streams = {stream}; + StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams( + config, [streamId](Status s, HalStreamConfiguration halConfig) { ASSERT_EQ(Status::OK, s); ASSERT_EQ(1u, halConfig.streams.size()); ASSERT_EQ(halConfig.streams[0].id, streamId); }); - ASSERT_TRUE(ret.isOk()); - streamId++; - } - - free_camera_metadata(staticMeta); - ret = session->close(); ASSERT_TRUE(ret.isOk()); + streamId++; } + + free_camera_metadata(staticMeta); + ret = session->close(); + ASSERT_TRUE(ret.isOk()); } } } // Check for correct handling of invalid/incorrect configuration parameters. TEST_F(CameraHidlTest, configureStreamsInvalidOutputs) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); - std::vector outputStreams; + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); + std::vector outputStreams; - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - camera_metadata_t *staticMeta; - Return ret; - sp session; - openEmptyDeviceSession(name, provider.second, &session /*out*/, - &staticMeta /*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + camera_metadata_t* staticMeta; + Return ret; + sp session; + openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); - outputStreams.clear(); - ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, - outputStreams)); - ASSERT_NE(0u, outputStreams.size()); + outputStreams.clear(); + ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputStreams)); + ASSERT_NE(0u, outputStreams.size()); - int32_t streamId = 0; - Stream stream = {streamId++, StreamType::OUTPUT, - static_cast (0), - static_cast (0), - static_cast (outputStreams[0].format), - 0, 0, StreamRotation::ROTATION_0}; - ::android::hardware::hidl_vec streams = {stream}; - StreamConfiguration config = {streams, - StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, [] (Status s, - HalStreamConfiguration) { - ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || - (Status::INTERNAL_ERROR == s)); - }); - ASSERT_TRUE(ret.isOk()); + int32_t streamId = 0; + Stream stream = {streamId++, + StreamType::OUTPUT, + static_cast(0), + static_cast(0), + static_cast(outputStreams[0].format), + 0, + 0, + StreamRotation::ROTATION_0}; + ::android::hardware::hidl_vec streams = {stream}; + StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { + ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || (Status::INTERNAL_ERROR == s)); + }); + ASSERT_TRUE(ret.isOk()); - stream = {streamId++, StreamType::OUTPUT, - static_cast (UINT32_MAX), - static_cast (UINT32_MAX), - static_cast (outputStreams[0].format), - 0, 0, StreamRotation::ROTATION_0}; + stream = {streamId++, + StreamType::OUTPUT, + static_cast(UINT32_MAX), + static_cast(UINT32_MAX), + static_cast(outputStreams[0].format), + 0, + 0, + StreamRotation::ROTATION_0}; + streams[0] = stream; + config = {streams, StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + ASSERT_TRUE(ret.isOk()); + + for (auto& it : outputStreams) { + stream = {streamId++, + StreamType::OUTPUT, + static_cast(it.width), + static_cast(it.height), + static_cast(UINT32_MAX), + 0, + 0, + StreamRotation::ROTATION_0}; streams[0] = stream; - config = {streams, - StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, [] (Status s, - HalStreamConfiguration) { + config = {streams, StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); }); ASSERT_TRUE(ret.isOk()); - for (auto &it : outputStreams) { - stream = {streamId++, StreamType::OUTPUT, - static_cast (it.width), - static_cast (it.height), - static_cast (UINT32_MAX), - 0, 0, StreamRotation::ROTATION_0}; - streams[0] = stream; - config = {streams, - StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, [] (Status s, - HalStreamConfiguration) { - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); - }); - ASSERT_TRUE(ret.isOk()); - - stream = {streamId++, StreamType::OUTPUT, - static_cast (it.width), - static_cast (it.height), - static_cast (it.format), - 0, 0, static_cast (UINT32_MAX)}; - streams[0] = stream; - config = {streams, - StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, [] (Status s, - HalStreamConfiguration) { - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); - }); - ASSERT_TRUE(ret.isOk()); - } - - free_camera_metadata(staticMeta); - ret = session->close(); + stream = {streamId++, + StreamType::OUTPUT, + static_cast(it.width), + static_cast(it.height), + static_cast(it.format), + 0, + 0, + static_cast(UINT32_MAX)}; + streams[0] = stream; + config = {streams, StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); ASSERT_TRUE(ret.isOk()); } + + free_camera_metadata(staticMeta); + ret = session->close(); + ASSERT_TRUE(ret.isOk()); } } } @@ -2557,86 +2309,84 @@ TEST_F(CameraHidlTest, configureStreamsInvalidOutputs) { // Check whether all supported ZSL output stream combinations can be // configured successfully. TEST_F(CameraHidlTest, configureStreamsZSLInputOutputs) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); - std::vector inputStreams; - std::vector inputOutputMap; + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); + std::vector inputStreams; + std::vector inputOutputMap; - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - camera_metadata_t *staticMeta; - Return ret; - sp session; - openEmptyDeviceSession(name, provider.second, &session /*out*/, - &staticMeta /*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + camera_metadata_t* staticMeta; + Return ret; + sp session; + openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); - Status rc = isZSLModeAvailable(staticMeta); - if (Status::METHOD_NOT_SUPPORTED == rc) { - ret = session->close(); - ASSERT_TRUE(ret.isOk()); - continue; - } - ASSERT_EQ(Status::OK, rc); + Status rc = isZSLModeAvailable(staticMeta); + if (Status::METHOD_NOT_SUPPORTED == rc) { + ret = session->close(); + ASSERT_TRUE(ret.isOk()); + continue; + } + ASSERT_EQ(Status::OK, rc); - inputStreams.clear(); - ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, - inputStreams)); + inputStreams.clear(); + ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, inputStreams)); + ASSERT_NE(0u, inputStreams.size()); + + inputOutputMap.clear(); + ASSERT_EQ(Status::OK, getZSLInputOutputMap(staticMeta, inputOutputMap)); + ASSERT_NE(0u, inputOutputMap.size()); + + int32_t streamId = 0; + for (auto& inputIter : inputOutputMap) { + AvailableStream input; + ASSERT_EQ(Status::OK, findLargestSize(inputStreams, inputIter.inputFormat, input)); ASSERT_NE(0u, inputStreams.size()); - inputOutputMap.clear(); - ASSERT_EQ(Status::OK, getZSLInputOutputMap(staticMeta, - inputOutputMap)); - ASSERT_NE(0u, inputOutputMap.size()); + AvailableStream outputThreshold = {INT32_MAX, INT32_MAX, inputIter.outputFormat}; + std::vector outputStreams; + ASSERT_EQ(Status::OK, + getAvailableOutputStreams(staticMeta, outputStreams, &outputThreshold)); + for (auto& outputIter : outputStreams) { + Stream zslStream = {streamId++, + StreamType::OUTPUT, + static_cast(input.width), + static_cast(input.height), + static_cast(input.format), + GRALLOC_USAGE_HW_CAMERA_ZSL, + 0, + StreamRotation::ROTATION_0}; + Stream inputStream = {streamId++, + StreamType::INPUT, + static_cast(input.width), + static_cast(input.height), + static_cast(input.format), + 0, + 0, + StreamRotation::ROTATION_0}; + Stream outputStream = {streamId++, + StreamType::OUTPUT, + static_cast(outputIter.width), + static_cast(outputIter.height), + static_cast(outputIter.format), + 0, + 0, + StreamRotation::ROTATION_0}; - int32_t streamId = 0; - for (auto &inputIter : inputOutputMap) { - AvailableStream input; - ASSERT_EQ(Status::OK, - findLargestSize(inputStreams, inputIter.inputFormat, input)); - ASSERT_NE(0u, inputStreams.size()); - - AvailableStream outputThreshold = {INT32_MAX, INT32_MAX, - inputIter.outputFormat}; - std::vector outputStreams; - ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, - outputStreams, &outputThreshold)); - for (auto &outputIter : outputStreams) { - Stream zslStream = {streamId++, StreamType::OUTPUT, - static_cast (input.width), - static_cast (input.height), - static_cast (input.format), - GRALLOC_USAGE_HW_CAMERA_ZSL, 0, - StreamRotation::ROTATION_0}; - Stream inputStream = {streamId++, StreamType::INPUT, - static_cast (input.width), - static_cast (input.height), - static_cast (input.format), 0, 0, - StreamRotation::ROTATION_0}; - Stream outputStream = {streamId++, StreamType::OUTPUT, - static_cast (outputIter.width), - static_cast (outputIter.height), - static_cast (outputIter.format), 0, 0, - StreamRotation::ROTATION_0}; - - ::android::hardware::hidl_vec streams = { - inputStream, zslStream, outputStream}; - StreamConfiguration config = {streams, - StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, + ::android::hardware::hidl_vec streams = {inputStream, zslStream, + outputStream}; + StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration halConfig) { ASSERT_EQ(Status::OK, s); ASSERT_EQ(3u, halConfig.streams.size()); }); - ASSERT_TRUE(ret.isOk()); - } + ASSERT_TRUE(ret.isOk()); } - - free_camera_metadata(staticMeta); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); } + + free_camera_metadata(staticMeta); + ret = session->close(); + ASSERT_TRUE(ret.isOk()); } } } @@ -2644,65 +2394,63 @@ TEST_F(CameraHidlTest, configureStreamsZSLInputOutputs) { // Verify that all supported preview + still capture stream combinations // can be configured successfully. TEST_F(CameraHidlTest, configureStreamsPreviewStillOutputs) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); - std::vector outputBlobStreams; - std::vector outputPreviewStreams; - AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, - static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; - AvailableStream blobThreshold = {INT32_MAX, INT32_MAX, - static_cast(PixelFormat::BLOB)}; + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); + std::vector outputBlobStreams; + std::vector outputPreviewStreams; + AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, + static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; + AvailableStream blobThreshold = {INT32_MAX, INT32_MAX, static_cast(PixelFormat::BLOB)}; - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - camera_metadata_t *staticMeta; - Return ret; - sp session; - openEmptyDeviceSession(name, provider.second, &session /*out*/, - &staticMeta /*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + camera_metadata_t* staticMeta; + Return ret; + sp session; + openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); - outputBlobStreams.clear(); - ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, - outputBlobStreams, &blobThreshold)); - ASSERT_NE(0u, outputBlobStreams.size()); + outputBlobStreams.clear(); + ASSERT_EQ(Status::OK, + getAvailableOutputStreams(staticMeta, outputBlobStreams, &blobThreshold)); + ASSERT_NE(0u, outputBlobStreams.size()); - outputPreviewStreams.clear(); - ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, - outputPreviewStreams, &previewThreshold)); - ASSERT_NE(0u, outputPreviewStreams.size()); + outputPreviewStreams.clear(); + ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputPreviewStreams, + &previewThreshold)); + ASSERT_NE(0u, outputPreviewStreams.size()); - int32_t streamId = 0; - for (auto &blobIter : outputBlobStreams) { - for (auto &previewIter : outputPreviewStreams) { - Stream previewStream = {streamId++, StreamType::OUTPUT, - static_cast (previewIter.width), - static_cast (previewIter.height), - static_cast (previewIter.format), 0, 0, - StreamRotation::ROTATION_0}; - Stream blobStream = {streamId++, StreamType::OUTPUT, - static_cast (blobIter.width), - static_cast (blobIter.height), - static_cast (blobIter.format), 0, 0, - StreamRotation::ROTATION_0}; - ::android::hardware::hidl_vec streams = { - previewStream, blobStream}; - StreamConfiguration config = {streams, - StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, + int32_t streamId = 0; + for (auto& blobIter : outputBlobStreams) { + for (auto& previewIter : outputPreviewStreams) { + Stream previewStream = {streamId++, + StreamType::OUTPUT, + static_cast(previewIter.width), + static_cast(previewIter.height), + static_cast(previewIter.format), + 0, + 0, + StreamRotation::ROTATION_0}; + Stream blobStream = {streamId++, + StreamType::OUTPUT, + static_cast(blobIter.width), + static_cast(blobIter.height), + static_cast(blobIter.format), + 0, + 0, + StreamRotation::ROTATION_0}; + ::android::hardware::hidl_vec streams = {previewStream, blobStream}; + StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration halConfig) { ASSERT_EQ(Status::OK, s); ASSERT_EQ(2u, halConfig.streams.size()); }); - ASSERT_TRUE(ret.isOk()); - } + ASSERT_TRUE(ret.isOk()); } - - free_camera_metadata(staticMeta); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); } + + free_camera_metadata(staticMeta); + ret = session->close(); + ASSERT_TRUE(ret.isOk()); } } } @@ -2711,95 +2459,95 @@ TEST_F(CameraHidlTest, configureStreamsPreviewStillOutputs) { // configured. Additionally check for common invalid inputs when // using this mode. TEST_F(CameraHidlTest, configureStreamsConstrainedOutputs) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - camera_metadata_t *staticMeta; - Return ret; - sp session; - openEmptyDeviceSession(name, provider.second, &session /*out*/, - &staticMeta /*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + camera_metadata_t* staticMeta; + Return ret; + sp session; + openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); - Status rc = isConstrainedModeAvailable(staticMeta); - if (Status::METHOD_NOT_SUPPORTED == rc) { - ret = session->close(); - ASSERT_TRUE(ret.isOk()); - continue; - } - ASSERT_EQ(Status::OK, rc); - - AvailableStream hfrStream; - rc = pickConstrainedModeSize(staticMeta, hfrStream); - ASSERT_EQ(Status::OK, rc); - - int32_t streamId = 0; - Stream stream = {streamId, StreamType::OUTPUT, - static_cast (hfrStream.width), - static_cast (hfrStream.height), - static_cast (hfrStream.format), 0, 0, - StreamRotation::ROTATION_0}; - ::android::hardware::hidl_vec streams = {stream}; - StreamConfiguration config = {streams, - StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; - ret = session->configureStreams(config, [streamId] (Status s, - HalStreamConfiguration halConfig) { - ASSERT_EQ(Status::OK, s); - ASSERT_EQ(1u, halConfig.streams.size()); - ASSERT_EQ(halConfig.streams[0].id, streamId); - }); - ASSERT_TRUE(ret.isOk()); - - stream = {streamId++, StreamType::OUTPUT, - static_cast (0), - static_cast (0), - static_cast (hfrStream.format), 0, 0, - StreamRotation::ROTATION_0}; - streams[0] = stream; - config = {streams, - StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; - ret = session->configureStreams(config, [] (Status s, - HalStreamConfiguration) { - ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || - (Status::INTERNAL_ERROR == s)); - }); - ASSERT_TRUE(ret.isOk()); - - stream = {streamId++, StreamType::OUTPUT, - static_cast (UINT32_MAX), - static_cast (UINT32_MAX), - static_cast (hfrStream.format), 0, 0, - StreamRotation::ROTATION_0}; - streams[0] = stream; - config = {streams, - StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; - ret = session->configureStreams(config, [] (Status s, - HalStreamConfiguration) { - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); - }); - ASSERT_TRUE(ret.isOk()); - - stream = {streamId++, StreamType::OUTPUT, - static_cast (hfrStream.width), - static_cast (hfrStream.height), - static_cast (UINT32_MAX), 0, 0, - StreamRotation::ROTATION_0}; - streams[0] = stream; - config = {streams, - StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; - ret = session->configureStreams(config, [] (Status s, - HalStreamConfiguration) { - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); - }); - ASSERT_TRUE(ret.isOk()); - - free_camera_metadata(staticMeta); + Status rc = isConstrainedModeAvailable(staticMeta); + if (Status::METHOD_NOT_SUPPORTED == rc) { ret = session->close(); ASSERT_TRUE(ret.isOk()); + continue; } + ASSERT_EQ(Status::OK, rc); + + AvailableStream hfrStream; + rc = pickConstrainedModeSize(staticMeta, hfrStream); + ASSERT_EQ(Status::OK, rc); + + int32_t streamId = 0; + Stream stream = {streamId, + StreamType::OUTPUT, + static_cast(hfrStream.width), + static_cast(hfrStream.height), + static_cast(hfrStream.format), + 0, + 0, + StreamRotation::ROTATION_0}; + ::android::hardware::hidl_vec streams = {stream}; + StreamConfiguration config = {streams, + StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; + ret = session->configureStreams(config, + [streamId](Status s, HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(1u, halConfig.streams.size()); + ASSERT_EQ(halConfig.streams[0].id, streamId); + }); + ASSERT_TRUE(ret.isOk()); + + stream = {streamId++, + StreamType::OUTPUT, + static_cast(0), + static_cast(0), + static_cast(hfrStream.format), + 0, + 0, + StreamRotation::ROTATION_0}; + streams[0] = stream; + config = {streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { + ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || (Status::INTERNAL_ERROR == s)); + }); + ASSERT_TRUE(ret.isOk()); + + stream = {streamId++, + StreamType::OUTPUT, + static_cast(UINT32_MAX), + static_cast(UINT32_MAX), + static_cast(hfrStream.format), + 0, + 0, + StreamRotation::ROTATION_0}; + streams[0] = stream; + config = {streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + ASSERT_TRUE(ret.isOk()); + + stream = {streamId++, + StreamType::OUTPUT, + static_cast(hfrStream.width), + static_cast(hfrStream.height), + static_cast(UINT32_MAX), + 0, + 0, + StreamRotation::ROTATION_0}; + streams[0] = stream; + config = {streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + ASSERT_TRUE(ret.isOk()); + + free_camera_metadata(staticMeta); + ret = session->close(); + ASSERT_TRUE(ret.isOk()); } } } @@ -2807,96 +2555,91 @@ TEST_F(CameraHidlTest, configureStreamsConstrainedOutputs) { // Verify that all supported video + snapshot stream combinations can // be configured successfully. TEST_F(CameraHidlTest, configureStreamsVideoStillOutputs) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); - std::vector outputBlobStreams; - std::vector outputVideoStreams; - AvailableStream videoThreshold = {kMaxVideoWidth, kMaxVideoHeight, - static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; - AvailableStream blobThreshold = {kMaxVideoWidth, kMaxVideoHeight, - static_cast(PixelFormat::BLOB)}; + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); + std::vector outputBlobStreams; + std::vector outputVideoStreams; + AvailableStream videoThreshold = {kMaxVideoWidth, kMaxVideoHeight, + static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; + AvailableStream blobThreshold = {kMaxVideoWidth, kMaxVideoHeight, + static_cast(PixelFormat::BLOB)}; - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - camera_metadata_t *staticMeta; - Return ret; - sp session; - openEmptyDeviceSession(name, provider.second, &session /*out*/, - &staticMeta /*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + camera_metadata_t* staticMeta; + Return ret; + sp session; + openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); - outputBlobStreams.clear(); - ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, - outputBlobStreams, &blobThreshold)); - ASSERT_NE(0u, outputBlobStreams.size()); + outputBlobStreams.clear(); + ASSERT_EQ(Status::OK, + getAvailableOutputStreams(staticMeta, outputBlobStreams, &blobThreshold)); + ASSERT_NE(0u, outputBlobStreams.size()); - outputVideoStreams.clear(); - ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, - outputVideoStreams, &videoThreshold)); - ASSERT_NE(0u, outputVideoStreams.size()); + outputVideoStreams.clear(); + ASSERT_EQ(Status::OK, + getAvailableOutputStreams(staticMeta, outputVideoStreams, &videoThreshold)); + ASSERT_NE(0u, outputVideoStreams.size()); - int32_t streamId = 0; - for (auto &blobIter : outputBlobStreams) { - for (auto &videoIter : outputVideoStreams) { - Stream videoStream = {streamId++, StreamType::OUTPUT, - static_cast (videoIter.width), - static_cast (videoIter.height), - static_cast (videoIter.format), - 0, 0, StreamRotation::ROTATION_0}; - Stream blobStream = {streamId++, StreamType::OUTPUT, - static_cast (blobIter.width), - static_cast (blobIter.height), - static_cast (blobIter.format), - GRALLOC_USAGE_HW_VIDEO_ENCODER, 0, - StreamRotation::ROTATION_0}; - ::android::hardware::hidl_vec streams = { - videoStream, blobStream}; - StreamConfiguration config = {streams, - StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, + int32_t streamId = 0; + for (auto& blobIter : outputBlobStreams) { + for (auto& videoIter : outputVideoStreams) { + Stream videoStream = {streamId++, + StreamType::OUTPUT, + static_cast(videoIter.width), + static_cast(videoIter.height), + static_cast(videoIter.format), + 0, + 0, + StreamRotation::ROTATION_0}; + Stream blobStream = {streamId++, + StreamType::OUTPUT, + static_cast(blobIter.width), + static_cast(blobIter.height), + static_cast(blobIter.format), + GRALLOC_USAGE_HW_VIDEO_ENCODER, + 0, + StreamRotation::ROTATION_0}; + ::android::hardware::hidl_vec streams = {videoStream, blobStream}; + StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration halConfig) { ASSERT_EQ(Status::OK, s); ASSERT_EQ(2u, halConfig.streams.size()); }); - ASSERT_TRUE(ret.isOk()); - } + ASSERT_TRUE(ret.isOk()); } - - free_camera_metadata(staticMeta); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); } + + free_camera_metadata(staticMeta); + ret = session->close(); + ASSERT_TRUE(ret.isOk()); } } } // Generate and verify a camera capture request TEST_F(CameraHidlTest, processCaptureRequestPreview) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); - AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, - static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; - uint64_t bufferId = 1; - uint32_t frameNumber = 1; - ::android::hardware::hidl_vec settings; + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); + AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, + static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; + uint64_t bufferId = 1; + uint32_t frameNumber = 1; + ::android::hardware::hidl_vec settings; - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - Stream previewStream; - HalStreamConfiguration halStreamConfig; - sp session; - bool supportsPartialResults = false; - uint32_t partialResultCount = 0; - configurePreviewStream(name, provider.second, &previewThreshold, - &session /*out*/, &previewStream /*out*/, - &halStreamConfig /*out*/, &supportsPartialResults /*out*/, - &partialResultCount/*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + Stream previewStream; + HalStreamConfiguration halStreamConfig; + sp session; + bool supportsPartialResults = false; + uint32_t partialResultCount = 0; + configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, + &previewStream /*out*/, &halStreamConfig /*out*/, + &supportsPartialResults /*out*/, &partialResultCount /*out*/); - std::shared_ptr resultQueue; - auto resultQueueRet = session->getCaptureResultMetadataQueue( + std::shared_ptr resultQueue; + auto resultQueueRet = + session->getCaptureResultMetadataQueue( [&resultQueue](const auto& descriptor) { resultQueue = std::make_shared( descriptor); @@ -2908,114 +2651,103 @@ TEST_F(CameraHidlTest, processCaptureRequestPreview) { // Don't use the queue onwards. } }); - ASSERT_TRUE(resultQueueRet.isOk()); - ASSERT_NE(nullptr, resultQueue); + ASSERT_TRUE(resultQueueRet.isOk()); + ASSERT_NE(nullptr, resultQueue); - InFlightRequest inflightReq = {1, false, supportsPartialResults, - partialResultCount, resultQueue}; + InFlightRequest inflightReq = {1, false, supportsPartialResults, partialResultCount, + resultQueue}; - RequestTemplate reqTemplate = RequestTemplate::PREVIEW; - Return ret; - ret = session->constructDefaultRequestSettings(reqTemplate, - [&](auto status, const auto& req) { - ASSERT_EQ(Status::OK, status); - settings = req; }); - ASSERT_TRUE(ret.isOk()); + RequestTemplate reqTemplate = RequestTemplate::PREVIEW; + Return ret; + ret = session->constructDefaultRequestSettings(reqTemplate, + [&](auto status, const auto& req) { + ASSERT_EQ(Status::OK, status); + settings = req; + }); + ASSERT_TRUE(ret.isOk()); - sp gb = new GraphicBuffer( - previewStream.width, previewStream.height, - static_cast(halStreamConfig.streams[0].overrideFormat), - 1, android_convertGralloc1To0Usage( - halStreamConfig.streams[0].producerUsage, - halStreamConfig.streams[0].consumerUsage)); - ASSERT_NE(nullptr, gb.get()); - StreamBuffer outputBuffer = {halStreamConfig.streams[0].id, - bufferId, hidl_handle(gb->getNativeBuffer()->handle), - BufferStatus::OK, nullptr, nullptr}; - ::android::hardware::hidl_vec outputBuffers = { - outputBuffer}; - StreamBuffer emptyInputBuffer = {-1, 0, nullptr, - BufferStatus::ERROR, nullptr, nullptr}; - CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, - settings, emptyInputBuffer, outputBuffers}; + sp gb = new GraphicBuffer( + previewStream.width, previewStream.height, + static_cast(halStreamConfig.streams[0].overrideFormat), 1, + android_convertGralloc1To0Usage(halStreamConfig.streams[0].producerUsage, + halStreamConfig.streams[0].consumerUsage)); + ASSERT_NE(nullptr, gb.get()); + StreamBuffer outputBuffer = {halStreamConfig.streams[0].id, + bufferId, + hidl_handle(gb->getNativeBuffer()->handle), + BufferStatus::OK, + nullptr, + nullptr}; + ::android::hardware::hidl_vec outputBuffers = {outputBuffer}; + StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, nullptr, nullptr}; + CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, + emptyInputBuffer, outputBuffers}; - { - std::unique_lock l(mLock); - mInflightMap.clear(); - mInflightMap.add(frameNumber, &inflightReq); - } - - Status status = Status::INTERNAL_ERROR; - uint32_t numRequestProcessed = 0; - hidl_vec cachesToRemove; - Return returnStatus = session->processCaptureRequest( - {request}, - cachesToRemove, - [&status, &numRequestProcessed] (auto s, uint32_t n) { - status = s; - numRequestProcessed = n; - }); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, status); - ASSERT_EQ(numRequestProcessed, 1u); - - { - std::unique_lock l(mLock); - while (!inflightReq.errorCodeValid && - ((0 < inflightReq.numBuffersLeft) || - (!inflightReq.haveResultMetadata))) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kStreamBufferTimeoutSec); - ASSERT_NE(std::cv_status::timeout, - mResultCondition.wait_until(l, timeout)); - } - - ASSERT_FALSE(inflightReq.errorCodeValid); - ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); - ASSERT_EQ(previewStream.id, - inflightReq.resultOutputBuffers[0].streamId); - - request.frameNumber++; - //Empty settings should be supported after the first call - //for repeating requests. - request.settings.setToExternal(nullptr, 0, true); - mInflightMap.clear(); - inflightReq = {1, false, supportsPartialResults, - partialResultCount, resultQueue}; - mInflightMap.add(request.frameNumber, &inflightReq); - } - - returnStatus = session->processCaptureRequest( - {request}, - cachesToRemove, - [&status, &numRequestProcessed] (auto s, uint32_t n) { - status = s; - numRequestProcessed = n; - }); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, status); - ASSERT_EQ(numRequestProcessed, 1u); - - { - std::unique_lock l(mLock); - while (!inflightReq.errorCodeValid && - ((0 < inflightReq.numBuffersLeft) || - (!inflightReq.haveResultMetadata))) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kStreamBufferTimeoutSec); - ASSERT_NE(std::cv_status::timeout, - mResultCondition.wait_until(l, timeout)); - } - - ASSERT_FALSE(inflightReq.errorCodeValid); - ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); - ASSERT_EQ(previewStream.id, - inflightReq.resultOutputBuffers[0].streamId); - } - - ret = session->close(); - ASSERT_TRUE(ret.isOk()); + { + std::unique_lock l(mLock); + mInflightMap.clear(); + mInflightMap.add(frameNumber, &inflightReq); } + + Status status = Status::INTERNAL_ERROR; + uint32_t numRequestProcessed = 0; + hidl_vec cachesToRemove; + Return returnStatus = session->processCaptureRequest( + {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, uint32_t n) { + status = s; + numRequestProcessed = n; + }); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, status); + ASSERT_EQ(numRequestProcessed, 1u); + + { + std::unique_lock l(mLock); + while (!inflightReq.errorCodeValid && + ((0 < inflightReq.numBuffersLeft) || (!inflightReq.haveResultMetadata))) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kStreamBufferTimeoutSec); + ASSERT_NE(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); + } + + ASSERT_FALSE(inflightReq.errorCodeValid); + ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); + ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); + + request.frameNumber++; + // Empty settings should be supported after the first call + // for repeating requests. + request.settings.setToExternal(nullptr, 0, true); + mInflightMap.clear(); + inflightReq = {1, false, supportsPartialResults, partialResultCount, resultQueue}; + mInflightMap.add(request.frameNumber, &inflightReq); + } + + returnStatus = session->processCaptureRequest( + {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, uint32_t n) { + status = s; + numRequestProcessed = n; + }); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, status); + ASSERT_EQ(numRequestProcessed, 1u); + + { + std::unique_lock l(mLock); + while (!inflightReq.errorCodeValid && + ((0 < inflightReq.numBuffersLeft) || (!inflightReq.haveResultMetadata))) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kStreamBufferTimeoutSec); + ASSERT_NE(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); + } + + ASSERT_FALSE(inflightReq.errorCodeValid); + ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); + ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); + } + + ret = session->close(); + ASSERT_TRUE(ret.isOk()); } } } @@ -3023,64 +2755,57 @@ TEST_F(CameraHidlTest, processCaptureRequestPreview) { // Test whether an incorrect capture request with missing settings will // be reported correctly. TEST_F(CameraHidlTest, processCaptureRequestInvalidSinglePreview) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); - std::vector outputPreviewStreams; - AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, - static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; - uint64_t bufferId = 1; - uint32_t frameNumber = 1; - ::android::hardware::hidl_vec settings; + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); + std::vector outputPreviewStreams; + AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, + static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; + uint64_t bufferId = 1; + uint32_t frameNumber = 1; + ::android::hardware::hidl_vec settings; - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - Stream previewStream; - HalStreamConfiguration halStreamConfig; - sp session; - bool supportsPartialResults = false; - uint32_t partialResultCount = 0; - configurePreviewStream(name, provider.second, &previewThreshold, - &session /*out*/, &previewStream /*out*/, - &halStreamConfig /*out*/, &supportsPartialResults /*out*/, - &partialResultCount /*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + Stream previewStream; + HalStreamConfiguration halStreamConfig; + sp session; + bool supportsPartialResults = false; + uint32_t partialResultCount = 0; + configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, + &previewStream /*out*/, &halStreamConfig /*out*/, + &supportsPartialResults /*out*/, &partialResultCount /*out*/); - sp gb = new GraphicBuffer( - previewStream.width, previewStream.height, - static_cast(halStreamConfig.streams[0].overrideFormat), - 1, android_convertGralloc1To0Usage( - halStreamConfig.streams[0].producerUsage, - halStreamConfig.streams[0].consumerUsage)); + sp gb = new GraphicBuffer( + previewStream.width, previewStream.height, + static_cast(halStreamConfig.streams[0].overrideFormat), 1, + android_convertGralloc1To0Usage(halStreamConfig.streams[0].producerUsage, + halStreamConfig.streams[0].consumerUsage)); - StreamBuffer outputBuffer = {halStreamConfig.streams[0].id, - bufferId, hidl_handle(gb->getNativeBuffer()->handle), - BufferStatus::OK, nullptr, nullptr}; - ::android::hardware::hidl_vec outputBuffers = { - outputBuffer}; - StreamBuffer emptyInputBuffer = {-1, 0, nullptr, - BufferStatus::ERROR, nullptr, nullptr}; - CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, - emptyInputBuffer, outputBuffers}; + StreamBuffer outputBuffer = {halStreamConfig.streams[0].id, + bufferId, + hidl_handle(gb->getNativeBuffer()->handle), + BufferStatus::OK, + nullptr, + nullptr}; + ::android::hardware::hidl_vec outputBuffers = {outputBuffer}; + StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, nullptr, nullptr}; + CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, + emptyInputBuffer, outputBuffers}; - //Settings were not correctly initialized, we should fail here - Status status = Status::OK; - uint32_t numRequestProcessed = 0; - hidl_vec cachesToRemove; - Return ret = session->processCaptureRequest( - {request}, - cachesToRemove, - [&status, &numRequestProcessed] (auto s, uint32_t n) { - status = s; - numRequestProcessed = n; - }); - ASSERT_TRUE(ret.isOk()); - ASSERT_EQ(Status::INTERNAL_ERROR, status); - ASSERT_EQ(numRequestProcessed, 0u); + // Settings were not correctly initialized, we should fail here + Status status = Status::OK; + uint32_t numRequestProcessed = 0; + hidl_vec cachesToRemove; + Return ret = session->processCaptureRequest( + {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, uint32_t n) { + status = s; + numRequestProcessed = n; + }); + ASSERT_TRUE(ret.isOk()); + ASSERT_EQ(Status::INTERNAL_ERROR, status); + ASSERT_EQ(numRequestProcessed, 0u); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); - } + ret = session->close(); + ASSERT_TRUE(ret.isOk()); } } } @@ -3088,91 +2813,81 @@ TEST_F(CameraHidlTest, processCaptureRequestInvalidSinglePreview) { // Check whether an invalid capture request with missing output buffers // will be reported correctly. TEST_F(CameraHidlTest, processCaptureRequestInvalidBuffer) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); - std::vector outputBlobStreams; - AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, - static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; - uint32_t frameNumber = 1; - ::android::hardware::hidl_vec settings; + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); + std::vector outputBlobStreams; + AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, + static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; + uint32_t frameNumber = 1; + ::android::hardware::hidl_vec settings; - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - Stream previewStream; - HalStreamConfiguration halStreamConfig; - sp session; - bool supportsPartialResults = false; - uint32_t partialResultCount = 0; - configurePreviewStream(name, provider.second, &previewThreshold, - &session /*out*/, &previewStream /*out*/, - &halStreamConfig /*out*/, &supportsPartialResults/*out*/, - &partialResultCount /*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + Stream previewStream; + HalStreamConfiguration halStreamConfig; + sp session; + bool supportsPartialResults = false; + uint32_t partialResultCount = 0; + configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, + &previewStream /*out*/, &halStreamConfig /*out*/, + &supportsPartialResults /*out*/, &partialResultCount /*out*/); - RequestTemplate reqTemplate = RequestTemplate::PREVIEW; - Return ret; - ret = session->constructDefaultRequestSettings(reqTemplate, - [&](auto status, const auto& req) { - ASSERT_EQ(Status::OK, status); - settings = req; }); - ASSERT_TRUE(ret.isOk()); + RequestTemplate reqTemplate = RequestTemplate::PREVIEW; + Return ret; + ret = session->constructDefaultRequestSettings(reqTemplate, + [&](auto status, const auto& req) { + ASSERT_EQ(Status::OK, status); + settings = req; + }); + ASSERT_TRUE(ret.isOk()); - ::android::hardware::hidl_vec emptyOutputBuffers; - StreamBuffer emptyInputBuffer = {-1, 0, nullptr, - BufferStatus::ERROR, nullptr, nullptr}; - CaptureRequest request = {frameNumber, 0/* fmqSettingsSize */, - settings, emptyInputBuffer, emptyOutputBuffers}; + ::android::hardware::hidl_vec emptyOutputBuffers; + StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, nullptr, nullptr}; + CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, + emptyInputBuffer, emptyOutputBuffers}; - //Output buffers are missing, we should fail here - Status status = Status::OK; - uint32_t numRequestProcessed = 0; - hidl_vec cachesToRemove; - ret = session->processCaptureRequest( - {request}, - cachesToRemove, - [&status, &numRequestProcessed] (auto s, uint32_t n) { - status = s; - numRequestProcessed = n; - }); - ASSERT_TRUE(ret.isOk()); - ASSERT_EQ(Status::INTERNAL_ERROR, status); - ASSERT_EQ(numRequestProcessed, 0u); + // Output buffers are missing, we should fail here + Status status = Status::OK; + uint32_t numRequestProcessed = 0; + hidl_vec cachesToRemove; + ret = session->processCaptureRequest( + {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, uint32_t n) { + status = s; + numRequestProcessed = n; + }); + ASSERT_TRUE(ret.isOk()); + ASSERT_EQ(Status::INTERNAL_ERROR, status); + ASSERT_EQ(numRequestProcessed, 0u); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); - } + ret = session->close(); + ASSERT_TRUE(ret.isOk()); } } } // Generate, trigger and flush a preview request TEST_F(CameraHidlTest, flushPreviewRequest) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); - std::vector outputPreviewStreams; - AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, - static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; - uint64_t bufferId = 1; - uint32_t frameNumber = 1; - ::android::hardware::hidl_vec settings; + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); + std::vector outputPreviewStreams; + AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, + static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; + uint64_t bufferId = 1; + uint32_t frameNumber = 1; + ::android::hardware::hidl_vec settings; - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - Stream previewStream; - HalStreamConfiguration halStreamConfig; - sp session; - bool supportsPartialResults = false; - uint32_t partialResultCount = 0; - configurePreviewStream(name, provider.second, &previewThreshold, - &session /*out*/, &previewStream /*out*/, - &halStreamConfig /*out*/, &supportsPartialResults /*out*/, - &partialResultCount /*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + Stream previewStream; + HalStreamConfiguration halStreamConfig; + sp session; + bool supportsPartialResults = false; + uint32_t partialResultCount = 0; + configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, + &previewStream /*out*/, &halStreamConfig /*out*/, + &supportsPartialResults /*out*/, &partialResultCount /*out*/); - std::shared_ptr resultQueue; - auto resultQueueRet = session->getCaptureResultMetadataQueue( + std::shared_ptr resultQueue; + auto resultQueueRet = + session->getCaptureResultMetadataQueue( [&resultQueue](const auto& descriptor) { resultQueue = std::make_shared( descriptor); @@ -3184,93 +2899,89 @@ TEST_F(CameraHidlTest, flushPreviewRequest) { // Don't use the queue onwards. } }); - ASSERT_TRUE(resultQueueRet.isOk()); - ASSERT_NE(nullptr, resultQueue); + ASSERT_TRUE(resultQueueRet.isOk()); + ASSERT_NE(nullptr, resultQueue); - InFlightRequest inflightReq = {1, false, supportsPartialResults, - partialResultCount, resultQueue}; - RequestTemplate reqTemplate = RequestTemplate::PREVIEW; - Return ret; - ret = session->constructDefaultRequestSettings(reqTemplate, - [&](auto status, const auto& req) { - ASSERT_EQ(Status::OK, status); - settings = req; }); - ASSERT_TRUE(ret.isOk()); + InFlightRequest inflightReq = {1, false, supportsPartialResults, partialResultCount, + resultQueue}; + RequestTemplate reqTemplate = RequestTemplate::PREVIEW; + Return ret; + ret = session->constructDefaultRequestSettings(reqTemplate, + [&](auto status, const auto& req) { + ASSERT_EQ(Status::OK, status); + settings = req; + }); + ASSERT_TRUE(ret.isOk()); - sp gb = new GraphicBuffer( - previewStream.width, previewStream.height, - static_cast(halStreamConfig.streams[0].overrideFormat), - 1, android_convertGralloc1To0Usage( - halStreamConfig.streams[0].producerUsage, - halStreamConfig.streams[0].consumerUsage)); - ASSERT_NE(nullptr, gb.get()); - StreamBuffer outputBuffer = {halStreamConfig.streams[0].id, - bufferId, hidl_handle(gb->getNativeBuffer()->handle), - BufferStatus::OK, nullptr, nullptr}; - ::android::hardware::hidl_vec outputBuffers = { - outputBuffer}; - const StreamBuffer emptyInputBuffer = {-1, 0, nullptr, - BufferStatus::ERROR, nullptr, nullptr}; - CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, - settings, emptyInputBuffer, outputBuffers}; + sp gb = new GraphicBuffer( + previewStream.width, previewStream.height, + static_cast(halStreamConfig.streams[0].overrideFormat), 1, + android_convertGralloc1To0Usage(halStreamConfig.streams[0].producerUsage, + halStreamConfig.streams[0].consumerUsage)); + ASSERT_NE(nullptr, gb.get()); + StreamBuffer outputBuffer = {halStreamConfig.streams[0].id, + bufferId, + hidl_handle(gb->getNativeBuffer()->handle), + BufferStatus::OK, + nullptr, + nullptr}; + ::android::hardware::hidl_vec outputBuffers = {outputBuffer}; + const StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, + nullptr, nullptr}; + CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, + emptyInputBuffer, outputBuffers}; - { - std::unique_lock l(mLock); - mInflightMap.clear(); - mInflightMap.add(frameNumber, &inflightReq); + { + std::unique_lock l(mLock); + mInflightMap.clear(); + mInflightMap.add(frameNumber, &inflightReq); + } + + Status status = Status::INTERNAL_ERROR; + uint32_t numRequestProcessed = 0; + hidl_vec cachesToRemove; + ret = session->processCaptureRequest( + {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, uint32_t n) { + status = s; + numRequestProcessed = n; + }); + + ASSERT_TRUE(ret.isOk()); + ASSERT_EQ(Status::OK, status); + ASSERT_EQ(numRequestProcessed, 1u); + // Flush before waiting for request to complete. + Return returnStatus = session->flush(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + + { + std::unique_lock l(mLock); + while (!inflightReq.errorCodeValid && + ((0 < inflightReq.numBuffersLeft) || (!inflightReq.haveResultMetadata))) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kStreamBufferTimeoutSec); + ASSERT_NE(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); } - Status status = Status::INTERNAL_ERROR; - uint32_t numRequestProcessed = 0; - hidl_vec cachesToRemove; - ret = session->processCaptureRequest( - {request}, - cachesToRemove, - [&status, &numRequestProcessed] (auto s, uint32_t n) { - status = s; - numRequestProcessed = n; - }); - - ASSERT_TRUE(ret.isOk()); - ASSERT_EQ(Status::OK, status); - ASSERT_EQ(numRequestProcessed, 1u); - //Flush before waiting for request to complete. - Return returnStatus = session->flush(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - - { - std::unique_lock l(mLock); - while (!inflightReq.errorCodeValid && - ((0 < inflightReq.numBuffersLeft) || - (!inflightReq.haveResultMetadata))) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kStreamBufferTimeoutSec); - ASSERT_NE(std::cv_status::timeout, - mResultCondition.wait_until(l, timeout)); + if (!inflightReq.errorCodeValid) { + ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); + ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); + } else { + switch (inflightReq.errorCode) { + case ErrorCode::ERROR_REQUEST: + case ErrorCode::ERROR_RESULT: + case ErrorCode::ERROR_BUFFER: + // Expected + break; + case ErrorCode::ERROR_DEVICE: + default: + FAIL() << "Unexpected error:" + << static_cast(inflightReq.errorCode); } - - if (!inflightReq.errorCodeValid) { - ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); - ASSERT_EQ(previewStream.id, - inflightReq.resultOutputBuffers[0].streamId); - } else { - switch (inflightReq.errorCode) { - case ErrorCode::ERROR_REQUEST: - case ErrorCode::ERROR_RESULT: - case ErrorCode::ERROR_BUFFER: - //Expected - break; - case ErrorCode::ERROR_DEVICE: - default: - FAIL() << "Unexpected error:" << static_cast ( - inflightReq.errorCode); - } - } - - ret = session->close(); - ASSERT_TRUE(ret.isOk()); } + + ret = session->close(); + ASSERT_TRUE(ret.isOk()); } } } @@ -3278,41 +2989,35 @@ TEST_F(CameraHidlTest, flushPreviewRequest) { // Verify that camera flushes correctly without any pending requests. TEST_F(CameraHidlTest, flushEmpty) { - for (auto provider : CameraHidlEnvironment::Instance()->mProviders) { - hidl_vec cameraDeviceNames = getCameraDeviceNames( - provider.second); - std::vector outputPreviewStreams; - AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, - static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); + std::vector outputPreviewStreams; + AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, + static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; - for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, provider.first) == - CAMERA_DEVICE_API_VERSION_3_2) { - Stream previewStream; - HalStreamConfiguration halStreamConfig; - sp session; - bool supportsPartialResults = false; - uint32_t partialResultCount = 0; - configurePreviewStream(name, provider.second, &previewThreshold, - &session /*out*/, &previewStream /*out*/, - &halStreamConfig /*out*/, &supportsPartialResults /*out*/, - &partialResultCount /*out*/); + for (const auto& name : cameraDeviceNames) { + if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { + Stream previewStream; + HalStreamConfiguration halStreamConfig; + sp session; + bool supportsPartialResults = false; + uint32_t partialResultCount = 0; + configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, + &previewStream /*out*/, &halStreamConfig /*out*/, + &supportsPartialResults /*out*/, &partialResultCount /*out*/); - Return returnStatus = session->flush(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); + Return returnStatus = session->flush(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); - { - std::unique_lock l(mLock); - auto timeout = std::chrono::system_clock::now() + - std::chrono::milliseconds(kEmptyFlushTimeoutMSec); - ASSERT_EQ(std::cv_status::timeout, - mResultCondition.wait_until(l, timeout)); - } - - Return ret = session->close(); - ASSERT_TRUE(ret.isOk()); + { + std::unique_lock l(mLock); + auto timeout = std::chrono::system_clock::now() + + std::chrono::milliseconds(kEmptyFlushTimeoutMSec); + ASSERT_EQ(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); } + + Return ret = session->close(); + ASSERT_TRUE(ret.isOk()); } } } @@ -3753,6 +3458,7 @@ void CameraHidlTest::setParameters( int main(int argc, char **argv) { ::testing::AddGlobalTestEnvironment(CameraHidlEnvironment::Instance()); ::testing::InitGoogleTest(&argc, argv); + CameraHidlEnvironment::Instance()->init(&argc, argv); int status = RUN_ALL_TESTS(); ALOGI("Test result = %d", status); return status; From d167caff3078cac5a0a70fcb4d35f98377747d78 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Mon, 17 Jul 2017 16:15:25 -0700 Subject: [PATCH 055/265] Split VENDOR program type to four distinct types. Bug: b/32621193 Test: VTS, none added Change-Id: Ia3b793faeed1129932cf312d231c7d661542fda9 --- broadcastradio/1.1/types.hal | 24 +++++++++++++----------- broadcastradio/1.1/utils/Utils.cpp | 5 ++++- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/broadcastradio/1.1/types.hal b/broadcastradio/1.1/types.hal index 004184f5bb..44bb507067 100644 --- a/broadcastradio/1.1/types.hal +++ b/broadcastradio/1.1/types.hal @@ -70,6 +70,10 @@ struct Properties { /** * Type of a radio technology. * + * There are multiple VENDOR program types just to make vendor implementation + * easier with multiple properitary radio technologies. They are treated the + * same by the framework. + * * All other values are reserved for future use. */ enum ProgramType : uint32_t { @@ -80,15 +84,10 @@ enum ProgramType : uint32_t { DAB, // Digital audio broadcasting DRMO, // Digital Radio Mondiale SXM, // SiriusXM Satellite Radio - - /** - * Vendor-specific, not synced across devices. - * - * If it's necessary to support multiple vendor-specific program types, the - * type of vendor radio technology may be encoded in high bits - * of IDENTIFIER_TYPE_VENDOR_PRIMARY. - */ - VENDOR, + VENDOR1, // Vendor-specific, not synced across devices. + VENDOR2, // Vendor-specific, not synced across devices. + VENDOR3, // Vendor-specific, not synced across devices. + VENDOR4, // Vendor-specific, not synced across devices. }; /** @@ -150,9 +149,12 @@ enum IdentifierType : uint32_t { * Primary identifier for vendor-specific radio technology. * The value format is determined by a vendor. * - * It must not be used in any other programType than VENDOR. + * It must not be used in any other programType than VENDORx. */ - VENDOR_PRIMARY, + VENDOR1_PRIMARY, + VENDOR2_PRIMARY, + VENDOR3_PRIMARY, + VENDOR4_PRIMARY, }; /** diff --git a/broadcastradio/1.1/utils/Utils.cpp b/broadcastradio/1.1/utils/Utils.cpp index 270aabbb01..f8a4479046 100644 --- a/broadcastradio/1.1/utils/Utils.cpp +++ b/broadcastradio/1.1/utils/Utils.cpp @@ -91,7 +91,10 @@ bool tunesTo(const ProgramSelector& a, const ProgramSelector& b) { return haveEqualIds(a, b, IdentifierType::SXM_SERVICE_ID); } return haveEqualIds(a, b, IdentifierType::SXM_CHANNEL); - case ProgramType::VENDOR: + case ProgramType::VENDOR1: + case ProgramType::VENDOR2: + case ProgramType::VENDOR3: + case ProgramType::VENDOR4: default: ALOGW("Unsupported program type: %s", toString(type).c_str()); return false; From f8866e79d775ba68faaf0408f30d81cc736bdb7d Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Thu, 13 Jul 2017 15:51:21 -0700 Subject: [PATCH 056/265] Added programInfoChanged callback. Also, updated tuneComplete_1_1 and afSwitch_1_1 to match the new behavior (not passing the whole ProgramInfo struct). Bug: b/32621193 Test: VTS (none added) Change-Id: Ic8aee15b05cb982d97e550fc0806f34fbe112e22 --- broadcastradio/1.1/ITunerCallback.hal | 34 ++++++++++++++++--- broadcastradio/1.1/default/Tuner.cpp | 12 ++++--- .../VtsHalBroadcastradioV1_1TargetTest.cpp | 11 +++--- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/broadcastradio/1.1/ITunerCallback.hal b/broadcastradio/1.1/ITunerCallback.hal index 158e2170b1..b1c5b01d5b 100644 --- a/broadcastradio/1.1/ITunerCallback.hal +++ b/broadcastradio/1.1/ITunerCallback.hal @@ -28,16 +28,26 @@ interface ITunerCallback extends @1.0::ITunerCallback { /** * Method called by the HAL when a tuning operation completes * following a step(), scan() or tune() command. + * + * This callback supersedes V1_0::tuneComplete. For performance reasons, + * the 1.0 callback may not be called when HAL implementation detects 1.1 + * client (by casting V1_0::ITunerCallback to V1_1::ITunerCallback). + * * @param result OK if tune succeeded or TIMEOUT in case of time out. - * @param info A ProgramInfo structure describing the tuned station. + * @param selector A ProgramSelector structure describing the tuned station. */ - oneway tuneComplete_1_1(Result result, ProgramInfo info); + oneway tuneComplete_1_1(Result result, ProgramSelector selector); /** * Method called by the HAL when a frequency switch occurs. - * @param info A ProgramInfo structure describing the new tuned station. + * + * This callback supersedes V1_0::afSwitch. For performance reasons, + * the 1.0 callback may not be called when HAL implementation detects 1.1 + * client (by casting V1_0::ITunerCallback to V1_1::ITunerCallback). + * + * @param selector A ProgramSelector structure describing the tuned station. */ - oneway afSwitch_1_1(ProgramInfo info); + oneway afSwitch_1_1(ProgramSelector selector); /** * Called by the HAL when background scan feature becomes available or not. @@ -69,4 +79,20 @@ interface ITunerCallback extends @1.0::ITunerCallback { * Client may retrieve the actual list with ITuner::getProgramList. */ oneway programListChanged(); + + /** + * Method called by the HAL when current program information (including + * metadata) is updated. + * + * Client may retrieve the actual program info with + * ITuner::getProgramInformation_1_1. + * + * This may be called together with tuneComplete_1_1 or afSwitch_1_1. + * + * This callback supersedes V1_0::tuneComplete, V1_0::afSwitch and + * newMetadata. For performance reasons, these callbacks may not be called + * when HAL implementation detects 1.1 client (by casting + * V1_0::ITunerCallback to V1_1::ITunerCallback). + */ + oneway programInfoChanged(); }; diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index 3c43c2eed8..0238f140cf 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -126,9 +126,10 @@ void Tuner::tuneInternalLocked(const ProgramSelector& sel) { } mIsTuneCompleted = true; - mCallback->tuneComplete(Result::OK, mCurrentProgramInfo.base); - if (mCallback1_1 != nullptr) { - mCallback1_1->tuneComplete_1_1(Result::OK, mCurrentProgramInfo); + if (mCallback1_1 == nullptr) { + mCallback->tuneComplete(Result::OK, mCurrentProgramInfo.base); + } else { + mCallback1_1->tuneComplete_1_1(Result::OK, mCurrentProgramInfo.selector); } } @@ -146,8 +147,9 @@ Return Tuner::scan(Direction direction, bool skipSubChannel __unused) { auto task = [this, direction]() { ALOGI("Performing failed scan %s", toString(direction).c_str()); - mCallback->tuneComplete(Result::TIMEOUT, {}); - if (mCallback1_1 != nullptr) { + if (mCallback1_1 == nullptr) { + mCallback->tuneComplete(Result::TIMEOUT, {}); + } else { mCallback1_1->tuneComplete_1_1(Result::TIMEOUT, {}); } }; diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index 6e6ab44e76..3b29c75de1 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -68,9 +68,9 @@ class TunerCallbackMock : public ITunerCallback { MOCK_METHOD0(hardwareFailure, Return()); MOCK_TIMEOUT_METHOD2(configChange, Return(Result, const BandConfig&)); MOCK_METHOD2(tuneComplete, Return(Result, const V1_0::ProgramInfo&)); - MOCK_TIMEOUT_METHOD2(tuneComplete_1_1, Return(Result, const ProgramInfo&)); + MOCK_TIMEOUT_METHOD2(tuneComplete_1_1, Return(Result, const ProgramSelector&)); MOCK_METHOD1(afSwitch, Return(const V1_0::ProgramInfo&)); - MOCK_METHOD1(afSwitch_1_1, Return(const ProgramInfo&)); + MOCK_METHOD1(afSwitch_1_1, Return(const ProgramSelector&)); MOCK_METHOD1(antennaStateChange, Return(bool connected)); MOCK_METHOD1(trafficAnnouncement, Return(bool active)); MOCK_METHOD1(emergencyAnnouncement, Return(bool active)); @@ -78,6 +78,7 @@ class TunerCallbackMock : public ITunerCallback { MOCK_METHOD1(backgroundScanAvailable, Return(bool)); MOCK_TIMEOUT_METHOD1(backgroundScanComplete, Return(ProgramListResult)); MOCK_METHOD0(programListChanged, Return()); + MOCK_METHOD0(programInfoChanged, Return()); }; class BroadcastRadioHalTest : public ::testing::VtsHalHidlTargetTestBase, @@ -276,14 +277,14 @@ TEST_P(BroadcastRadioHalTest, TuneFromProgramList) { return; } - ProgramInfo infoCb; + ProgramSelector selCb; EXPECT_CALL(*mCallback, tuneComplete(_, _)); EXPECT_TIMEOUT_CALL(*mCallback, tuneComplete_1_1, Result::OK, _) - .WillOnce(DoAll(SaveArg<1>(&infoCb), testing::Return(ByMove(Void())))); + .WillOnce(DoAll(SaveArg<1>(&selCb), testing::Return(ByMove(Void())))); auto tuneResult = mTuner->tune_1_1(firstProgram.selector); ASSERT_EQ(Result::OK, tuneResult); EXPECT_TIMEOUT_CALL_WAIT(*mCallback, tuneComplete_1_1, kTuneTimeout); - EXPECT_EQ(firstProgram.selector.primaryId, infoCb.selector.primaryId); + EXPECT_EQ(firstProgram.selector.primaryId, selCb.primaryId); } INSTANTIATE_TEST_CASE_P(BroadcastRadioHalTestCases, BroadcastRadioHalTest, From 24180098d71d29cd838f6f3cb0e474c06ba04842 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Fri, 14 Jul 2017 10:44:52 -0700 Subject: [PATCH 057/265] Fill announcement-related gaps in Broadcast Radio APIs. - adds TA and TP flags to ProgramInfo struct - adds a callback to cancel announcement Bug: b/63702941 Test: Instrumentalization, VTS Change-Id: I03a0781d37429d4a84aab2dce3e5bb7794a20c57 --- broadcastradio/1.1/ITuner.hal | 18 ++++++++++++ broadcastradio/1.1/default/Tuner.cpp | 5 ++++ broadcastradio/1.1/default/Tuner.h | 28 ++++++++++--------- broadcastradio/1.1/types.hal | 11 ++++++++ .../VtsHalBroadcastradioV1_1TargetTest.cpp | 17 +++++++---- 5 files changed, 61 insertions(+), 18 deletions(-) diff --git a/broadcastradio/1.1/ITuner.hal b/broadcastradio/1.1/ITuner.hal index 912786ab2e..a5c569a930 100644 --- a/broadcastradio/1.1/ITuner.hal +++ b/broadcastradio/1.1/ITuner.hal @@ -41,6 +41,24 @@ interface ITuner extends @1.0::ITuner { */ tune_1_1(ProgramSelector program) generates (Result result); + /** + * Cancels announcement. + * + * If it was traffic announcement, trafficAnnouncement(false) callback + * should be called (just like it was ended in a normal way). Similarly for + * emergency announcement. If there was no announcement, then no action + * should be taken. + * + * There is a race condition between calling cancelAnnouncement and the + * actual announcement being finished, so trafficAnnouncement / + * emergencyAnnouncement callback should be tracked with proper locking. + * + * @return result OK if successfully cancelled announcement or there was + * no announcement. + * NOT_INITIALIZED if another error occurs. + */ + cancelAnnouncement() generates (Result result); + /** * Retrieve current station information. * @return result OK if scan successfully started diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index 0238f140cf..271f6337ed 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -269,6 +269,11 @@ Return Tuner::cancel() { return Result::OK; } +Return Tuner::cancelAnnouncement() { + ALOGV("%s", __func__); + return Result::OK; +} + Return Tuner::getProgramInformation(getProgramInformation_cb _hidl_cb) { ALOGV("%s", __func__); return getProgramInformation_1_1([&](Result result, const ProgramInfo& info) { diff --git a/broadcastradio/1.1/default/Tuner.h b/broadcastradio/1.1/default/Tuner.h index 5c8a7e571c..2ab4f407aa 100644 --- a/broadcastradio/1.1/default/Tuner.h +++ b/broadcastradio/1.1/default/Tuner.h @@ -34,19 +34,21 @@ struct Tuner : public ITuner { void forceClose(); // V1_1::ITuner methods - Return setConfiguration(const V1_0::BandConfig& config) override; - Return getConfiguration(getConfiguration_cb _hidl_cb) override; - Return scan(V1_0::Direction direction, bool skipSubChannel) override; - Return step(V1_0::Direction direction, bool skipSubChannel) override; - Return tune(uint32_t channel, uint32_t subChannel) override; - Return tune_1_1(const ProgramSelector& program) override; - Return cancel() override; - Return getProgramInformation(getProgramInformation_cb _hidl_cb) override; - Return getProgramInformation_1_1(getProgramInformation_1_1_cb _hidl_cb) override; - Return startBackgroundScan() override; - Return getProgramList(const hidl_string& filter, getProgramList_cb _hidl_cb) override; - Return isAnalogForced(isAnalogForced_cb _hidl_cb) override; - Return setAnalogForced(bool isForced) override; + virtual Return setConfiguration(const V1_0::BandConfig& config) override; + virtual Return getConfiguration(getConfiguration_cb _hidl_cb) override; + virtual Return scan(V1_0::Direction direction, bool skipSubChannel) override; + virtual Return step(V1_0::Direction direction, bool skipSubChannel) override; + virtual Return tune(uint32_t channel, uint32_t subChannel) override; + virtual Return tune_1_1(const ProgramSelector& program) override; + virtual Return cancel() override; + virtual Return cancelAnnouncement() override; + virtual Return getProgramInformation(getProgramInformation_cb _hidl_cb) override; + virtual Return getProgramInformation_1_1(getProgramInformation_1_1_cb _hidl_cb) override; + virtual Return startBackgroundScan() override; + virtual Return getProgramList(const hidl_string& filter, + getProgramList_cb _hidl_cb) override; + virtual Return isAnalogForced(isAnalogForced_cb _hidl_cb) override; + virtual Return setAnalogForced(bool isForced) override; private: std::mutex mMut; diff --git a/broadcastradio/1.1/types.hal b/broadcastradio/1.1/types.hal index 44bb507067..73e4ba5ebf 100644 --- a/broadcastradio/1.1/types.hal +++ b/broadcastradio/1.1/types.hal @@ -43,6 +43,17 @@ enum ProgramInfoFlags : uint32_t { * increasing volume too much. */ MUTED = 1 << 1, + + /** + * Station broadcasts traffic information regularly, + * but not necessarily right now. + */ + TRAFFIC_PROGRAM = 1 << 2, + + /** + * Station is broadcasting traffic information at the very moment. + */ + TRAFFIC_ANNOUNCEMENT = 1 << 3, }; struct Properties { diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index 3b29c75de1..6910d95cd3 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -47,6 +47,7 @@ using testing::_; using testing::AnyNumber; using testing::ByMove; using testing::DoAll; +using testing::Invoke; using testing::SaveArg; using broadcastradio::vts::CallBarrier; @@ -63,8 +64,9 @@ static void printSkipped(std::string msg) { std::cout << "[ SKIPPED ] " << msg << std::endl; } -class TunerCallbackMock : public ITunerCallback { - public: +struct TunerCallbackMock : public ITunerCallback { + TunerCallbackMock() { EXPECT_CALL(*this, hardwareFailure()).Times(0); } + MOCK_METHOD0(hardwareFailure, Return()); MOCK_TIMEOUT_METHOD2(configChange, Return(Result, const BandConfig&)); MOCK_METHOD2(tuneComplete, Return(Result, const V1_0::ProgramInfo&)); @@ -106,9 +108,6 @@ class BroadcastRadioHalTest : public ::testing::VtsHalHidlTargetTestBase, void BroadcastRadioHalTest::SetUp() { radioClass = GetParam(); - // set general expectations for a callback - EXPECT_CALL(*mCallback, hardwareFailure()).Times(0); - // lookup HIDL service auto factory = getService(); ASSERT_NE(nullptr, factory.get()); @@ -287,6 +286,14 @@ TEST_P(BroadcastRadioHalTest, TuneFromProgramList) { EXPECT_EQ(firstProgram.selector.primaryId, selCb.primaryId); } +TEST_P(BroadcastRadioHalTest, CancelAnnouncement) { + if (skipped) return; + ASSERT_TRUE(openTuner(0)); + + auto hidlResult = mTuner->cancelAnnouncement(); + EXPECT_EQ(Result::OK, hidlResult); +} + INSTANTIATE_TEST_CASE_P(BroadcastRadioHalTestCases, BroadcastRadioHalTest, ::testing::Values(Class::AM_FM, Class::SAT, Class::DT)); From e192c39c51ab78f9f18de149ad3fbe94ae39724c Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Sun, 16 Jul 2017 15:14:34 -0700 Subject: [PATCH 058/265] Make it possible to check if a given program/identifier type is supported. Test: VTS Bug: b/63702941 Change-Id: I8bf162646971188d3bed006c66eb25f1f5dc8df9 --- broadcastradio/1.1/default/BroadcastRadio.cpp | 10 ++++++++ broadcastradio/1.1/types.hal | 23 +++++++++++++++++++ .../VtsHalBroadcastradioV1_1TargetTest.cpp | 2 ++ 3 files changed, 35 insertions(+) diff --git a/broadcastradio/1.1/default/BroadcastRadio.cpp b/broadcastradio/1.1/default/BroadcastRadio.cpp index 1119ffd854..297dcc1cee 100644 --- a/broadcastradio/1.1/default/BroadcastRadio.cpp +++ b/broadcastradio/1.1/default/BroadcastRadio.cpp @@ -89,6 +89,16 @@ Return BroadcastRadio::getProperties_1_1(getProperties_1_1_cb _hidl_cb) { prop10.numAudioSources = 1; prop10.supportsCapture = false; prop11.supportsBackgroundScanning = false; + prop11.supportedProgramTypes = vector({ + static_cast(ProgramType::AM), static_cast(ProgramType::FM), + static_cast(ProgramType::AM_HD), static_cast(ProgramType::FM_HD), + }); + prop11.supportedIdentifierTypes = vector({ + static_cast(IdentifierType::AMFM_FREQUENCY), + static_cast(IdentifierType::RDS_PI), + static_cast(IdentifierType::HD_STATION_ID_EXT), + static_cast(IdentifierType::HD_SUBCHANNEL), + }); prop11.vendorExension = "dummy"; prop10.bands.resize(mConfig.amFmBands.size()); diff --git a/broadcastradio/1.1/types.hal b/broadcastradio/1.1/types.hal index 73e4ba5ebf..356c29913d 100644 --- a/broadcastradio/1.1/types.hal +++ b/broadcastradio/1.1/types.hal @@ -65,6 +65,29 @@ struct Properties { */ bool supportsBackgroundScanning; + /** + * A list of supported ProgramType values. + * + * If a program type is supported by radio module, it means it can tune + * to ProgramSelector of a given type. + * + * Support for VENDOR program type does not guarantee compatibility, as + * other module properties (implementor, product, version) must be checked. + */ + vec supportedProgramTypes; + + /** + * A list of supported IdentifierType values. + * + * If an identifier is supported by radio module, it means it can use it for + * tuning to ProgramSelector with either primary or secondary Identifier of + * a given type. + * + * Support for VENDOR identifier type does not guarantee compatibility, as + * other module properties (implementor, product, version) must be checked. + */ + vec supportedIdentifierTypes; + /** * Opaque vendor-specific string, to be passed to front-end without changes. * Format of this string can vary across vendors. diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index 6910d95cd3..9e7c00bc91 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -139,6 +139,8 @@ void BroadcastRadioHalTest::SetUp() { ASSERT_TRUE(propResult.isOk()); EXPECT_EQ(radioClass, prop10.classId); EXPECT_GT(prop10.numTuners, 0u); + EXPECT_GT(prop11.supportedProgramTypes.size(), 0u); + EXPECT_GT(prop11.supportedIdentifierTypes.size(), 0u); if (radioClass == Class::AM_FM) { EXPECT_GT(prop10.bands.size(), 0u); } From df47955adf56dbf925763545a6f6036654d320af Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Mon, 12 Jun 2017 19:11:40 +0530 Subject: [PATCH 059/265] improve timeout handling 1. Maintaining large delays between successive input/output queue calls unnecessarily increases execution duration of the application. This is brought down to 2ms. 2. Flush and EOS sends events via callback. So offer them some leeway by increasing their timeout 3. No response breakout is changed to 5sec. 4. bug fix: decrement twice with in a loop removed Change-Id: I37dbee0dbdc79044beced89077f6ef46c7075e9f --- .../VtsHalMediaOmxV1_0TargetAudioDecTest.cpp | 35 +++++++++---------- .../VtsHalMediaOmxV1_0TargetAudioEncTest.cpp | 29 ++++++++------- .../common/media_hidl_test_common.cpp | 8 ++--- .../common/media_hidl_test_common.h | 18 ++++++++-- .../VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 35 +++++++++---------- .../VtsHalMediaOmxV1_0TargetVideoEncTest.cpp | 31 ++++++++-------- .../video/media_video_hidl_test_common.h | 1 - 7 files changed, 80 insertions(+), 77 deletions(-) diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp index 336cab4832..6790ebfcd4 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp @@ -588,12 +588,12 @@ void waitOnInputConsumption(sp omxNode, sp observer, AudioDecHidlTest::standardComp comp) { android::hardware::media::omx::V1_0::Status status; Message msg; - int timeOut = TIMEOUT_COUNTER; + int timeOut = TIMEOUT_COUNTER_Q; while (timeOut--) { size_t i = 0; status = - observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); + observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); if (status == android::hardware::media::omx::V1_0::Status::OK) { EXPECT_EQ(msg.type, Message::Type::EVENT); packedArgs audioArgs = {eEncoding, comp}; @@ -613,8 +613,8 @@ void waitOnInputConsumption(sp omxNode, sp observer, size_t index; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); + timeOut = TIMEOUT_COUNTER_Q; } - timeOut--; } } @@ -654,11 +654,12 @@ void decodeNFrames(sp omxNode, sp observer, frameID++; } - int timeOut = TIMEOUT_COUNTER; - bool stall = false; + int timeOut = TIMEOUT_COUNTER_Q; + bool iQueued, oQueued; while (1) { + iQueued = oQueued = false; status = - observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); + observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); // Port Reconfiguration if (status == android::hardware::media::omx::V1_0::Status::OK && @@ -688,18 +689,16 @@ void decodeNFrames(sp omxNode, sp observer, (*Info)[frameID].bytesCount, flags, (*Info)[frameID].timestamp); frameID++; - stall = false; - } else - stall = true; + iQueued = true; + } if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); - stall = false; - } else - stall = true; - if (stall) - timeOut--; + oQueued = true; + } + if (iQueued || oQueued) + timeOut = TIMEOUT_COUNTER_Q; else - timeOut = TIMEOUT_COUNTER; + timeOut--; if (timeOut == 0) { EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite"; break; @@ -1149,9 +1148,8 @@ TEST_F(AudioDecHidlTest, FlushTest) { decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0, nFrames, compName, false); - // Note: Assumes 200 ms is enough to end any decode call that started flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, 200000); + kPortIndexOutput); framesReceived = 0; // Seek to next key frame and start decoding till the end @@ -1172,9 +1170,8 @@ TEST_F(AudioDecHidlTest, FlushTest) { kPortIndexInput, kPortIndexOutput, eleStream, &Info, index, Info.size() - index, compName, false); } - // Note: Assumes 200 ms is enough to end any decode call that started flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, 200000); + kPortIndexOutput); framesReceived = 0; // set state to idle diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp index ae79e82621..038830dc2e 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp @@ -342,12 +342,12 @@ void waitOnInputConsumption(sp omxNode, sp observer, android::Vector* oBuffer) { android::hardware::media::omx::V1_0::Status status; Message msg; - int timeOut = TIMEOUT_COUNTER; + int timeOut = TIMEOUT_COUNTER_Q; while (timeOut--) { size_t i = 0; status = - observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); + observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); EXPECT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); // status == TIMED_OUT, it could be due to process time being large @@ -362,8 +362,8 @@ void waitOnInputConsumption(sp omxNode, sp observer, size_t index; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); + timeOut = TIMEOUT_COUNTER_Q; } - timeOut--; } } @@ -400,11 +400,12 @@ void encodeNFrames(sp omxNode, sp observer, nFrames--; } - int timeOut = TIMEOUT_COUNTER; - bool stall = false; + int timeOut = TIMEOUT_COUNTER_Q; + bool iQueued, oQueued; while (1) { + iQueued = oQueued = false; status = - observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); + observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); if (status == android::hardware::media::omx::V1_0::Status::OK) ASSERT_TRUE(false); @@ -425,19 +426,17 @@ void encodeNFrames(sp omxNode, sp observer, timestamp); timestamp += timestampIncr; nFrames--; - stall = false; - } else - stall = true; + iQueued = true; + } // Dispatch output buffer if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); - stall = false; - } else - stall = true; - if (stall) - timeOut--; + oQueued = true; + } + if (iQueued || oQueued) + timeOut = TIMEOUT_COUNTER_Q; else - timeOut = TIMEOUT_COUNTER; + timeOut--; if (timeOut == 0) { EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite"; break; diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp index 1863972e14..a890c4f487 100755 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp @@ -532,7 +532,7 @@ void testEOS(sp omxNode, sp observer, } } - int timeOut = TIMEOUT_COUNTER; + int timeOut = TIMEOUT_COUNTER_PE; while (timeOut--) { // Dispatch all client owned output buffers to recover remaining frames while (1) { @@ -541,15 +541,15 @@ void testEOS(sp omxNode, sp observer, // if dispatch is successful, perhaps there is a latency // in the component. Dont be in a haste to leave. reset timeout // counter - timeOut = TIMEOUT_COUNTER; + timeOut = TIMEOUT_COUNTER_PE; } else { break; } } Message msg; - status = - observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); + status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_PE, iBuffer, + oBuffer); if (status == android::hardware::media::omx::V1_0::Status::OK) { if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { if (fptr) { diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h index 95e32fa18f..802f4d6075 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h @@ -33,8 +33,21 @@ #include #include +/* TIME OUTS (Wait time in dequeueMessage()) */ + +/* As component is switching states (loaded<->idle<->execute), dequeueMessage() + * expects the events to be received within this duration */ #define DEFAULT_TIMEOUT 100000 -#define TIMEOUT_COUNTER (10000000 / DEFAULT_TIMEOUT) +/* Time interval between successive Input/Output enqueues */ +#define DEFAULT_TIMEOUT_Q 2000 +/* While the component is amidst a process call, asynchronous commands like + * flush, change states can get delayed (at max by process call time). Instead + * of waiting on DEFAULT_TIMEOUT, we give an additional leeway. */ +#define DEFAULT_TIMEOUT_PE 500000 + +/* Breakout Timeout :: 5 sec*/ +#define TIMEOUT_COUNTER_Q (5000000 / DEFAULT_TIMEOUT_Q) +#define TIMEOUT_COUNTER_PE (5000000 / DEFAULT_TIMEOUT_PE) /* * Random Index used for monkey testing while get/set parameters @@ -310,7 +323,8 @@ void dispatchInputBuffer(sp omxNode, void flushPorts(sp omxNode, sp observer, android::Vector* iBuffer, android::Vector* oBuffer, OMX_U32 kPortIndexInput, - OMX_U32 kPortIndexOutput, int64_t timeoutUs = DEFAULT_TIMEOUT); + OMX_U32 kPortIndexOutput, + int64_t timeoutUs = DEFAULT_TIMEOUT_PE); typedef void (*portreconfig)(sp omxNode, sp observer, android::Vector* iBuffer, diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index 12b1355f4e..a9c29c736a 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -604,12 +604,12 @@ void waitOnInputConsumption(sp omxNode, sp observer, PortMode oPortMode) { android::hardware::media::omx::V1_0::Status status; Message msg; - int timeOut = TIMEOUT_COUNTER; + int timeOut = TIMEOUT_COUNTER_Q; while (timeOut--) { size_t i = 0; status = - observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); + observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); if (status == android::hardware::media::omx::V1_0::Status::OK) { EXPECT_EQ(msg.type, Message::Type::EVENT); portReconfiguration(omxNode, observer, iBuffer, oBuffer, @@ -628,8 +628,8 @@ void waitOnInputConsumption(sp omxNode, sp observer, size_t index; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode); + timeOut = TIMEOUT_COUNTER_Q; } - timeOut--; } } @@ -669,11 +669,12 @@ void decodeNFrames(sp omxNode, sp observer, frameID++; } - int timeOut = TIMEOUT_COUNTER; - bool stall = false; + int timeOut = TIMEOUT_COUNTER_Q; + bool iQueued, oQueued; while (1) { + iQueued = oQueued = false; status = - observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); + observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); // Port Reconfiguration if (status == android::hardware::media::omx::V1_0::Status::OK && @@ -702,18 +703,16 @@ void decodeNFrames(sp omxNode, sp observer, (*Info)[frameID].bytesCount, flags, (*Info)[frameID].timestamp); frameID++; - stall = false; - } else - stall = true; + iQueued = true; + } if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode); - stall = false; - } else - stall = true; - if (stall) - timeOut--; + oQueued = true; + } + if (iQueued || oQueued) + timeOut = TIMEOUT_COUNTER_Q; else - timeOut = TIMEOUT_COUNTER; + timeOut--; if (timeOut == 0) { EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite"; break; @@ -1165,9 +1164,8 @@ TEST_F(VideoDecHidlTest, FlushTest) { decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0, nFrames, portMode[1], false); - // Note: Assumes 200 ms is enough to end any decode call that started flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, 200000); + kPortIndexOutput); framesReceived = 0; // Seek to next key frame and start decoding till the end @@ -1188,9 +1186,8 @@ TEST_F(VideoDecHidlTest, FlushTest) { kPortIndexOutput, eleStream, &Info, index, Info.size() - index, portMode[1], false); } - // Note: Assumes 200 ms is enough to end any decode call that started flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, 200000); + kPortIndexOutput); framesReceived = 0; // set state to idle diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp index a1ed21ae83..f4a4e9bf81 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp @@ -612,12 +612,12 @@ void waitOnInputConsumption(sp omxNode, sp observer, sp listener = nullptr) { android::hardware::media::omx::V1_0::Status status; Message msg; - int timeOut = TIMEOUT_COUNTER; + int timeOut = TIMEOUT_COUNTER_Q; while (timeOut--) { size_t i = 0; status = - observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); + observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); EXPECT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); // status == TIMED_OUT, it could be due to process time being large @@ -636,6 +636,7 @@ void waitOnInputConsumption(sp omxNode, sp observer, size_t index; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); + timeOut = TIMEOUT_COUNTER_Q; } } } @@ -1027,11 +1028,12 @@ void encodeNFrames(sp omxNode, sp observer, } } - int timeOut = TIMEOUT_COUNTER; - bool stall = false; + int timeOut = TIMEOUT_COUNTER_Q; + bool iQueued, oQueued; while (1) { + iQueued = oQueued = false; status = - observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); + observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); if (status == android::hardware::media::omx::V1_0::Status::OK) { ASSERT_EQ(msg.type, Message::Type::EVENT); @@ -1062,9 +1064,7 @@ void encodeNFrames(sp omxNode, sp observer, timestamp += timestampIncr; nFrames--; ipCount++; - stall = false; - } else { - stall = true; + iQueued = true; } } else { if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) { @@ -1083,20 +1083,17 @@ void encodeNFrames(sp omxNode, sp observer, timestamp += timestampIncr; nFrames--; ipCount++; - stall = false; - } else { - stall = true; + iQueued = true; } } if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); - stall = false; - } else - stall = true; - if (stall) - timeOut--; + oQueued = true; + } + if (iQueued || oQueued) + timeOut = TIMEOUT_COUNTER_Q; else - timeOut = TIMEOUT_COUNTER; + timeOut--; if (timeOut == 0) { EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite"; break; diff --git a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h index e6a61d4a8f..55de125877 100644 --- a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h @@ -17,7 +17,6 @@ #ifndef MEDIA_VIDEO_HIDL_TEST_COMMON_H #define MEDIA_VIDEO_HIDL_TEST_COMMON_H - /* * Common video utils */ From 3b8a9ed510a7879432cac85a94cf3ad7ad1dd9b1 Mon Sep 17 00:00:00 2001 From: Edwin Wong Date: Mon, 17 Jul 2017 09:53:31 -0700 Subject: [PATCH 060/265] Check for nullptr IMemory. mapMemory can return a nullptr, must check for nullptr IMemory. Test: Play Movies (stream and pin movies) Test: VtsHalDrmV1_0TargetTest bug: 38386082 Change-Id: I0766380a5843415ef0260c26bd21d4b4051b20ea --- drm/1.0/default/CryptoPlugin.cpp | 15 ++++++++++++- .../vts/functional/drm_hal_clearkey_test.cpp | 21 +++++++++--------- .../vts/functional/drm_hal_vendor_test.cpp | 22 +++++++++---------- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/drm/1.0/default/CryptoPlugin.cpp b/drm/1.0/default/CryptoPlugin.cpp index 591861aeec..fd75dbd3f9 100644 --- a/drm/1.0/default/CryptoPlugin.cpp +++ b/drm/1.0/default/CryptoPlugin.cpp @@ -51,7 +51,11 @@ namespace implementation { Return CryptoPlugin::setSharedBufferBase(const hidl_memory& base, uint32_t bufferId) { - mSharedBufferMap[bufferId] = mapMemory(base); + sp hidlMemory = mapMemory(base); + ALOGE_IF(hidlMemory == nullptr, "mapMemory returns nullptr"); + + // allow mapMemory to return nullptr + mSharedBufferMap[bufferId] = hidlMemory; return Void(); } @@ -107,6 +111,10 @@ namespace implementation { AString detailMessage; sp sourceBase = mSharedBufferMap[source.bufferId]; + if (sourceBase == nullptr) { + _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, 0, "source is a nullptr"); + return Void(); + } if (source.offset + offset + source.size > sourceBase->getSize()) { _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, 0, "invalid buffer size"); @@ -121,6 +129,11 @@ namespace implementation { if (destination.type == BufferType::SHARED_MEMORY) { const SharedBuffer& destBuffer = destination.nonsecureMemory; sp destBase = mSharedBufferMap[destBuffer.bufferId]; + if (destBase == nullptr) { + _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, 0, "destination is a nullptr"); + return Void(); + } + if (destBuffer.offset + destBuffer.size > destBase->getSize()) { _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, 0, "invalid buffer size"); return Void(); diff --git a/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp b/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp index 26641e8953..eeee3c0ec1 100644 --- a/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp +++ b/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp @@ -94,10 +94,10 @@ class DrmHalClearkeyFactoryTest : public ::testing::VtsHalHidlTargetTestBase { drmFactory = ::testing::VtsHalHidlTargetTestBase::getService(); - ASSERT_NE(drmFactory, nullptr); + ASSERT_NE(nullptr, drmFactory.get()); cryptoFactory = ::testing::VtsHalHidlTargetTestBase::getService(); - ASSERT_NE(cryptoFactory, nullptr); + ASSERT_NE(nullptr, cryptoFactory.get()); } virtual void TearDown() override {} @@ -166,7 +166,7 @@ TEST_F(DrmHalClearkeyFactoryTest, CreateClearKeyDrmPlugin) { kClearKeyUUID, packageName, [&](Status status, const sp& plugin) { EXPECT_EQ(Status::OK, status); - EXPECT_NE(plugin, nullptr); + EXPECT_NE(nullptr, plugin.get()); }); EXPECT_OK(res); } @@ -180,7 +180,7 @@ TEST_F(DrmHalClearkeyFactoryTest, CreateClearKeyCryptoPlugin) { kClearKeyUUID, initVec, [&](Status status, const sp& plugin) { EXPECT_EQ(Status::OK, status); - EXPECT_NE(plugin, nullptr); + EXPECT_NE(nullptr, plugin.get()); }); EXPECT_OK(res); } @@ -194,7 +194,7 @@ TEST_F(DrmHalClearkeyFactoryTest, CreateInvalidDrmPlugin) { kInvalidUUID, packageName, [&](Status status, const sp& plugin) { EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); - EXPECT_EQ(plugin, nullptr); + EXPECT_EQ(nullptr, plugin.get()); }); EXPECT_OK(res); } @@ -208,7 +208,7 @@ TEST_F(DrmHalClearkeyFactoryTest, CreateInvalidCryptoPlugin) { kInvalidUUID, initVec, [&](Status status, const sp& plugin) { EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); - EXPECT_EQ(plugin, nullptr); + EXPECT_EQ(nullptr, plugin.get()); }); EXPECT_OK(res); } @@ -219,13 +219,13 @@ class DrmHalClearkeyPluginTest : public DrmHalClearkeyFactoryTest { // Create factories DrmHalClearkeyFactoryTest::SetUp(); - ASSERT_NE(drmFactory, nullptr); + ASSERT_NE(nullptr, drmFactory.get()); hidl_string packageName("android.hardware.drm.test"); auto res = drmFactory->createPlugin( kClearKeyUUID, packageName, [this](Status status, const sp& plugin) { EXPECT_EQ(Status::OK, status); - ASSERT_NE(plugin, nullptr); + ASSERT_NE(nullptr, plugin.get()); drmPlugin = plugin; }); ASSERT_OK(res); @@ -235,7 +235,7 @@ class DrmHalClearkeyPluginTest : public DrmHalClearkeyFactoryTest { kClearKeyUUID, initVec, [this](Status status, const sp& plugin) { EXPECT_EQ(Status::OK, status); - ASSERT_NE(plugin, nullptr); + ASSERT_NE(nullptr, plugin.get()); cryptoPlugin = plugin; }); ASSERT_OK(res); @@ -866,7 +866,7 @@ TEST_F(DrmHalClearkeyPluginTest, NotifyResolution) { sp DrmHalClearkeyPluginTest::getDecryptMemory(size_t size, size_t index) { sp ashmemAllocator = IAllocator::getService("ashmem"); - EXPECT_NE(ashmemAllocator, nullptr); + EXPECT_NE(nullptr, ashmemAllocator.get()); hidl_memory hidlMemory; auto res = ashmemAllocator->allocate( @@ -878,6 +878,7 @@ sp DrmHalClearkeyPluginTest::getDecryptMemory(size_t size, EXPECT_OK(res); sp mappedMemory = mapMemory(hidlMemory); + EXPECT_NE(nullptr, mappedMemory.get()); EXPECT_OK(cryptoPlugin->setSharedBufferBase(hidlMemory, index)); return mappedMemory; } diff --git a/drm/1.0/vts/functional/drm_hal_vendor_test.cpp b/drm/1.0/vts/functional/drm_hal_vendor_test.cpp index 67b2c7d61d..6ce465f34c 100644 --- a/drm/1.0/vts/functional/drm_hal_vendor_test.cpp +++ b/drm/1.0/vts/functional/drm_hal_vendor_test.cpp @@ -113,7 +113,7 @@ class DrmHalVendorFactoryTest : public testing::TestWithParam { test_info->test_case_name(), test_info->name(), GetParam().c_str()); - ASSERT_NE(vendorModule, nullptr); + ASSERT_NE(nullptr, vendorModule.get()); // First try the binderized service name provided by the vendor module. // If that fails, which it can on non-binderized devices, try the default @@ -123,14 +123,14 @@ class DrmHalVendorFactoryTest : public testing::TestWithParam { if (drmFactory == nullptr) { drmFactory = VtsTestBase::getService(); } - ASSERT_NE(drmFactory, nullptr); + ASSERT_NE(nullptr, drmFactory.get()); // Do the same for the crypto factory cryptoFactory = VtsTestBase::getService(name); if (cryptoFactory == nullptr) { cryptoFactory = VtsTestBase::getService(); } - ASSERT_NE(cryptoFactory, nullptr); + ASSERT_NE(nullptr, cryptoFactory.get()); // If drm scheme not installed skip subsequent tests if (!drmFactory->isCryptoSchemeSupported(getVendorUUID())) { @@ -239,7 +239,7 @@ TEST_P(DrmHalVendorFactoryTest, CreateVendorDrmPlugin) { getVendorUUID(), packageName, [&](Status status, const sp& plugin) { EXPECT_EQ(Status::OK, status); - EXPECT_NE(plugin, nullptr); + EXPECT_NE(nullptr, plugin.get()); }); EXPECT_OK(res); } @@ -254,7 +254,7 @@ TEST_P(DrmHalVendorFactoryTest, CreateVendorCryptoPlugin) { getVendorUUID(), initVec, [&](Status status, const sp& plugin) { EXPECT_EQ(Status::OK, status); - EXPECT_NE(plugin, nullptr); + EXPECT_NE(nullptr, plugin.get()); }); EXPECT_OK(res); } @@ -269,7 +269,7 @@ TEST_P(DrmHalVendorFactoryTest, CreateInvalidDrmPlugin) { kInvalidUUID, packageName, [&](Status status, const sp& plugin) { EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); - EXPECT_EQ(plugin, nullptr); + EXPECT_EQ(nullptr, plugin.get()); }); EXPECT_OK(res); } @@ -284,7 +284,7 @@ TEST_P(DrmHalVendorFactoryTest, CreateInvalidCryptoPlugin) { kInvalidUUID, initVec, [&](Status status, const sp& plugin) { EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); - EXPECT_EQ(plugin, nullptr); + EXPECT_EQ(nullptr, plugin.get()); }); EXPECT_OK(res); } @@ -302,7 +302,7 @@ class DrmHalVendorPluginTest : public DrmHalVendorFactoryTest { getVendorUUID(), packageName, [this](Status status, const sp& plugin) { EXPECT_EQ(Status::OK, status); - ASSERT_NE(plugin, nullptr); + ASSERT_NE(nullptr, plugin.get()); drmPlugin = plugin; }); ASSERT_OK(res); @@ -312,7 +312,7 @@ class DrmHalVendorPluginTest : public DrmHalVendorFactoryTest { getVendorUUID(), initVec, [this](Status status, const sp& plugin) { EXPECT_EQ(Status::OK, status); - ASSERT_NE(plugin, nullptr); + ASSERT_NE(nullptr, plugin.get()); cryptoPlugin = plugin; }); ASSERT_OK(res); @@ -1185,7 +1185,7 @@ TEST_P(DrmHalVendorPluginTest, NotifyResolution) { sp DrmHalVendorPluginTest::getDecryptMemory(size_t size, size_t index) { sp ashmemAllocator = IAllocator::getService("ashmem"); - EXPECT_NE(ashmemAllocator, nullptr); + EXPECT_NE(nullptr, ashmemAllocator.get()); hidl_memory hidlMemory; auto res = ashmemAllocator->allocate( @@ -1198,7 +1198,7 @@ sp DrmHalVendorPluginTest::getDecryptMemory(size_t size, EXPECT_OK(res); sp mappedMemory = mapMemory(hidlMemory); - EXPECT_NE(mappedMemory, nullptr); + EXPECT_NE(nullptr, mappedMemory.get()); res = cryptoPlugin->setSharedBufferBase(hidlMemory, index); EXPECT_OK(res); return mappedMemory; From c67f7b09fd173fabd842cf4d392a808c86bdcc2a Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Tue, 18 Jul 2017 15:37:28 -0700 Subject: [PATCH 061/265] Mark a.h.broadcastradio@1.1-utils-lib as vendor_available It is used by libandroid_servers, a platform module. Test: BOARD_VNDK_VERSION=current m libandroid_servers -j Bug: 33241851 Change-Id: Iac260092d488133033b9a5f0238f7993ab5ef7f0 --- broadcastradio/1.1/utils/Android.bp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/broadcastradio/1.1/utils/Android.bp b/broadcastradio/1.1/utils/Android.bp index df5e8e02c1..73c66809a7 100644 --- a/broadcastradio/1.1/utils/Android.bp +++ b/broadcastradio/1.1/utils/Android.bp @@ -16,7 +16,7 @@ cc_library_static { name: "android.hardware.broadcastradio@1.1-utils-lib", - vendor: true, + vendor_available: true, relative_install_path: "hw", cflags: [ "-Wall", From dd98d966c5e36053fde991d46ac06a81b6c06ef6 Mon Sep 17 00:00:00 2001 From: Steve Paik Date: Tue, 11 Jul 2017 23:30:35 -0700 Subject: [PATCH 062/265] Fix WHEEL_TICK + and add friends Bug: 62876582 Test: Embedded Kitchen Sink works with VHAL emulator Change-Id: Ifb631e69697658dd3e7b25ec22421b511fd1759b --- .../default/impl/vhal_v2_1/DefaultConfig.h | 17 +++++ automotive/vehicle/2.1/types.hal | 62 ++++++++++++++++--- 2 files changed, 72 insertions(+), 7 deletions(-) diff --git a/automotive/vehicle/2.1/default/impl/vhal_v2_1/DefaultConfig.h b/automotive/vehicle/2.1/default/impl/vhal_v2_1/DefaultConfig.h index 0f10086d70..d024a557f6 100644 --- a/automotive/vehicle/2.1/default/impl/vhal_v2_1/DefaultConfig.h +++ b/automotive/vehicle/2.1/default/impl/vhal_v2_1/DefaultConfig.h @@ -29,12 +29,16 @@ namespace V2_1 { namespace impl { // Some handy constants to avoid conversions from enum to int. +constexpr int ABS_ACTIVE = (int) V2_1::VehicleProperty::ABS_ACTIVE; constexpr int OBD2_LIVE_FRAME = (int) V2_1::VehicleProperty::OBD2_LIVE_FRAME; constexpr int OBD2_FREEZE_FRAME = (int) V2_1::VehicleProperty::OBD2_FREEZE_FRAME; constexpr int OBD2_FREEZE_FRAME_INFO = (int) V2_1::VehicleProperty::OBD2_FREEZE_FRAME_INFO; constexpr int OBD2_FREEZE_FRAME_CLEAR = (int) V2_1::VehicleProperty::OBD2_FREEZE_FRAME_CLEAR; +constexpr int TRACTION_CONTROL_ACTIVE = (int) V2_1::VehicleProperty::TRACTION_CONTROL_ACTIVE; constexpr int VEHICLE_MAP_SERVICE = (int) V2_1::VehicleProperty::VEHICLE_MAP_SERVICE; constexpr int WHEEL_TICK = (int) V2_1::VehicleProperty::WHEEL_TICK; +constexpr int ALL_WHEELS = (int) (V2_0::Wheel::LEFT_FRONT | V2_0::Wheel::RIGHT_FRONT | + V2_0::Wheel::LEFT_REAR | V2_0::Wheel::RIGHT_REAR); const V2_0::VehiclePropConfig kVehicleProperties[] = { @@ -42,10 +46,23 @@ const V2_0::VehiclePropConfig kVehicleProperties[] = { .prop = WHEEL_TICK, .access = V2_0::VehiclePropertyAccess::READ, .changeMode = V2_0::VehiclePropertyChangeMode::CONTINUOUS, + .configArray = {ALL_WHEELS, 50000, 50000, 50000, 50000}, .minSampleRate = 1.0f, .maxSampleRate = 100.0f, }, + { + .prop = ABS_ACTIVE, + .access = V2_0::VehiclePropertyAccess::READ, + .changeMode = V2_0::VehiclePropertyChangeMode::ON_CHANGE, + }, + + { + .prop = TRACTION_CONTROL_ACTIVE, + .access = V2_0::VehiclePropertyAccess::READ, + .changeMode = V2_0::VehiclePropertyChangeMode::ON_CHANGE, + }, + { .prop = OBD2_LIVE_FRAME, .access = V2_0::VehiclePropertyAccess::READ, diff --git a/automotive/vehicle/2.1/types.hal b/automotive/vehicle/2.1/types.hal index 54e87edabd..75026b72c6 100644 --- a/automotive/vehicle/2.1/types.hal +++ b/automotive/vehicle/2.1/types.hal @@ -23,12 +23,37 @@ import android.hardware.automotive.vehicle@2.0; */ enum VehicleProperty: @2.0::VehicleProperty { /** - * Reports wheel rotational distance in meters since last wheel tick - * event + * Reports wheel ticks * - * The value is a vector each element represents distance for individual - * wheel in the following order: left front, right front, left rear, - * right rear. VehiclePropValue.timestamp must be correctly filled in. + * The first four elements represent ticks for individual wheels in the + * following order: front left, front right, rear right, rear left. All + * tick counts are cumulative. Tick counts increment when the vehicle + * moves forward, and decrement when vehicles moves in reverse. The ticks + * should be reset to 0 when the vehicle is started by the user. + * + * The next element in the vector is a reset count. A reset indicates + * previous tick counts are not comparable with this and future ones. Some + * sort of discontinuity in tick counting has occurred. + * + * int64Values[0] = reset count + * int64Values[1] = front left ticks + * int64Values[2] = front right ticks + * int64Values[3] = rear right ticks + * int64Values[4] = rear left ticks + * + * configArray is used to indicate the micrometers-per-wheel-tick value as well as + * which wheels are supported. configArray is set as follows: + * + * configArray[0], bits [0:3] = supported wheels. Uses enum Wheel. + * configArray[1] = micrometers per front left wheel tick + * configArray[2] = micrometers per front right wheel tick + * configArray[3] = micrometers per rear right wheel tick + * configArray[4] = micrometers per rear left wheel tick + * + * NOTE: If a wheel is not supported, its value shall always be set to + * LONG_MAX = 9223372036854775807. + * + * VehiclePropValue.timestamp must be correctly filled in. * * Vendors must specify wheels that support this sensor in * VehiclePropConfig.configFlags. The format of this field is a bitset of @@ -36,14 +61,37 @@ enum VehicleProperty: @2.0::VehicleProperty { * * @change_mode VehiclePropertyChangeMode:ON_CHANGE |VehiclePropertyChangeMode:CONTINUOUS * @access VehiclePropertyAccess:READ - * @unit VehicleUnit:METER */ WHEEL_TICK = ( 0x0306 | VehiclePropertyGroup:SYSTEM - | VehiclePropertyType:FLOAT_VEC + | VehiclePropertyType:COMPLEX | VehicleArea:GLOBAL), + /** + * ABS is active. Set to true whenever ABS is activated. Reset to false when ABS is off. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + ABS_ACTIVE = ( + 0x040A + | VehiclePropertyGroup:SYSTEM + | VehiclePropertyType:BOOLEAN + | VehicleArea:GLOBAL), + + /** + * Traction Control is active. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + TRACTION_CONTROL_ACTIVE = ( + 0x040B + | VehiclePropertyGroup:SYSTEM + | VehiclePropertyType:BOOLEAN + | VehicleArea:GLOBAL), + /** * Automatic re-circulation on/off * From 5a76ec53c236d3de8c27fb312bc4bf6d678f49ba Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Mon, 17 Jul 2017 15:41:29 -0700 Subject: [PATCH 063/265] Add DRMO_MODULATION program identifier type. Bug: b/63702941 Test: it builds Change-Id: I3353b232c2e24f7e3c816d4089b2cbf40c4b79ae --- broadcastradio/1.1/types.hal | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/broadcastradio/1.1/types.hal b/broadcastradio/1.1/types.hal index 356c29913d..5b5d4f74a5 100644 --- a/broadcastradio/1.1/types.hal +++ b/broadcastradio/1.1/types.hal @@ -101,6 +101,16 @@ struct Properties { string vendorExension; }; +/** + * Type of modulation. + * + * Used as a value for DRMO_MODULATION IdentifierType. + */ +enum Modulation : uint32_t { + AM = 1, + FM, +}; + /** * Type of a radio technology. * @@ -176,6 +186,7 @@ enum IdentifierType : uint32_t { DAB_FREQUENCY, // kHz DRMO_SERVICE_ID, // 24bit DRMO_FREQUENCY, // kHz + DRMO_MODULATION, // Modulation enum SXM_SERVICE_ID, // 32bit SXM_CHANNEL, // 0-999 range From ba3e254483c18238b25445b48d9d3592d40689a3 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Mon, 17 Jul 2017 13:59:21 -0700 Subject: [PATCH 064/265] Implement out-of-band metadata images. This saves a lot of HIDL bandwidth, by not including raw image data in metadata vector. Bug: b/63702941 Test: VTS Change-Id: I73d5218095e4af34c58da8dcfc520abd4cb46c26 --- broadcastradio/1.0/types.hal | 11 +- .../VtsHalBroadcastradioV1_0TargetTest.cpp | 49 +++++- broadcastradio/1.1/IBroadcastRadio.hal | 19 +++ broadcastradio/1.1/default/BroadcastRadio.cpp | 15 ++ broadcastradio/1.1/default/BroadcastRadio.h | 1 + broadcastradio/1.1/default/Tuner.cpp | 5 +- broadcastradio/1.1/default/VirtualProgram.cpp | 21 +++ broadcastradio/1.1/default/VirtualProgram.h | 3 + broadcastradio/1.1/default/VirtualRadio.cpp | 4 +- broadcastradio/1.1/default/VirtualRadio.h | 2 +- broadcastradio/1.1/default/resources.h | 46 ++++++ .../VtsHalBroadcastradioV1_1TargetTest.cpp | 141 ++++++++++++++---- current.txt | 2 +- 13 files changed, 276 insertions(+), 43 deletions(-) create mode 100644 broadcastradio/1.1/default/resources.h diff --git a/broadcastradio/1.0/types.hal b/broadcastradio/1.0/types.hal index d165e32250..e9ac4b7d30 100644 --- a/broadcastradio/1.0/types.hal +++ b/broadcastradio/1.0/types.hal @@ -146,8 +146,11 @@ enum MetadataType : int32_t { /** String */ TEXT = 1, /** - * Raw binary data (icon or art) - This data must be transparent to the android framework */ + * Raw binary data (icon or art). + * + * The data should be a valid PNG, JPEG, GIF or BMP file. + * Invalid format must be handled gracefully as if the field was missing. + */ RAW = 2, /** clock data, see MetaDataClock */ CLOCK = 3, @@ -173,9 +176,9 @@ enum MetadataKey : int32_t { ALBUM = 7, /** Musical genre - string */ GENRE = 8, - /** Station icon - raw */ + /** Station icon - raw (int32_t for HAL 1.1) */ ICON = 9, - /** Album art - raw */ + /** Album art - raw (int32_t for HAL 1.1) */ ART = 10, /** Clock - MetaDataClock */ CLOCK = 11, diff --git a/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp b/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp index 7241ad4c37..fa0f030d09 100644 --- a/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp +++ b/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp @@ -46,7 +46,8 @@ using ::android::hardware::broadcastradio::V1_0::BandConfig; using ::android::hardware::broadcastradio::V1_0::Direction; using ::android::hardware::broadcastradio::V1_0::ProgramInfo; using ::android::hardware::broadcastradio::V1_0::MetaData; - +using ::android::hardware::broadcastradio::V1_0::MetadataKey; +using ::android::hardware::broadcastradio::V1_0::MetadataType; #define RETURN_IF_SKIPPED \ if (skipped) { \ @@ -648,6 +649,52 @@ TEST_P(BroadcastRadioHidlTest, TuneFailsOutOfBounds) { EXPECT_TRUE(waitForCallback(kTuneCallbacktimeoutNs)); } +/** + * Test proper image format in metadata. + * + * Verifies that: + * - all images in metadata are provided in-band (as a binary blob, not by id) + * + * This is a counter-test for OobImagesOnly from 1.1 VTS. + */ +TEST_P(BroadcastRadioHidlTest, IbImagesOnly) { + RETURN_IF_SKIPPED; + ASSERT_TRUE(openTuner()); + ASSERT_TRUE(checkAntenna()); + + bool firstScan = true; + uint32_t firstChannel, prevChannel; + while (true) { + mCallbackCalled = false; + auto hidlResult = mTuner->scan(Direction::UP, true); + ASSERT_TRUE(hidlResult.isOk()); + if (hidlResult == Result::TIMEOUT) { + ALOGI("Got timeout on scan operation"); + break; + } + ASSERT_EQ(Result::OK, hidlResult); + ASSERT_EQ(true, waitForCallback(kTuneCallbacktimeoutNs)); + + if (firstScan) { + firstScan = false; + firstChannel = mProgramInfoCallbackData.channel; + } else { + // scanned the whole band + if (mProgramInfoCallbackData.channel >= firstChannel && prevChannel <= firstChannel) { + break; + } + } + prevChannel = mProgramInfoCallbackData.channel; + + for (auto&& entry : mProgramInfoCallbackData.metadata) { + if (entry.key != MetadataKey::ICON && entry.key != MetadataKey::ART) continue; + EXPECT_EQ(MetadataType::RAW, entry.type); + EXPECT_EQ(0, entry.intValue); + EXPECT_GT(entry.rawValue.size(), 0u); + } + } +} + INSTANTIATE_TEST_CASE_P( BroadcastRadioHidlTestCases, BroadcastRadioHidlTest, diff --git a/broadcastradio/1.1/IBroadcastRadio.hal b/broadcastradio/1.1/IBroadcastRadio.hal index dd37d4942c..9bde361bdb 100644 --- a/broadcastradio/1.1/IBroadcastRadio.hal +++ b/broadcastradio/1.1/IBroadcastRadio.hal @@ -27,4 +27,23 @@ interface IBroadcastRadio extends @1.0::IBroadcastRadio { */ getProperties_1_1() generates (Properties properties); + /** + * Fetch image from radio module. + * + * This call is meant to make V1_0::MetaData lightweight - instead of + * passing image data blob in MetadataType.RAW field, only identifier is + * passed, so the client may cache images or even not fetch them. + * + * Identifier may be any arbitrary number - sequential, sha256 prefix, + * or any other unique value selected by the vendor. + * + * The data should be a valid PNG, JPEG, GIF or BMP file. + * Invalid format must be handled gracefully as if the image was missing. + * + * @param id Identifier of an image; + * value of 0 is reserved and should be treated as invalid image. + * @return image A binary blob with image data + * or zero-length vector if identifier doesn't exists. + */ + getImage(int32_t id) generates (vec image); }; diff --git a/broadcastradio/1.1/default/BroadcastRadio.cpp b/broadcastradio/1.1/default/BroadcastRadio.cpp index 297dcc1cee..ab3047d39a 100644 --- a/broadcastradio/1.1/default/BroadcastRadio.cpp +++ b/broadcastradio/1.1/default/BroadcastRadio.cpp @@ -20,6 +20,8 @@ #include +#include "resources.h" + namespace android { namespace hardware { namespace broadcastradio { @@ -155,6 +157,19 @@ Return BroadcastRadio::openTuner(const BandConfig& config, bool audio __un return Void(); } +Return BroadcastRadio::getImage(int32_t id, getImage_cb _hidl_cb) { + ALOGV("%s(%x)", __func__, id); + + if (id == resources::demoPngId) { + _hidl_cb(std::vector(resources::demoPng, std::end(resources::demoPng))); + return {}; + } + + ALOGI("Image %x doesn't exists", id); + _hidl_cb({}); + return Void(); +} + } // namespace implementation } // namespace V1_1 } // namespace broadcastradio diff --git a/broadcastradio/1.1/default/BroadcastRadio.h b/broadcastradio/1.1/default/BroadcastRadio.h index d98afa7acb..71e3be8aec 100644 --- a/broadcastradio/1.1/default/BroadcastRadio.h +++ b/broadcastradio/1.1/default/BroadcastRadio.h @@ -63,6 +63,7 @@ struct BroadcastRadio : public V1_1::IBroadcastRadio { Return openTuner(const V1_0::BandConfig& config, bool audio, const sp& callback, openTuner_cb _hidl_cb) override; + Return getImage(int32_t id, getImage_cb _hidl_cb); private: std::mutex mMut; diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index 271f6337ed..0a452088fd 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -52,7 +52,10 @@ const struct { Tuner::Tuner(const sp& callback) : mCallback(callback), mCallback1_1(ITunerCallback::castFrom(callback).withDefault(nullptr)), - mVirtualFm(make_fm_radio()) {} + mVirtualFm(make_fm_radio()) { + // TODO (b/36864090): inject this data in a more elegant way + setCompatibilityLevel(mCallback1_1 == nullptr ? 1 : 2); +} void Tuner::forceClose() { lock_guard lk(mMut); diff --git a/broadcastradio/1.1/default/VirtualProgram.cpp b/broadcastradio/1.1/default/VirtualProgram.cpp index babf0d8b60..1f3b69310b 100644 --- a/broadcastradio/1.1/default/VirtualProgram.cpp +++ b/broadcastradio/1.1/default/VirtualProgram.cpp @@ -17,6 +17,8 @@ #include +#include "resources.h" + namespace android { namespace hardware { namespace broadcastradio { @@ -27,6 +29,23 @@ using V1_0::MetaData; using V1_0::MetadataKey; using V1_0::MetadataType; +// TODO (b/36864090): inject this data in a more elegant way +static int gHalVersion = 2; // 1 = 1.0, 2 = 1.1 + +void setCompatibilityLevel(int halversion) { + gHalVersion = halversion; +} + +static MetaData createDemoBitmap(MetadataKey key) { + MetaData bmp = {MetadataType::INT, key, resources::demoPngId, {}, {}, {}}; + if (gHalVersion < 2) { + bmp.type = MetadataType::RAW; + bmp.intValue = 0; + bmp.rawValue = std::vector(resources::demoPng, std::end(resources::demoPng)); + } + return bmp; +} + VirtualProgram::operator ProgramInfo() const { ProgramInfo info11 = {}; auto& info10 = info11.base; @@ -42,6 +61,8 @@ VirtualProgram::operator ProgramInfo() const { {MetadataType::TEXT, MetadataKey::RDS_PS, {}, {}, programName, {}}, {MetadataType::TEXT, MetadataKey::TITLE, {}, {}, songTitle, {}}, {MetadataType::TEXT, MetadataKey::ARTIST, {}, {}, songArtist, {}}, + createDemoBitmap(MetadataKey::ICON), + createDemoBitmap(MetadataKey::ART), }); return info11; diff --git a/broadcastradio/1.1/default/VirtualProgram.h b/broadcastradio/1.1/default/VirtualProgram.h index a4fd72c32b..2ee21a7064 100644 --- a/broadcastradio/1.1/default/VirtualProgram.h +++ b/broadcastradio/1.1/default/VirtualProgram.h @@ -25,6 +25,9 @@ namespace broadcastradio { namespace V1_1 { namespace implementation { +// TODO (b/36864090): inject this data in a more elegant way +void setCompatibilityLevel(int halversion); + struct VirtualProgram { ProgramSelector selector; diff --git a/broadcastradio/1.1/default/VirtualRadio.cpp b/broadcastradio/1.1/default/VirtualRadio.cpp index acf37a40e7..89b2b0ae2d 100644 --- a/broadcastradio/1.1/default/VirtualRadio.cpp +++ b/broadcastradio/1.1/default/VirtualRadio.cpp @@ -32,7 +32,7 @@ using std::vector; using utils::make_selector; -vector gInitialFmPrograms{ +const vector gInitialFmPrograms{ {make_selector(Band::FM, 94900), "Wild 94.9", "Drake ft. Rihanna", "Too Good"}, {make_selector(Band::FM, 96500), "KOIT", "Celine Dion", "All By Myself"}, {make_selector(Band::FM, 97300), "Alice@97.3", "Drops of Jupiter", "Train"}, @@ -44,7 +44,7 @@ vector gInitialFmPrograms{ VirtualRadio::VirtualRadio(VirtualRadio&& o) : mPrograms(move(o.mPrograms)) {} -VirtualRadio::VirtualRadio(vector initialList) : mPrograms(initialList) {} +VirtualRadio::VirtualRadio(const vector initialList) : mPrograms(initialList) {} vector VirtualRadio::getProgramList() { lock_guard lk(mMut); diff --git a/broadcastradio/1.1/default/VirtualRadio.h b/broadcastradio/1.1/default/VirtualRadio.h index 23cb06c619..4cdc72ffc8 100644 --- a/broadcastradio/1.1/default/VirtualRadio.h +++ b/broadcastradio/1.1/default/VirtualRadio.h @@ -30,7 +30,7 @@ namespace implementation { class VirtualRadio { public: VirtualRadio(VirtualRadio&& o); - VirtualRadio(std::vector initialList); + VirtualRadio(const std::vector initialList); std::vector getProgramList(); bool getProgram(const ProgramSelector& selector, VirtualProgram& program); diff --git a/broadcastradio/1.1/default/resources.h b/broadcastradio/1.1/default/resources.h new file mode 100644 index 0000000000..b7e709f955 --- /dev/null +++ b/broadcastradio/1.1/default/resources.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 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. + */ +#ifndef ANDROID_HARDWARE_BROADCASTRADIO_V1_1_RESOURCES_H +#define ANDROID_HARDWARE_BROADCASTRADIO_V1_1_RESOURCES_H + +namespace android { +namespace hardware { +namespace broadcastradio { +namespace V1_1 { +namespace implementation { +namespace resources { + +constexpr int32_t demoPngId = 123456; +constexpr uint8_t demoPng[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, + 0x52, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x08, 0x02, 0x00, 0x00, 0x00, 0x25, + 0x0b, 0xe6, 0x89, 0x00, 0x00, 0x00, 0x5d, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xed, 0xd9, + 0xc1, 0x09, 0x00, 0x30, 0x08, 0x04, 0xc1, 0x33, 0xfd, 0xf7, 0x6c, 0x6a, 0xc8, 0x23, 0x04, + 0xc9, 0x6c, 0x01, 0xc2, 0x20, 0xbe, 0x4c, 0x86, 0x57, 0x49, 0xba, 0xfb, 0xd6, 0xf4, 0xba, + 0x3e, 0x7f, 0x4d, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x8f, 0x00, 0xbd, 0xce, 0x7f, + 0xc0, 0x11, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xb8, 0x0d, 0x32, 0xd4, 0x0c, 0x77, 0xbd, + 0xfb, 0xc1, 0xce, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82}; + +} // namespace resources +} // namespace implementation +} // namespace V1_1 +} // namespace broadcastradio +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_BROADCASTRADIO_V1_1_RESOURCES_H diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index 9e7c00bc91..d20452bce5 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -54,6 +54,8 @@ using broadcastradio::vts::CallBarrier; using V1_0::BandConfig; using V1_0::Class; using V1_0::MetaData; +using V1_0::MetadataKey; +using V1_0::MetadataType; static constexpr auto kConfigTimeout = 10s; static constexpr auto kConnectModuleTimeout = 1s; @@ -93,6 +95,7 @@ class BroadcastRadioHalTest : public ::testing::VtsHalHidlTargetTestBase, // any stations on the list, so don't pick AM blindly). bool openTuner(unsigned band); const BandConfig& getBand(unsigned idx); + bool getProgramList(std::function& list)> cb); Class radioClass; bool skipped = false; @@ -207,6 +210,47 @@ const BandConfig& BroadcastRadioHalTest::getBand(unsigned idx) { return band; } +bool BroadcastRadioHalTest::getProgramList( + std::function& list)> cb) { + ProgramListResult getListResult = ProgramListResult::NOT_INITIALIZED; + bool isListEmpty = true; + auto getListCb = [&](ProgramListResult result, const hidl_vec& list) { + ALOGD("getListCb(%s, ProgramInfo[%zu])", toString(result).c_str(), list.size()); + getListResult = result; + if (result != ProgramListResult::OK) return; + isListEmpty = (list.size() == 0); + if (!isListEmpty) cb(list); + }; + + // first try... + EXPECT_TIMEOUT_CALL(*mCallback, backgroundScanComplete, ProgramListResult::OK) + .Times(AnyNumber()); + auto hidlResult = mTuner->getProgramList("", getListCb); + EXPECT_TRUE(hidlResult.isOk()); + if (!hidlResult.isOk()) return false; + + if (getListResult == ProgramListResult::NOT_STARTED) { + auto result = mTuner->startBackgroundScan(); + EXPECT_EQ(ProgramListResult::OK, result); + getListResult = ProgramListResult::NOT_READY; // continue as in NOT_READY case + } + if (getListResult == ProgramListResult::NOT_READY) { + EXPECT_TIMEOUT_CALL_WAIT(*mCallback, backgroundScanComplete, kFullScanTimeout); + + // second (last) try... + hidlResult = mTuner->getProgramList("", getListCb); + EXPECT_TRUE(hidlResult.isOk()); + if (!hidlResult.isOk()) return false; + EXPECT_EQ(ProgramListResult::OK, getListResult); + } + + if (isListEmpty) { + printSkipped("Program list is empty."); + return false; + } + return true; +} + /** * Test IBroadcastRadio::openTuner() method called twice. * @@ -242,41 +286,11 @@ TEST_P(BroadcastRadioHalTest, TuneFromProgramList) { ASSERT_TRUE(openTuner(0)); ProgramInfo firstProgram; - bool isListEmpty; - ProgramListResult getListResult = ProgramListResult::NOT_INITIALIZED; - auto getListCb = [&](ProgramListResult result, const hidl_vec& list) { - ALOGD("getListCb(%s, ProgramInfo[%zu])", toString(result).c_str(), list.size()); - getListResult = result; - if (result != ProgramListResult::OK) return; - isListEmpty = (list.size() == 0); + auto getCb = [&](const hidl_vec& list) { // don't copy the whole list out, it might be heavy - if (!isListEmpty) firstProgram = list[0]; + firstProgram = list[0]; }; - - // first try... - EXPECT_TIMEOUT_CALL(*mCallback, backgroundScanComplete, ProgramListResult::OK) - .Times(AnyNumber()); - auto hidlResult = mTuner->getProgramList("", getListCb); - ASSERT_TRUE(hidlResult.isOk()); - - if (getListResult == ProgramListResult::NOT_STARTED) { - auto result = mTuner->startBackgroundScan(); - ASSERT_EQ(ProgramListResult::OK, result); - getListResult = ProgramListResult::NOT_READY; // continue as in NOT_READY case - } - if (getListResult == ProgramListResult::NOT_READY) { - EXPECT_TIMEOUT_CALL_WAIT(*mCallback, backgroundScanComplete, kFullScanTimeout); - - // second (last) try... - hidlResult = mTuner->getProgramList("", getListCb); - ASSERT_TRUE(hidlResult.isOk()); - ASSERT_EQ(ProgramListResult::OK, getListResult); - } - - if (isListEmpty) { - printSkipped("Program list is empty."); - return; - } + if (!getProgramList(getCb)) return; ProgramSelector selCb; EXPECT_CALL(*mCallback, tuneComplete(_, _)); @@ -296,6 +310,67 @@ TEST_P(BroadcastRadioHalTest, CancelAnnouncement) { EXPECT_EQ(Result::OK, hidlResult); } +/** + * Test getImage call with invalid image ID. + * + * Verifies that: + * - getImage call handles argument 0 gracefully + */ +TEST_P(BroadcastRadioHalTest, GetNoImage) { + if (skipped) return; + + size_t len = 0; + auto hidlResult = + mRadioModule->getImage(0, [&](hidl_vec rawImage) { len = rawImage.size(); }); + + ASSERT_TRUE(hidlResult.isOk()); + ASSERT_EQ(0u, len); +} + +/** + * Test proper image format in metadata. + * + * Verifies that: + * - all images in metadata are provided out-of-band (by id, not as a binary blob) + * - images are available for getImage call + */ +TEST_P(BroadcastRadioHalTest, OobImagesOnly) { + if (skipped) return; + ASSERT_TRUE(openTuner(0)); + + std::vector imageIds; + + ProgramInfo firstProgram; + auto getCb = [&](const hidl_vec& list) { + for (auto&& program : list) { + for (auto&& entry : program.base.metadata) { + EXPECT_NE(MetadataType::RAW, entry.type); + if (entry.key != MetadataKey::ICON && entry.key != MetadataKey::ART) continue; + EXPECT_NE(0, entry.intValue); + EXPECT_EQ(0u, entry.rawValue.size()); + if (entry.intValue != 0) imageIds.push_back(entry.intValue); + } + } + }; + if (!getProgramList(getCb)) return; + + if (imageIds.size() == 0) { + printSkipped("No images found"); + return; + } + + for (auto id : imageIds) { + ALOGD("Checking image %d", id); + + size_t len = 0; + auto hidlResult = + mRadioModule->getImage(id, [&](hidl_vec rawImage) { len = rawImage.size(); }); + + ASSERT_TRUE(hidlResult.isOk()); + ASSERT_GT(len, 0u); + } +} + INSTANTIATE_TEST_CASE_P(BroadcastRadioHalTestCases, BroadcastRadioHalTest, ::testing::Values(Class::AM_FM, Class::SAT, Class::DT)); diff --git a/current.txt b/current.txt index e85920fa76..a0cf6162c1 100644 --- a/current.txt +++ b/current.txt @@ -189,7 +189,7 @@ fe3c3c2f572b72f15f8594c538b0577bd5c28722c31879cfe6231330cddb6747 android.hardwar # ABI preserving changes to HALs released in Android O -8a4082dbc7f5eef585dca841b2656ba62d6c7e10e25dd05507ead15d96224f4c android.hardware.broadcastradio@1.0::types +150a338ce11fcec70757c9675d83cf6a5d7b40d0c812741b91671fecce59eac9 android.hardware.broadcastradio@1.0::types 760485232f6cce07f8bb05e3475509956996b702f77415ee5bff05e2ec5a5bcc android.hardware.dumpstate@1.0::IDumpstateDevice 1fecfa1609ff9d27ebf761a84b4336efa9d5dac5b241f19a6663f70d8db2c4b1 android.hardware.radio@1.0::IRadioResponse 28e929b453df3d9f5060af2764e6cdb123ddb893e3e86923c877f6ff7e5f02c9 android.hardware.wifi@1.0::types From 5ca56431d4878575e71b691c9541179ec08ca66a Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Wed, 19 Jul 2017 14:48:02 -0700 Subject: [PATCH 065/265] Rename vendorExtension fields to vendorInfo. Bug: b/63634552 Test: instrumentation Change-Id: Ifeb41ace8d4f4df093c925883c07ea86f0d9b5d7 --- broadcastradio/1.1/default/BroadcastRadio.cpp | 2 +- broadcastradio/1.1/types.hal | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/broadcastradio/1.1/default/BroadcastRadio.cpp b/broadcastradio/1.1/default/BroadcastRadio.cpp index ab3047d39a..7916407bdf 100644 --- a/broadcastradio/1.1/default/BroadcastRadio.cpp +++ b/broadcastradio/1.1/default/BroadcastRadio.cpp @@ -101,7 +101,7 @@ Return BroadcastRadio::getProperties_1_1(getProperties_1_1_cb _hidl_cb) { static_cast(IdentifierType::HD_STATION_ID_EXT), static_cast(IdentifierType::HD_SUBCHANNEL), }); - prop11.vendorExension = "dummy"; + prop11.vendorInfo = "dummy"; prop10.bands.resize(mConfig.amFmBands.size()); for (size_t i = 0; i < mConfig.amFmBands.size(); i++) { diff --git a/broadcastradio/1.1/types.hal b/broadcastradio/1.1/types.hal index 5b5d4f74a5..4034d8b963 100644 --- a/broadcastradio/1.1/types.hal +++ b/broadcastradio/1.1/types.hal @@ -98,7 +98,7 @@ struct Properties { * Front-end application MUST verify vendor/product name from the * @1.0::Properties struct before doing any interpretation of this value. */ - string vendorExension; + string vendorInfo; }; /** @@ -285,5 +285,5 @@ struct ProgramInfo { * Front-end application MUST verify vendor/product name from the * @1.0::Properties struct before doing any interpretation of this value. */ - string vendorExension; + string vendorInfo; }; From f26f9266c3dfdc57e58cec81b350e575e593a604 Mon Sep 17 00:00:00 2001 From: Etan Cohen Date: Mon, 17 Jul 2017 16:43:29 -0700 Subject: [PATCH 066/265] [HAL] Invalidate chip before shutting down legacy HAL Change the order of shutdown to invalidate chips before shutting down the legacy HAL. Allows pre-shutdown commands to be sent down. Bug: 63704506 Test: NAN tests passing Test: full regression suite Change-Id: I03d237d732b4e3482b1e1639848342dfdde9fcb7 --- wifi/1.1/default/wifi.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/wifi/1.1/default/wifi.cpp b/wifi/1.1/default/wifi.cpp index 4ed1f555e2..fe4f642302 100644 --- a/wifi/1.1/default/wifi.cpp +++ b/wifi/1.1/default/wifi.cpp @@ -126,6 +126,12 @@ WifiStatus Wifi::stopInternal() { return createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE, "HAL is stopping"); } + // Clear the chip object and its child objects since the HAL is now + // stopped. + if (chip_.get()) { + chip_->invalidate(); + chip_.clear(); + } WifiStatus wifi_status = stopLegacyHalAndDeinitializeModeController(); if (wifi_status.code == WifiStatusCode::SUCCESS) { for (const auto& callback : event_cb_handler_.getCallbacks()) { @@ -140,12 +146,6 @@ WifiStatus Wifi::stopInternal() { } } } - // Clear the chip object and its child objects since the HAL is now - // stopped. - if (chip_.get()) { - chip_->invalidate(); - chip_.clear(); - } LOG(INFO) << "Wifi HAL stopped"; return wifi_status; } From 60012203d3ecdfa0040c36b08f1467827b8fc40d Mon Sep 17 00:00:00 2001 From: Kevin Rocard Date: Tue, 18 Jul 2017 12:29:39 -0700 Subject: [PATCH 067/265] Audio VTS: Change test utility from dyn to static lib Bug: 63801053 In order to avoid having to instruct vts-tradefed to push the test utility library on the target before runing the audio VTS, duplicating the makefile declaration, make the library static. Test: make vts Test: vts-tradefed run commandAndExit vts --module VtsHalAudioV2_0Target Change-Id: I7a98b2aaf0e0f6f91a92b7f01df1c630540ad697 Merged-In: I7a98b2aaf0e0f6f91a92b7f01df1c630540ad697 (cherry picked from commit 921d12ea6d212e97a7bce124850ec914eebaa02d) Signed-off-by: Kevin Rocard --- audio/effect/2.0/vts/functional/Android.bp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/audio/effect/2.0/vts/functional/Android.bp b/audio/effect/2.0/vts/functional/Android.bp index b3002a4c90..15f1e645c7 100644 --- a/audio/effect/2.0/vts/functional/Android.bp +++ b/audio/effect/2.0/vts/functional/Android.bp @@ -29,12 +29,14 @@ cc_test { "libutils", "libxml2", "android.hardware.audio.common@2.0", - "android.hardware.audio.common.test.utility", "android.hardware.audio.effect@2.0", "android.hidl.allocator@1.0", "android.hidl.memory@1.0", ], - static_libs: ["VtsHalHidlTargetTestBase"], + static_libs: [ + "VtsHalHidlTargetTestBase", + "android.hardware.audio.common.test.utility", + ], cflags: [ "-O0", "-g", From 1d047a75395b8381b53c85fa401f8b223cb8116c Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Thu, 20 Jul 2017 14:38:50 -0700 Subject: [PATCH 068/265] wifi: Add owners Change-Id: If5a9a7da36b86f968bd32768d61e5d181573d30a --- wifi/1.1/default/OWNERS | 2 ++ wifi/1.1/vts/functional/OWNERS | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 wifi/1.1/default/OWNERS create mode 100644 wifi/1.1/vts/functional/OWNERS diff --git a/wifi/1.1/default/OWNERS b/wifi/1.1/default/OWNERS new file mode 100644 index 0000000000..2878acc7fd --- /dev/null +++ b/wifi/1.1/default/OWNERS @@ -0,0 +1,2 @@ +rpius@google.com +quiche@google.com diff --git a/wifi/1.1/vts/functional/OWNERS b/wifi/1.1/vts/functional/OWNERS new file mode 100644 index 0000000000..2878acc7fd --- /dev/null +++ b/wifi/1.1/vts/functional/OWNERS @@ -0,0 +1,2 @@ +rpius@google.com +quiche@google.com From a9b6e41e3422a94302fdf43e122c81952e2b4277 Mon Sep 17 00:00:00 2001 From: Kevin Rocard Date: Tue, 18 Jul 2017 12:29:39 -0700 Subject: [PATCH 069/265] Audio VTS: Change test utility from dyn to static lib Bug: 63801053 In order to avoid having to instruct vts-tradefed to push the test utility library on the target before runing the audio VTS, duplicating the makefile declaration, make the library static. This patch is a fix of the automatic merge. The upstream branch had less project using the utility lib. Test: make vts Test: vts-tradefed run commandAndExit vts --module VtsHalAudioV2_0Target Change-Id: I7a98b2aaf0e0f6f91a92b7f01df1c630540ad697 Merged-In: I7a98b2aaf0e0f6f91a92b7f01df1c630540ad697 (cherry picked from commit 921d12ea6d212e97a7bce124850ec914eebaa02d) Signed-off-by: Kevin Rocard --- audio/effect/2.0/vts/functional/Android.bp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/audio/effect/2.0/vts/functional/Android.bp b/audio/effect/2.0/vts/functional/Android.bp index b3002a4c90..15f1e645c7 100644 --- a/audio/effect/2.0/vts/functional/Android.bp +++ b/audio/effect/2.0/vts/functional/Android.bp @@ -29,12 +29,14 @@ cc_test { "libutils", "libxml2", "android.hardware.audio.common@2.0", - "android.hardware.audio.common.test.utility", "android.hardware.audio.effect@2.0", "android.hidl.allocator@1.0", "android.hidl.memory@1.0", ], - static_libs: ["VtsHalHidlTargetTestBase"], + static_libs: [ + "VtsHalHidlTargetTestBase", + "android.hardware.audio.common.test.utility", + ], cflags: [ "-O0", "-g", From e8d8c03e9a82767bb6bb0c3554f1de9264231c62 Mon Sep 17 00:00:00 2001 From: Asaf Rosenfeld Date: Tue, 18 Jul 2017 11:00:29 -0700 Subject: [PATCH 070/265] Add publisher ID to DATA messages VMS Core routing needs the publisher ID in order to route correctly. Test: all tests pass + adding tests for new use cases bug: 63933446 Change-Id: I3acd2a3efebdedbf9d65af18d70928380e9b44d1 --- automotive/vehicle/2.1/Android.mk | 38 +++++++++++++++++++++++++++++++ automotive/vehicle/2.1/types.hal | 11 ++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/automotive/vehicle/2.1/Android.mk b/automotive/vehicle/2.1/Android.mk index 8e1c0dd321..095a1c7e44 100644 --- a/automotive/vehicle/2.1/Android.mk +++ b/automotive/vehicle/2.1/Android.mk @@ -226,6 +226,25 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) +# +# Build types.hal (VmsDataMessageIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsDataMessageIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsDataMessageIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + # # Build types.hal (VmsMessageType) # @@ -547,6 +566,25 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) +# +# Build types.hal (VmsDataMessageIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsDataMessageIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsDataMessageIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + # # Build types.hal (VmsMessageType) # diff --git a/automotive/vehicle/2.1/types.hal b/automotive/vehicle/2.1/types.hal index 75026b72c6..d85ef433c2 100644 --- a/automotive/vehicle/2.1/types.hal +++ b/automotive/vehicle/2.1/types.hal @@ -681,7 +681,7 @@ enum VmsBaseMessageIntegerValuesIndex : int32_t { }; /* - * This enum provides the canonical mapping for VMS SUBMIT, UNSUBMIT and DATA + * This enum provides the canonical mapping for VMS SUBMIT and UNSUBMIT * messages integer value properties. */ enum VmsSimpleMessageIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { @@ -695,6 +695,15 @@ enum VmsSimpleMessageIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { VMS_LAYER_SUB_TYPE = 3, }; +/* + * This enum provides the canonical mapping for VMS DATA + * message integer value properties. + */ +enum VmsDataMessageIntegerValuesIndex : VmsSimpleMessageIntegerValuesIndex { + /* A publisher ID of the client that published this message. */ + VMS_PUBLISHER_ID = 4, +}; + /* * This enum provides the canonical mapping for VMS offering messages integer * value properties From 3b740fa6890be4c17e1b3fa9914152e020de54e5 Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Tue, 25 Jul 2017 15:05:11 +0100 Subject: [PATCH 071/265] Camera: Don't enforce result metadata queue support Some provider implementations could still be using direct transfer of the result metadata through hw binder. Bug: 63970723 Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --skip-preconditions --module VtsHalCameraProviderV2_4Target -l INFO Change-Id: Ib2adaff005af77385767a32c1ed069371a6e9b7a --- .../2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index 1eea6402ce..5ece765d99 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -2652,7 +2652,6 @@ TEST_F(CameraHidlTest, processCaptureRequestPreview) { } }); ASSERT_TRUE(resultQueueRet.isOk()); - ASSERT_NE(nullptr, resultQueue); InFlightRequest inflightReq = {1, false, supportsPartialResults, partialResultCount, resultQueue}; @@ -2900,7 +2899,6 @@ TEST_F(CameraHidlTest, flushPreviewRequest) { } }); ASSERT_TRUE(resultQueueRet.isOk()); - ASSERT_NE(nullptr, resultQueue); InFlightRequest inflightReq = {1, false, supportsPartialResults, partialResultCount, resultQueue}; From ada97632a89222e8ee5cb720faac93e82b5b94e0 Mon Sep 17 00:00:00 2001 From: Enrico Granata Date: Mon, 24 Jul 2017 18:19:05 -0700 Subject: [PATCH 072/265] Remove unnecessary whitespace from enum members in OBD2 properties Test: build Bug: 64024685 Change-Id: I205aa80e0f1f9ed8e3b78e993f87dae69b883b3a --- automotive/vehicle/2.1/types.hal | 130 ------------------------------- 1 file changed, 130 deletions(-) diff --git a/automotive/vehicle/2.1/types.hal b/automotive/vehicle/2.1/types.hal index d85ef433c2..cea7f1bfc7 100644 --- a/automotive/vehicle/2.1/types.hal +++ b/automotive/vehicle/2.1/types.hal @@ -263,20 +263,15 @@ enum VehicleProperty: @2.0::VehicleProperty { /** The status of a fuel system as described by the OBD2 specification. */ enum FuelSystemStatus : int32_t { OPEN_INSUFFICIENT_ENGINE_TEMPERATURE = 1, - CLOSED_LOOP = 2, - OPEN_ENGINE_LOAD_OR_DECELERATION = 4, - OPEN_SYSTEM_FAILURE = 8, - CLOSED_LOOP_BUT_FEEDBACK_FAULT = 16, }; /** Defines which ignition monitors are available to be read. */ enum IgnitionMonitorKind : int32_t { SPARK = 0, - COMPRESSION = 1, }; @@ -342,61 +337,35 @@ enum CompressionIgnitionMonitors : CommonIgnitionMonitors { enum SecondaryAirStatus : int32_t { UPSTREAM = 1, - DOWNSTREAM_OF_CATALYCIC_CONVERTER = 2, - FROM_OUTSIDE_OR_OFF = 4, - PUMP_ON_FOR_DIAGNOSTICS = 8, }; enum FuelType : int32_t { NOT_AVAILABLE = 0, - GASOLINE = 1, - METHANOL = 2, - ETHANOL = 3, - DIESEL = 4, - LPG = 5, - CNG = 6, - PROPANE = 7, - ELECTRIC = 8, - BIFUEL_RUNNING_GASOLINE = 9, - BIFUEL_RUNNING_METHANOL = 10, - BIFUEL_RUNNING_ETHANOL = 11, - BIFUEL_RUNNING_LPG = 12, - BIFUEL_RUNNING_CNG = 13, - BIFUEL_RUNNING_PROPANE = 14, - BIFUEL_RUNNING_ELECTRIC = 15, - BIFUEL_RUNNING_ELECTRIC_AND_COMBUSTION = 16, - HYBRID_GASOLINE = 17, - HYBRID_ETHANOL = 18, - HYBRID_DIESEL = 19, - HYBRID_ELECTRIC = 20, - HYBRID_RUNNING_ELECTRIC_AND_COMBUSTION = 21, - HYBRID_REGENERATIVE = 22, - BIFUEL_RUNNING_DIESEL = 23, }; @@ -410,7 +379,6 @@ enum FuelType : int32_t { enum Obd2IntegerSensorIndex : int32_t { /** refer to FuelSystemStatus for a description of this value. */ FUEL_SYSTEM_STATUS = 0, - MALFUNCTION_INDICATOR_LIGHT_ON = 1, /** refer to IgnitionMonitorKind for a description of this value. */ @@ -423,65 +391,38 @@ enum Obd2IntegerSensorIndex : int32_t { * CompressionIgnitionMonitors depending on the value of IGNITION_MONITORS_SUPPORTED. */ IGNITION_SPECIFIC_MONITORS = 3, - INTAKE_AIR_TEMPERATURE = 4, /** refer to SecondaryAirStatus for a description of this value. */ COMMANDED_SECONDARY_AIR_STATUS = 5, - NUM_OXYGEN_SENSORS_PRESENT = 6, - RUNTIME_SINCE_ENGINE_START = 7, - DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON = 8, - WARMUPS_SINCE_CODES_CLEARED = 9, - DISTANCE_TRAVELED_SINCE_CODES_CLEARED = 10, - ABSOLUTE_BAROMETRIC_PRESSURE = 11, - CONTROL_MODULE_VOLTAGE = 12, - AMBIENT_AIR_TEMPERATURE = 13, - TIME_WITH_MALFUNCTION_LIGHT_ON = 14, - TIME_SINCE_TROUBLE_CODES_CLEARED = 15, - MAX_FUEL_AIR_EQUIVALENCE_RATIO = 16, - MAX_OXYGEN_SENSOR_VOLTAGE = 17, - MAX_OXYGEN_SENSOR_CURRENT = 18, - MAX_INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 19, - MAX_AIR_FLOW_RATE_FROM_MASS_AIR_FLOW_SENSOR = 20, /** refer to FuelType for a description of this value. */ FUEL_TYPE = 21, - FUEL_RAIL_ABSOLUTE_PRESSURE = 22, - ENGINE_OIL_TEMPERATURE = 23, - DRIVER_DEMAND_PERCENT_TORQUE = 24, - ENGINE_ACTUAL_PERCENT_TORQUE = 25, - ENGINE_REFERENCE_PERCENT_TORQUE = 26, - ENGINE_PERCENT_TORQUE_DATA_IDLE = 27, - ENGINE_PERCENT_TORQUE_DATA_POINT1 = 28, - ENGINE_PERCENT_TORQUE_DATA_POINT2 = 29, - ENGINE_PERCENT_TORQUE_DATA_POINT3 = 30, - ENGINE_PERCENT_TORQUE_DATA_POINT4 = 31, - LAST_SYSTEM_INDEX = ENGINE_PERCENT_TORQUE_DATA_POINT4, }; @@ -492,147 +433,76 @@ enum Obd2IntegerSensorIndex : int32_t { */ enum Obd2FloatSensorIndex : int32_t { CALCULATED_ENGINE_LOAD = 0, - ENGINE_COOLANT_TEMPERATURE = 1, - SHORT_TERM_FUEL_TRIM_BANK1 = 2, - LONG_TERM_FUEL_TRIM_BANK1 = 3, - SHORT_TERM_FUEL_TRIM_BANK2 = 4, - LONG_TERM_FUEL_TRIM_BANK2 = 5, - FUEL_PRESSURE = 6, - INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 7, - ENGINE_RPM = 8, - VEHICLE_SPEED = 9, - TIMING_ADVANCE = 10, - MAF_AIR_FLOW_RATE = 11, - THROTTLE_POSITION = 12, - OXYGEN_SENSOR1_VOLTAGE = 13, - OXYGEN_SENSOR1_SHORT_TERM_FUEL_TRIM = 14, - OXYGEN_SENSOR1_FUEL_AIR_EQUIVALENCE_RATIO = 15, - OXYGEN_SENSOR2_VOLTAGE = 16, - OXYGEN_SENSOR2_SHORT_TERM_FUEL_TRIM = 17, - OXYGEN_SENSOR2_FUEL_AIR_EQUIVALENCE_RATIO = 18, - OXYGEN_SENSOR3_VOLTAGE = 19, - OXYGEN_SENSOR3_SHORT_TERM_FUEL_TRIM = 20, - OXYGEN_SENSOR3_FUEL_AIR_EQUIVALENCE_RATIO = 21, - OXYGEN_SENSOR4_VOLTAGE = 22, - OXYGEN_SENSOR4_SHORT_TERM_FUEL_TRIM = 23, - OXYGEN_SENSOR4_FUEL_AIR_EQUIVALENCE_RATIO = 24, - OXYGEN_SENSOR5_VOLTAGE = 25, - OXYGEN_SENSOR5_SHORT_TERM_FUEL_TRIM = 26, - OXYGEN_SENSOR5_FUEL_AIR_EQUIVALENCE_RATIO = 27, - OXYGEN_SENSOR6_VOLTAGE = 28, - OXYGEN_SENSOR6_SHORT_TERM_FUEL_TRIM = 29, - OXYGEN_SENSOR6_FUEL_AIR_EQUIVALENCE_RATIO = 30, - OXYGEN_SENSOR7_VOLTAGE = 31, - OXYGEN_SENSOR7_SHORT_TERM_FUEL_TRIM = 32, - OXYGEN_SENSOR7_FUEL_AIR_EQUIVALENCE_RATIO = 33, - OXYGEN_SENSOR8_VOLTAGE = 34, - OXYGEN_SENSOR8_SHORT_TERM_FUEL_TRIM = 35, - OXYGEN_SENSOR8_FUEL_AIR_EQUIVALENCE_RATIO = 36, - FUEL_RAIL_PRESSURE = 37, - FUEL_RAIL_GAUGE_PRESSURE = 38, - COMMANDED_EXHAUST_GAS_RECIRCULATION = 39, - EXHAUST_GAS_RECIRCULATION_ERROR = 40, - COMMANDED_EVAPORATIVE_PURGE = 41, - FUEL_TANK_LEVEL_INPUT = 42, - EVAPORATION_SYSTEM_VAPOR_PRESSURE = 43, - CATALYST_TEMPERATURE_BANK1_SENSOR1 = 44, - CATALYST_TEMPERATURE_BANK2_SENSOR1 = 45, - CATALYST_TEMPERATURE_BANK1_SENSOR2 = 46, - CATALYST_TEMPERATURE_BANK2_SENSOR2 = 47, - ABSOLUTE_LOAD_VALUE = 48, - FUEL_AIR_COMMANDED_EQUIVALENCE_RATIO = 49, - RELATIVE_THROTTLE_POSITION = 50, - ABSOLUTE_THROTTLE_POSITION_B = 51, - ABSOLUTE_THROTTLE_POSITION_C = 52, - ACCELERATOR_PEDAL_POSITION_D = 53, - ACCELERATOR_PEDAL_POSITION_E = 54, - ACCELERATOR_PEDAL_POSITION_F = 55, - COMMANDED_THROTTLE_ACTUATOR = 56, - ETHANOL_FUEL_PERCENTAGE = 57, - ABSOLUTE_EVAPORATION_SYSTEM_VAPOR_PRESSURE = 58, - SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK1 = 59, - SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK2 = 60, - SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK3 = 61, - SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK4 = 62, - LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK1 = 63, - LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK2 = 64, - LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK3 = 65, - LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK4 = 66, - RELATIVE_ACCELERATOR_PEDAL_POSITION = 67, - HYBRID_BATTERY_PACK_REMAINING_LIFE = 68, - FUEL_INJECTION_TIMING = 69, - ENGINE_FUEL_RATE = 70, - LAST_SYSTEM_INDEX = ENGINE_FUEL_RATE, }; From 5aa4b5d23269ba5c93218812e9aab5e0270652d6 Mon Sep 17 00:00:00 2001 From: Enrico Granata Date: Tue, 25 Jul 2017 17:20:53 -0700 Subject: [PATCH 073/265] Rename the enums that are supposed to match OBD2 values to have an Obd2 prefix Rename the enums that contain a list of sensors and don't directly map to OBD2 to have a Diagnostic prefix Test: clean build and flash, then runtest -x packages/services/Car/tests/android_car_api_test/src/android/car/apitest/CarDiagnosticManagerTest.java runtest -x packages/services/Car/tests/carservice_test/src/com/android/car/test/CarDiagnosticManagerTest.java runtest -x packages/services/Car/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/Obd2FreezeFrameTest.java runtest -x packages/services/Car/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/Obd2LiveFrameTest.java Bug: 64024685 Change-Id: I9147bcd8f2972dee9f3d1e62f8978b595d88f606 --- automotive/vehicle/2.1/Android.mk | 108 +++++++++--------- .../include/vhal_v2_1/Obd2SensorStore.h | 4 +- .../default/common/src/Obd2SensorStore.cpp | 11 +- .../impl/vhal_v2_1/EmulatedVehicleHal.cpp | 85 +++++++------- automotive/vehicle/2.1/types.hal | 22 ++-- 5 files changed, 118 insertions(+), 112 deletions(-) diff --git a/automotive/vehicle/2.1/Android.mk b/automotive/vehicle/2.1/Android.mk index 095a1c7e44..2dfbefc164 100644 --- a/automotive/vehicle/2.1/Android.mk +++ b/automotive/vehicle/2.1/Android.mk @@ -18,9 +18,9 @@ LOCAL_JAVA_LIBRARIES := \ # -# Build types.hal (CommonIgnitionMonitors) +# Build types.hal (DiagnosticFloatSensorIndex) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/CommonIgnitionMonitors.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/DiagnosticFloatSensorIndex.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -30,16 +30,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.CommonIgnitionMonitors + android.hardware.automotive.vehicle@2.1::types.DiagnosticFloatSensorIndex $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (CompressionIgnitionMonitors) +# Build types.hal (DiagnosticIntegerSensorIndex) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/CompressionIgnitionMonitors.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/DiagnosticIntegerSensorIndex.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -49,16 +49,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.CompressionIgnitionMonitors + android.hardware.automotive.vehicle@2.1::types.DiagnosticIntegerSensorIndex $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (FuelSystemStatus) +# Build types.hal (Obd2CommonIgnitionMonitors) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/FuelSystemStatus.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2CommonIgnitionMonitors.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -68,16 +68,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.FuelSystemStatus + android.hardware.automotive.vehicle@2.1::types.Obd2CommonIgnitionMonitors $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (FuelType) +# Build types.hal (Obd2CompressionIgnitionMonitors) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/FuelType.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2CompressionIgnitionMonitors.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -87,16 +87,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.FuelType + android.hardware.automotive.vehicle@2.1::types.Obd2CompressionIgnitionMonitors $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (IgnitionMonitorKind) +# Build types.hal (Obd2FuelSystemStatus) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/IgnitionMonitorKind.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2FuelSystemStatus.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -106,16 +106,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.IgnitionMonitorKind + android.hardware.automotive.vehicle@2.1::types.Obd2FuelSystemStatus $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (Obd2FloatSensorIndex) +# Build types.hal (Obd2FuelType) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2FloatSensorIndex.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2FuelType.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -125,16 +125,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2FloatSensorIndex + android.hardware.automotive.vehicle@2.1::types.Obd2FuelType $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (Obd2IntegerSensorIndex) +# Build types.hal (Obd2IgnitionMonitorKind) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2IntegerSensorIndex.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2IgnitionMonitorKind.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -144,16 +144,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2IntegerSensorIndex + android.hardware.automotive.vehicle@2.1::types.Obd2IgnitionMonitorKind $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (SecondaryAirStatus) +# Build types.hal (Obd2SecondaryAirStatus) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/SecondaryAirStatus.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2SecondaryAirStatus.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -163,16 +163,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.SecondaryAirStatus + android.hardware.automotive.vehicle@2.1::types.Obd2SecondaryAirStatus $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (SparkIgnitionMonitors) +# Build types.hal (Obd2SparkIgnitionMonitors) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/SparkIgnitionMonitors.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2SparkIgnitionMonitors.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -182,7 +182,7 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.SparkIgnitionMonitors + android.hardware.automotive.vehicle@2.1::types.Obd2SparkIgnitionMonitors $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) @@ -358,9 +358,9 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ # -# Build types.hal (CommonIgnitionMonitors) +# Build types.hal (DiagnosticFloatSensorIndex) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/CommonIgnitionMonitors.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/DiagnosticFloatSensorIndex.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -370,16 +370,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.CommonIgnitionMonitors + android.hardware.automotive.vehicle@2.1::types.DiagnosticFloatSensorIndex $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (CompressionIgnitionMonitors) +# Build types.hal (DiagnosticIntegerSensorIndex) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/CompressionIgnitionMonitors.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/DiagnosticIntegerSensorIndex.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -389,16 +389,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.CompressionIgnitionMonitors + android.hardware.automotive.vehicle@2.1::types.DiagnosticIntegerSensorIndex $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (FuelSystemStatus) +# Build types.hal (Obd2CommonIgnitionMonitors) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/FuelSystemStatus.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2CommonIgnitionMonitors.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -408,16 +408,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.FuelSystemStatus + android.hardware.automotive.vehicle@2.1::types.Obd2CommonIgnitionMonitors $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (FuelType) +# Build types.hal (Obd2CompressionIgnitionMonitors) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/FuelType.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2CompressionIgnitionMonitors.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -427,16 +427,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.FuelType + android.hardware.automotive.vehicle@2.1::types.Obd2CompressionIgnitionMonitors $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (IgnitionMonitorKind) +# Build types.hal (Obd2FuelSystemStatus) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/IgnitionMonitorKind.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2FuelSystemStatus.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -446,16 +446,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.IgnitionMonitorKind + android.hardware.automotive.vehicle@2.1::types.Obd2FuelSystemStatus $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (Obd2FloatSensorIndex) +# Build types.hal (Obd2FuelType) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2FloatSensorIndex.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2FuelType.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -465,16 +465,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2FloatSensorIndex + android.hardware.automotive.vehicle@2.1::types.Obd2FuelType $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (Obd2IntegerSensorIndex) +# Build types.hal (Obd2IgnitionMonitorKind) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2IntegerSensorIndex.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2IgnitionMonitorKind.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -484,16 +484,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2IntegerSensorIndex + android.hardware.automotive.vehicle@2.1::types.Obd2IgnitionMonitorKind $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (SecondaryAirStatus) +# Build types.hal (Obd2SecondaryAirStatus) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/SecondaryAirStatus.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2SecondaryAirStatus.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -503,16 +503,16 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.SecondaryAirStatus + android.hardware.automotive.vehicle@2.1::types.Obd2SecondaryAirStatus $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (SparkIgnitionMonitors) +# Build types.hal (Obd2SparkIgnitionMonitors) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/SparkIgnitionMonitors.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2SparkIgnitionMonitors.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -522,7 +522,7 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.SparkIgnitionMonitors + android.hardware.automotive.vehicle@2.1::types.Obd2SparkIgnitionMonitors $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) diff --git a/automotive/vehicle/2.1/default/common/include/vhal_v2_1/Obd2SensorStore.h b/automotive/vehicle/2.1/default/common/include/vhal_v2_1/Obd2SensorStore.h index 6c44626d12..8000695543 100644 --- a/automotive/vehicle/2.1/default/common/include/vhal_v2_1/Obd2SensorStore.h +++ b/automotive/vehicle/2.1/default/common/include/vhal_v2_1/Obd2SensorStore.h @@ -38,12 +38,12 @@ public: size_t numVendorFloatSensors); // Stores an integer-valued sensor. - V2_0::StatusCode setIntegerSensor(Obd2IntegerSensorIndex index, int32_t value); + V2_0::StatusCode setIntegerSensor(DiagnosticIntegerSensorIndex index, int32_t value); // Stores an integer-valued sensor. V2_0::StatusCode setIntegerSensor(size_t index, int32_t value); // Stores a float-valued sensor. - V2_0::StatusCode setFloatSensor(Obd2FloatSensorIndex index, float value); + V2_0::StatusCode setFloatSensor(DiagnosticFloatSensorIndex index, float value); // Stores a float-valued sensor. V2_0::StatusCode setFloatSensor(size_t index, float value); diff --git a/automotive/vehicle/2.1/default/common/src/Obd2SensorStore.cpp b/automotive/vehicle/2.1/default/common/src/Obd2SensorStore.cpp index f4c63a9544..8705e00b4c 100644 --- a/automotive/vehicle/2.1/default/common/src/Obd2SensorStore.cpp +++ b/automotive/vehicle/2.1/default/common/src/Obd2SensorStore.cpp @@ -56,9 +56,12 @@ const std::vector& Obd2SensorStore::BitmaskInVector::getBitmask() const Obd2SensorStore::Obd2SensorStore(size_t numVendorIntegerSensors, size_t numVendorFloatSensors) { + using V2_0::toInt; // because the last index is valid *inclusive* - const size_t numSystemIntegerSensors = V2_0::toInt(Obd2IntegerSensorIndex::LAST_SYSTEM_INDEX)+1; - const size_t numSystemFloatSensors = V2_0::toInt(Obd2FloatSensorIndex::LAST_SYSTEM_INDEX)+1; + const size_t numSystemIntegerSensors = + toInt(DiagnosticIntegerSensorIndex::LAST_SYSTEM_INDEX)+1; + const size_t numSystemFloatSensors = + toInt(DiagnosticFloatSensorIndex::LAST_SYSTEM_INDEX)+1; mIntegerSensors = std::vector( numSystemIntegerSensors+numVendorIntegerSensors, 0); mFloatSensors = std::vector( @@ -66,11 +69,11 @@ Obd2SensorStore::Obd2SensorStore(size_t numVendorIntegerSensors, mSensorsBitmask.resize(mIntegerSensors.size()+mFloatSensors.size()); } -V2_0::StatusCode Obd2SensorStore::setIntegerSensor(Obd2IntegerSensorIndex index, +V2_0::StatusCode Obd2SensorStore::setIntegerSensor(DiagnosticIntegerSensorIndex index, int32_t value) { return setIntegerSensor(V2_0::toInt(index), value); } -V2_0::StatusCode Obd2SensorStore::setFloatSensor(Obd2FloatSensorIndex index, +V2_0::StatusCode Obd2SensorStore::setFloatSensor(DiagnosticFloatSensorIndex index, float value) { return setFloatSensor(V2_0::toInt(index), value); } diff --git a/automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.cpp b/automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.cpp index 4faccbd999..568d62343d 100644 --- a/automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.cpp +++ b/automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.cpp @@ -37,85 +37,86 @@ namespace impl { static std::unique_ptr fillDefaultObd2Frame( size_t numVendorIntegerSensors, size_t numVendorFloatSensors) { + using V2_0::toInt; std::unique_ptr sensorStore(new Obd2SensorStore( numVendorIntegerSensors, numVendorFloatSensors)); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::FUEL_SYSTEM_STATUS, - V2_0::toInt(FuelSystemStatus::CLOSED_LOOP)); + DiagnosticIntegerSensorIndex::FUEL_SYSTEM_STATUS, + toInt(Obd2FuelSystemStatus::CLOSED_LOOP)); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::MALFUNCTION_INDICATOR_LIGHT_ON, 0); + DiagnosticIntegerSensorIndex::MALFUNCTION_INDICATOR_LIGHT_ON, 0); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::IGNITION_MONITORS_SUPPORTED, - V2_0::toInt(IgnitionMonitorKind::SPARK)); - sensorStore->setIntegerSensor(Obd2IntegerSensorIndex::IGNITION_SPECIFIC_MONITORS, - CommonIgnitionMonitors::COMPONENTS_AVAILABLE | - CommonIgnitionMonitors::MISFIRE_AVAILABLE | - SparkIgnitionMonitors::AC_REFRIGERANT_AVAILABLE | - SparkIgnitionMonitors::EVAPORATIVE_SYSTEM_AVAILABLE); + DiagnosticIntegerSensorIndex::IGNITION_MONITORS_SUPPORTED, + toInt(Obd2IgnitionMonitorKind::SPARK)); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::IGNITION_SPECIFIC_MONITORS, + Obd2CommonIgnitionMonitors::COMPONENTS_AVAILABLE | + Obd2CommonIgnitionMonitors::MISFIRE_AVAILABLE | + Obd2SparkIgnitionMonitors::AC_REFRIGERANT_AVAILABLE | + Obd2SparkIgnitionMonitors::EVAPORATIVE_SYSTEM_AVAILABLE); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::INTAKE_AIR_TEMPERATURE, 35); + DiagnosticIntegerSensorIndex::INTAKE_AIR_TEMPERATURE, 35); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::COMMANDED_SECONDARY_AIR_STATUS, - V2_0::toInt(SecondaryAirStatus::FROM_OUTSIDE_OR_OFF)); + DiagnosticIntegerSensorIndex::COMMANDED_SECONDARY_AIR_STATUS, + toInt(Obd2SecondaryAirStatus::FROM_OUTSIDE_OR_OFF)); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::NUM_OXYGEN_SENSORS_PRESENT, 1); + DiagnosticIntegerSensorIndex::NUM_OXYGEN_SENSORS_PRESENT, 1); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::RUNTIME_SINCE_ENGINE_START, 500); + DiagnosticIntegerSensorIndex::RUNTIME_SINCE_ENGINE_START, 500); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON, 0); + DiagnosticIntegerSensorIndex::DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON, 0); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::WARMUPS_SINCE_CODES_CLEARED, 51); + DiagnosticIntegerSensorIndex::WARMUPS_SINCE_CODES_CLEARED, 51); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::DISTANCE_TRAVELED_SINCE_CODES_CLEARED, 365); + DiagnosticIntegerSensorIndex::DISTANCE_TRAVELED_SINCE_CODES_CLEARED, 365); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::ABSOLUTE_BAROMETRIC_PRESSURE, 30); + DiagnosticIntegerSensorIndex::ABSOLUTE_BAROMETRIC_PRESSURE, 30); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::CONTROL_MODULE_VOLTAGE, 12); + DiagnosticIntegerSensorIndex::CONTROL_MODULE_VOLTAGE, 12); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::AMBIENT_AIR_TEMPERATURE, 18); + DiagnosticIntegerSensorIndex::AMBIENT_AIR_TEMPERATURE, 18); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::MAX_FUEL_AIR_EQUIVALENCE_RATIO, 1); + DiagnosticIntegerSensorIndex::MAX_FUEL_AIR_EQUIVALENCE_RATIO, 1); sensorStore->setIntegerSensor( - Obd2IntegerSensorIndex::FUEL_TYPE, V2_0::toInt(FuelType::GASOLINE)); + DiagnosticIntegerSensorIndex::FUEL_TYPE, V2_0::toInt(Obd2FuelType::GASOLINE)); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::CALCULATED_ENGINE_LOAD, 0.153); + DiagnosticFloatSensorIndex::CALCULATED_ENGINE_LOAD, 0.153); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::SHORT_TERM_FUEL_TRIM_BANK1, -0.16); + DiagnosticFloatSensorIndex::SHORT_TERM_FUEL_TRIM_BANK1, -0.16); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::LONG_TERM_FUEL_TRIM_BANK1, -0.16); + DiagnosticFloatSensorIndex::LONG_TERM_FUEL_TRIM_BANK1, -0.16); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::SHORT_TERM_FUEL_TRIM_BANK2, -0.16); + DiagnosticFloatSensorIndex::SHORT_TERM_FUEL_TRIM_BANK2, -0.16); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::LONG_TERM_FUEL_TRIM_BANK2, -0.16); + DiagnosticFloatSensorIndex::LONG_TERM_FUEL_TRIM_BANK2, -0.16); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::INTAKE_MANIFOLD_ABSOLUTE_PRESSURE, 7.5); + DiagnosticFloatSensorIndex::INTAKE_MANIFOLD_ABSOLUTE_PRESSURE, 7.5); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::ENGINE_RPM, 1250.); + DiagnosticFloatSensorIndex::ENGINE_RPM, 1250.); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::VEHICLE_SPEED, 40.); + DiagnosticFloatSensorIndex::VEHICLE_SPEED, 40.); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::TIMING_ADVANCE, 2.5); + DiagnosticFloatSensorIndex::TIMING_ADVANCE, 2.5); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::THROTTLE_POSITION, 19.75); + DiagnosticFloatSensorIndex::THROTTLE_POSITION, 19.75); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::OXYGEN_SENSOR1_VOLTAGE, 0.265); + DiagnosticFloatSensorIndex::OXYGEN_SENSOR1_VOLTAGE, 0.265); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::FUEL_TANK_LEVEL_INPUT, 0.824); + DiagnosticFloatSensorIndex::FUEL_TANK_LEVEL_INPUT, 0.824); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::EVAPORATION_SYSTEM_VAPOR_PRESSURE, -0.373); + DiagnosticFloatSensorIndex::EVAPORATION_SYSTEM_VAPOR_PRESSURE, -0.373); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::CATALYST_TEMPERATURE_BANK1_SENSOR1, 190.); + DiagnosticFloatSensorIndex::CATALYST_TEMPERATURE_BANK1_SENSOR1, 190.); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::RELATIVE_THROTTLE_POSITION, 3.); + DiagnosticFloatSensorIndex::RELATIVE_THROTTLE_POSITION, 3.); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::ABSOLUTE_THROTTLE_POSITION_B, 0.306); + DiagnosticFloatSensorIndex::ABSOLUTE_THROTTLE_POSITION_B, 0.306); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::ACCELERATOR_PEDAL_POSITION_D, 0.188); + DiagnosticFloatSensorIndex::ACCELERATOR_PEDAL_POSITION_D, 0.188); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::ACCELERATOR_PEDAL_POSITION_E, 0.094); + DiagnosticFloatSensorIndex::ACCELERATOR_PEDAL_POSITION_E, 0.094); sensorStore->setFloatSensor( - Obd2FloatSensorIndex::COMMANDED_THROTTLE_ACTUATOR, 0.024); + DiagnosticFloatSensorIndex::COMMANDED_THROTTLE_ACTUATOR, 0.024); return sensorStore; } diff --git a/automotive/vehicle/2.1/types.hal b/automotive/vehicle/2.1/types.hal index cea7f1bfc7..e5f94113a3 100644 --- a/automotive/vehicle/2.1/types.hal +++ b/automotive/vehicle/2.1/types.hal @@ -260,8 +260,8 @@ enum VehicleProperty: @2.0::VehicleProperty { | VehicleArea:GLOBAL), }; -/** The status of a fuel system as described by the OBD2 specification. */ -enum FuelSystemStatus : int32_t { +/** The status of the vehicle's fuel system. */ +enum Obd2FuelSystemStatus : int32_t { OPEN_INSUFFICIENT_ENGINE_TEMPERATURE = 1, CLOSED_LOOP = 2, OPEN_ENGINE_LOAD_OR_DECELERATION = 4, @@ -270,13 +270,13 @@ enum FuelSystemStatus : int32_t { }; /** Defines which ignition monitors are available to be read. */ -enum IgnitionMonitorKind : int32_t { +enum Obd2IgnitionMonitorKind : int32_t { SPARK = 0, COMPRESSION = 1, }; /** These ignition monitors are common to both SPARK and COMPRESSION. */ -enum CommonIgnitionMonitors : int32_t { +enum Obd2CommonIgnitionMonitors : int32_t { COMPONENTS_AVAILABLE = 0x1 << 0, COMPONENTS_INCOMPLETE = 0x1 << 1, @@ -288,7 +288,7 @@ enum CommonIgnitionMonitors : int32_t { }; /** Ignition monitors available for SPARK vehicles. */ -enum SparkIgnitionMonitors : CommonIgnitionMonitors { +enum Obd2SparkIgnitionMonitors : Obd2CommonIgnitionMonitors { EGR_AVAILABLE = 0x1 << 6, EGR_INCOMPLETE = 0x1 << 7, @@ -315,7 +315,7 @@ enum SparkIgnitionMonitors : CommonIgnitionMonitors { }; /** Ignition monitors only available for COMPRESSION vehicles. */ -enum CompressionIgnitionMonitors : CommonIgnitionMonitors { +enum Obd2CompressionIgnitionMonitors : Obd2CommonIgnitionMonitors { EGR_OR_VVT_AVAILABLE = 0x1 << 6, EGR_OR_VVT_INCOMPLETE = 0x1 << 7, @@ -335,14 +335,16 @@ enum CompressionIgnitionMonitors : CommonIgnitionMonitors { NMHC_CATALYST_INCOMPLETE = 0x1 << 17, }; -enum SecondaryAirStatus : int32_t { +/** The status of the vehicle's secondary air system. */ +enum Obd2SecondaryAirStatus : int32_t { UPSTREAM = 1, DOWNSTREAM_OF_CATALYCIC_CONVERTER = 2, FROM_OUTSIDE_OR_OFF = 4, PUMP_ON_FOR_DIAGNOSTICS = 8, }; -enum FuelType : int32_t { +/** The fuel type(s) supported by a vehicle. */ +enum Obd2FuelType : int32_t { NOT_AVAILABLE = 0, GASOLINE = 1, METHANOL = 2, @@ -376,7 +378,7 @@ enum FuelType : int32_t { * expect a comment by the property definition describing the enum to look at for the mapping. * Any value greater than the last reserved index is available to vendors to map their extensions. */ -enum Obd2IntegerSensorIndex : int32_t { +enum DiagnosticIntegerSensorIndex : int32_t { /** refer to FuelSystemStatus for a description of this value. */ FUEL_SYSTEM_STATUS = 0, MALFUNCTION_INDICATOR_LIGHT_ON = 1, @@ -431,7 +433,7 @@ enum Obd2IntegerSensorIndex : int32_t { * The ordering of the values is taken from the OBD2 specification. * Any value greater than the last reserved index is available to vendors to map their extensions. */ -enum Obd2FloatSensorIndex : int32_t { +enum DiagnosticFloatSensorIndex : int32_t { CALCULATED_ENGINE_LOAD = 0, ENGINE_COOLANT_TEMPERATURE = 1, SHORT_TERM_FUEL_TRIM_BANK1 = 2, From c1763a679659cdb1a50f7b4640b6c3f659f1d666 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Tue, 25 Jul 2017 10:01:17 -0700 Subject: [PATCH 074/265] Fix remaining broadcastradio 1.1 VTS TODOs. This includes: - cover all AM/FM bands, not just first one - fix flakiness on late callback dereference - fix 1.0 tuneComplete check - move utils includes into separate subdirectories Bug: b/36864490 Test: VTS Change-Id: I6e2427ac29abd6278c9783cf83b4df05195ac7ea --- broadcastradio/1.1/default/Tuner.cpp | 2 +- broadcastradio/1.1/default/Tuner.h | 2 +- broadcastradio/1.1/default/VirtualProgram.cpp | 2 +- broadcastradio/1.1/default/VirtualRadio.cpp | 2 +- .../1.1/tests/WorkerThread_test.cpp | 2 +- broadcastradio/1.1/utils/Android.bp | 2 +- broadcastradio/1.1/utils/Utils.cpp | 22 ++- broadcastradio/1.1/utils/WorkerThread.cpp | 2 +- .../broadcastradio-utils}/Utils.h | 7 + .../broadcastradio-utils}/WorkerThread.h | 0 broadcastradio/1.1/vts/functional/Android.bp | 16 +- .../VtsHalBroadcastradioV1_1TargetTest.cpp | 141 ++++++++++++------ broadcastradio/1.1/vts/utils/Android.bp | 28 ++++ .../{functional => utils}/call-barrier.cpp | 2 +- .../broadcastradio-vts-utils}/call-barrier.h | 0 .../broadcastradio-vts-utils}/mock-timeout.h | 0 broadcastradio/Android.bp | 1 + 17 files changed, 160 insertions(+), 71 deletions(-) rename broadcastradio/1.1/utils/{ => include/broadcastradio-utils}/Utils.h (96%) rename broadcastradio/1.1/utils/{ => include/broadcastradio-utils}/WorkerThread.h (100%) create mode 100644 broadcastradio/1.1/vts/utils/Android.bp rename broadcastradio/1.1/vts/{functional => utils}/call-barrier.cpp (95%) rename broadcastradio/1.1/vts/{functional => utils/include/broadcastradio-vts-utils}/call-barrier.h (100%) rename broadcastradio/1.1/vts/{functional => utils/include/broadcastradio-vts-utils}/mock-timeout.h (100%) diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index 0a452088fd..133593ed85 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -20,7 +20,7 @@ #include "BroadcastRadio.h" #include "Tuner.h" -#include +#include #include namespace android { diff --git a/broadcastradio/1.1/default/Tuner.h b/broadcastradio/1.1/default/Tuner.h index 2ab4f407aa..2222e5a877 100644 --- a/broadcastradio/1.1/default/Tuner.h +++ b/broadcastradio/1.1/default/Tuner.h @@ -18,9 +18,9 @@ #include "VirtualRadio.h" -#include #include #include +#include namespace android { namespace hardware { diff --git a/broadcastradio/1.1/default/VirtualProgram.cpp b/broadcastradio/1.1/default/VirtualProgram.cpp index 1f3b69310b..4c6b3b1b59 100644 --- a/broadcastradio/1.1/default/VirtualProgram.cpp +++ b/broadcastradio/1.1/default/VirtualProgram.cpp @@ -15,7 +15,7 @@ */ #include "VirtualProgram.h" -#include +#include #include "resources.h" diff --git a/broadcastradio/1.1/default/VirtualRadio.cpp b/broadcastradio/1.1/default/VirtualRadio.cpp index 89b2b0ae2d..692e7bc91c 100644 --- a/broadcastradio/1.1/default/VirtualRadio.cpp +++ b/broadcastradio/1.1/default/VirtualRadio.cpp @@ -15,7 +15,7 @@ */ #include "VirtualRadio.h" -#include +#include namespace android { namespace hardware { diff --git a/broadcastradio/1.1/tests/WorkerThread_test.cpp b/broadcastradio/1.1/tests/WorkerThread_test.cpp index a0e0ebb27c..ed36de3e85 100644 --- a/broadcastradio/1.1/tests/WorkerThread_test.cpp +++ b/broadcastradio/1.1/tests/WorkerThread_test.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include +#include #include namespace { diff --git a/broadcastradio/1.1/utils/Android.bp b/broadcastradio/1.1/utils/Android.bp index 73c66809a7..e80d133dca 100644 --- a/broadcastradio/1.1/utils/Android.bp +++ b/broadcastradio/1.1/utils/Android.bp @@ -27,7 +27,7 @@ cc_library_static { "Utils.cpp", "WorkerThread.cpp", ], - export_include_dirs: ["."], + export_include_dirs: ["include"], shared_libs: [ "android.hardware.broadcastradio@1.1", ], diff --git a/broadcastradio/1.1/utils/Utils.cpp b/broadcastradio/1.1/utils/Utils.cpp index f8a4479046..8bb7691794 100644 --- a/broadcastradio/1.1/utils/Utils.cpp +++ b/broadcastradio/1.1/utils/Utils.cpp @@ -16,7 +16,7 @@ #define LOG_TAG "BroadcastRadioDefault.utils" //#define LOG_NDEBUG 0 -#include "Utils.h" +#include #include @@ -208,6 +208,26 @@ bool isDigital(const ProgramSelector& sel) { } // namespace utils } // namespace V1_1 + +namespace V1_0 { + +bool operator==(const BandConfig& l, const BandConfig& r) { + if (l.type != r.type) return false; + if (l.antennaConnected != r.antennaConnected) return false; + if (l.lowerLimit != r.lowerLimit) return false; + if (l.upperLimit != r.upperLimit) return false; + if (l.spacings != r.spacings) return false; + if (l.type == Band::AM || l.type == Band::AM_HD) { + return l.ext.am == r.ext.am; + } else if (l.type == Band::FM || l.type == Band::FM_HD) { + return l.ext.fm == r.ext.fm; + } else { + ALOGW("Unsupported band config type: %s", toString(l.type).c_str()); + return false; + } +} + +} // namespace V1_0 } // namespace broadcastradio } // namespace hardware } // namespace android diff --git a/broadcastradio/1.1/utils/WorkerThread.cpp b/broadcastradio/1.1/utils/WorkerThread.cpp index a3ceaa1bfa..bfcbb390e8 100644 --- a/broadcastradio/1.1/utils/WorkerThread.cpp +++ b/broadcastradio/1.1/utils/WorkerThread.cpp @@ -17,7 +17,7 @@ #define LOG_TAG "WorkerThread" //#define LOG_NDEBUG 0 -#include "WorkerThread.h" +#include #include diff --git a/broadcastradio/1.1/utils/Utils.h b/broadcastradio/1.1/utils/include/broadcastradio-utils/Utils.h similarity index 96% rename from broadcastradio/1.1/utils/Utils.h rename to broadcastradio/1.1/utils/include/broadcastradio-utils/Utils.h index cd86ffaadc..a7da9fea4e 100644 --- a/broadcastradio/1.1/utils/Utils.h +++ b/broadcastradio/1.1/utils/include/broadcastradio-utils/Utils.h @@ -66,6 +66,13 @@ bool isDigital(const ProgramSelector& sel); } // namespace utils } // namespace V1_1 + +namespace V1_0 { + +bool operator==(const BandConfig& l, const BandConfig& r); + +} // namespace V1_0 + } // namespace broadcastradio } // namespace hardware } // namespace android diff --git a/broadcastradio/1.1/utils/WorkerThread.h b/broadcastradio/1.1/utils/include/broadcastradio-utils/WorkerThread.h similarity index 100% rename from broadcastradio/1.1/utils/WorkerThread.h rename to broadcastradio/1.1/utils/include/broadcastradio-utils/WorkerThread.h diff --git a/broadcastradio/1.1/vts/functional/Android.bp b/broadcastradio/1.1/vts/functional/Android.bp index c1360198a1..6e5c84cde1 100644 --- a/broadcastradio/1.1/vts/functional/Android.bp +++ b/broadcastradio/1.1/vts/functional/Android.bp @@ -31,7 +31,8 @@ cc_test { ], static_libs: [ "VtsHalHidlTargetTestBase", - "broadcastradio-vts-call-barrier", + "android.hardware.broadcastradio@1.1-utils-lib", + "android.hardware.broadcastradio@1.1-vts-utils-lib", "libgmock", ], cflags: [ @@ -40,16 +41,3 @@ cc_test { "-g", ], } - -cc_library_static { - name: "broadcastradio-vts-call-barrier", - srcs: [ - "call-barrier.cpp", - ], - export_include_dirs: ["."], - cflags: [ - "-Wall", - "-Wextra", - "-Werror", - ], -} diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index d20452bce5..c6bc344a8d 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -17,8 +17,15 @@ #define LOG_TAG "broadcastradio.vts" #include +#include +#include +#include +#include +#include #include -#include +#include +#include +#include #include #include #include @@ -27,14 +34,6 @@ #include -#include -#include -#include -#include -#include - -#include "mock-timeout.h" - namespace android { namespace hardware { namespace broadcastradio { @@ -57,6 +56,9 @@ using V1_0::MetaData; using V1_0::MetadataKey; using V1_0::MetadataType; +using std::chrono::steady_clock; +using std::this_thread::sleep_for; + static constexpr auto kConfigTimeout = 10s; static constexpr auto kConnectModuleTimeout = 1s; static constexpr auto kTuneTimeout = 30s; @@ -91,10 +93,8 @@ class BroadcastRadioHalTest : public ::testing::VtsHalHidlTargetTestBase, virtual void SetUp() override; virtual void TearDown() override; - // TODO(b/36864490): check all bands for good test conditions (ie. FM is more likely to have - // any stations on the list, so don't pick AM blindly). - bool openTuner(unsigned band); - const BandConfig& getBand(unsigned idx); + bool openTuner(); + bool nextBand(); bool getProgramList(std::function& list)> cb); Class radioClass; @@ -105,9 +105,33 @@ class BroadcastRadioHalTest : public ::testing::VtsHalHidlTargetTestBase, sp mCallback = new TunerCallbackMock(); private: + const BandConfig& getBand(unsigned idx); + + unsigned currentBandIndex = 0; hidl_vec mBands; }; +/** + * Clears strong pointer and waits until the object gets destroyed. + * + * @param ptr The pointer to get cleared. + * @param timeout Time to wait for other references. + */ +template +static void clearAndWait(sp& ptr, std::chrono::milliseconds timeout) { + wp wptr = ptr; + ptr.clear(); + auto limit = steady_clock::now() + timeout; + while (wptr.promote() != nullptr) { + constexpr auto step = 10ms; + if (steady_clock::now() + step > limit) { + FAIL() << "Pointer was not released within timeout"; + break; + } + sleep_for(step); + } +} + void BroadcastRadioHalTest::SetUp() { radioClass = GetParam(); @@ -153,10 +177,10 @@ void BroadcastRadioHalTest::SetUp() { void BroadcastRadioHalTest::TearDown() { mTuner.clear(); mRadioModule.clear(); - // TODO(b/36864490): wait (with timeout) until mCallback has only one reference + clearAndWait(mCallback, 1s); } -bool BroadcastRadioHalTest::openTuner(unsigned band) { +bool BroadcastRadioHalTest::openTuner() { EXPECT_EQ(nullptr, mTuner.get()); if (radioClass == Class::AM_FM) { @@ -169,7 +193,8 @@ bool BroadcastRadioHalTest::openTuner(unsigned band) { if (result != Result::OK) return; mTuner = ITuner::castFrom(tuner); }; - auto hidlResult = mRadioModule->openTuner(getBand(band), true, mCallback, openCb); + currentBandIndex = 0; + auto hidlResult = mRadioModule->openTuner(getBand(0), true, mCallback, openCb); EXPECT_TRUE(hidlResult.isOk()); EXPECT_EQ(Result::OK, halResult); @@ -210,6 +235,21 @@ const BandConfig& BroadcastRadioHalTest::getBand(unsigned idx) { return band; } +bool BroadcastRadioHalTest::nextBand() { + if (currentBandIndex + 1 >= mBands.size()) return false; + currentBandIndex++; + + BandConfig bandCb; + EXPECT_TIMEOUT_CALL(*mCallback, configChange, Result::OK, _) + .WillOnce(DoAll(SaveArg<1>(&bandCb), testing::Return(ByMove(Void())))); + auto hidlResult = mTuner->setConfiguration(getBand(currentBandIndex)); + EXPECT_EQ(Result::OK, hidlResult); + EXPECT_TIMEOUT_CALL_WAIT(*mCallback, configChange, kConfigTimeout); + EXPECT_EQ(getBand(currentBandIndex), bandCb); + + return true; +} + bool BroadcastRadioHalTest::getProgramList( std::function& list)> cb) { ProgramListResult getListResult = ProgramListResult::NOT_INITIALIZED; @@ -244,11 +284,7 @@ bool BroadcastRadioHalTest::getProgramList( EXPECT_EQ(ProgramListResult::OK, getListResult); } - if (isListEmpty) { - printSkipped("Program list is empty."); - return false; - } - return true; + return !isListEmpty; } /** @@ -263,13 +299,13 @@ bool BroadcastRadioHalTest::getProgramList( */ TEST_P(BroadcastRadioHalTest, OpenTunerTwice) { if (skipped) return; - ASSERT_TRUE(openTuner(0)); - Result halResult = Result::NOT_INITIALIZED; - auto openCb = [&](Result result, const sp&) { halResult = result; }; - auto hidlResult = mRadioModule->openTuner(getBand(0), true, mCallback, openCb); - ASSERT_TRUE(hidlResult.isOk()); - ASSERT_EQ(Result::OK, halResult); + ASSERT_TRUE(openTuner()); + + auto secondTuner = mTuner; + mTuner.clear(); + + ASSERT_TRUE(openTuner()); } /** @@ -283,17 +319,25 @@ TEST_P(BroadcastRadioHalTest, OpenTunerTwice) { */ TEST_P(BroadcastRadioHalTest, TuneFromProgramList) { if (skipped) return; - ASSERT_TRUE(openTuner(0)); + ASSERT_TRUE(openTuner()); ProgramInfo firstProgram; - auto getCb = [&](const hidl_vec& list) { - // don't copy the whole list out, it might be heavy - firstProgram = list[0]; - }; - if (!getProgramList(getCb)) return; + bool foundAny = false; + do { + auto getCb = [&](const hidl_vec& list) { + // don't copy the whole list out, it might be heavy + firstProgram = list[0]; + }; + if (getProgramList(getCb)) foundAny = true; + } while (nextBand()); + if (HasFailure()) return; + if (!foundAny) { + printSkipped("Program list is empty."); + return; + } ProgramSelector selCb; - EXPECT_CALL(*mCallback, tuneComplete(_, _)); + EXPECT_CALL(*mCallback, tuneComplete(_, _)).Times(0); EXPECT_TIMEOUT_CALL(*mCallback, tuneComplete_1_1, Result::OK, _) .WillOnce(DoAll(SaveArg<1>(&selCb), testing::Return(ByMove(Void())))); auto tuneResult = mTuner->tune_1_1(firstProgram.selector); @@ -304,7 +348,7 @@ TEST_P(BroadcastRadioHalTest, TuneFromProgramList) { TEST_P(BroadcastRadioHalTest, CancelAnnouncement) { if (skipped) return; - ASSERT_TRUE(openTuner(0)); + ASSERT_TRUE(openTuner()); auto hidlResult = mTuner->cancelAnnouncement(); EXPECT_EQ(Result::OK, hidlResult); @@ -336,23 +380,24 @@ TEST_P(BroadcastRadioHalTest, GetNoImage) { */ TEST_P(BroadcastRadioHalTest, OobImagesOnly) { if (skipped) return; - ASSERT_TRUE(openTuner(0)); + ASSERT_TRUE(openTuner()); std::vector imageIds; - ProgramInfo firstProgram; - auto getCb = [&](const hidl_vec& list) { - for (auto&& program : list) { - for (auto&& entry : program.base.metadata) { - EXPECT_NE(MetadataType::RAW, entry.type); - if (entry.key != MetadataKey::ICON && entry.key != MetadataKey::ART) continue; - EXPECT_NE(0, entry.intValue); - EXPECT_EQ(0u, entry.rawValue.size()); - if (entry.intValue != 0) imageIds.push_back(entry.intValue); + do { + auto getCb = [&](const hidl_vec& list) { + for (auto&& program : list) { + for (auto&& entry : program.base.metadata) { + EXPECT_NE(MetadataType::RAW, entry.type); + if (entry.key != MetadataKey::ICON && entry.key != MetadataKey::ART) continue; + EXPECT_NE(0, entry.intValue); + EXPECT_EQ(0u, entry.rawValue.size()); + if (entry.intValue != 0) imageIds.push_back(entry.intValue); + } } - } - }; - if (!getProgramList(getCb)) return; + }; + getProgramList(getCb); + } while (nextBand()); if (imageIds.size() == 0) { printSkipped("No images found"); diff --git a/broadcastradio/1.1/vts/utils/Android.bp b/broadcastradio/1.1/vts/utils/Android.bp new file mode 100644 index 0000000000..0c7e2a4433 --- /dev/null +++ b/broadcastradio/1.1/vts/utils/Android.bp @@ -0,0 +1,28 @@ +// +// Copyright (C) 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. +// + +cc_library_static { + name: "android.hardware.broadcastradio@1.1-vts-utils-lib", + srcs: [ + "call-barrier.cpp", + ], + export_include_dirs: ["include"], + cflags: [ + "-Wall", + "-Wextra", + "-Werror", + ], +} diff --git a/broadcastradio/1.1/vts/functional/call-barrier.cpp b/broadcastradio/1.1/vts/utils/call-barrier.cpp similarity index 95% rename from broadcastradio/1.1/vts/functional/call-barrier.cpp rename to broadcastradio/1.1/vts/utils/call-barrier.cpp index fede297ad1..d8c47162ed 100644 --- a/broadcastradio/1.1/vts/functional/call-barrier.cpp +++ b/broadcastradio/1.1/vts/utils/call-barrier.cpp @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "call-barrier.h" +#include namespace android { namespace hardware { diff --git a/broadcastradio/1.1/vts/functional/call-barrier.h b/broadcastradio/1.1/vts/utils/include/broadcastradio-vts-utils/call-barrier.h similarity index 100% rename from broadcastradio/1.1/vts/functional/call-barrier.h rename to broadcastradio/1.1/vts/utils/include/broadcastradio-vts-utils/call-barrier.h diff --git a/broadcastradio/1.1/vts/functional/mock-timeout.h b/broadcastradio/1.1/vts/utils/include/broadcastradio-vts-utils/mock-timeout.h similarity index 100% rename from broadcastradio/1.1/vts/functional/mock-timeout.h rename to broadcastradio/1.1/vts/utils/include/broadcastradio-vts-utils/mock-timeout.h diff --git a/broadcastradio/Android.bp b/broadcastradio/Android.bp index a5ad5e7af7..8c65bf6013 100644 --- a/broadcastradio/Android.bp +++ b/broadcastradio/Android.bp @@ -8,4 +8,5 @@ subdirs = [ "1.1/tests", "1.1/utils", "1.1/vts/functional", + "1.1/vts/utils", ] From 557cce559a3f8504cf36b8ab25dff8e81888a176 Mon Sep 17 00:00:00 2001 From: Yin-Chia Yeh Date: Tue, 11 Jul 2017 13:44:35 -0700 Subject: [PATCH 075/265] Camera: reset callback after test done Back port from master Test: VTS test pass Bug: 63570734 Change-Id: Ic0eecaf843b5c2e78f60325090ea652d43a74a0b Merged-In: Ic0eecaf843b5c2e78f60325090ea652d43a74a0b --- .../2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index 5ece765d99..8a1e3df1a3 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -1072,6 +1072,9 @@ TEST_F(CameraHidlTest, setCallback) { auto status = mProvider->setCallback(cb); ASSERT_TRUE(status.isOk()); ASSERT_EQ(Status::OK, status); + status = mProvider->setCallback(nullptr); + ASSERT_TRUE(status.isOk()); + ASSERT_EQ(Status::OK, status); } // Test if ICameraProvider::getCameraDeviceInterface returns Status::OK and non-null device From feb0ddde26e41a157f5754492ad06fa43e17848e Mon Sep 17 00:00:00 2001 From: Yin-Chia Yeh Date: Tue, 25 Jul 2017 12:54:35 -0700 Subject: [PATCH 076/265] Camera: add camera owners Test: none Change-Id: I1a221feea480139d78c9b10dcd6c7c88955901bd Merged-In: I1a221feea480139d78c9b10dcd6c7c88955901bd (cherry picked from commit 14a5810a2ef2bd0373ebff129902302f3f959920) --- camera/device/1.0/default/OWNERS | 6 ++++++ camera/device/3.2/default/OWNERS | 6 ++++++ camera/provider/2.4/default/OWNERS | 6 ++++++ camera/provider/2.4/vts/OWNERS | 11 +++++++++++ 4 files changed, 29 insertions(+) create mode 100644 camera/device/1.0/default/OWNERS create mode 100644 camera/device/3.2/default/OWNERS create mode 100644 camera/provider/2.4/default/OWNERS create mode 100644 camera/provider/2.4/vts/OWNERS diff --git a/camera/device/1.0/default/OWNERS b/camera/device/1.0/default/OWNERS new file mode 100644 index 0000000000..18acfee145 --- /dev/null +++ b/camera/device/1.0/default/OWNERS @@ -0,0 +1,6 @@ +cychen@google.com +epeev@google.com +etalvala@google.com +shuzhenwang@google.com +yinchiayeh@google.com +zhijunhe@google.com diff --git a/camera/device/3.2/default/OWNERS b/camera/device/3.2/default/OWNERS new file mode 100644 index 0000000000..18acfee145 --- /dev/null +++ b/camera/device/3.2/default/OWNERS @@ -0,0 +1,6 @@ +cychen@google.com +epeev@google.com +etalvala@google.com +shuzhenwang@google.com +yinchiayeh@google.com +zhijunhe@google.com diff --git a/camera/provider/2.4/default/OWNERS b/camera/provider/2.4/default/OWNERS new file mode 100644 index 0000000000..18acfee145 --- /dev/null +++ b/camera/provider/2.4/default/OWNERS @@ -0,0 +1,6 @@ +cychen@google.com +epeev@google.com +etalvala@google.com +shuzhenwang@google.com +yinchiayeh@google.com +zhijunhe@google.com diff --git a/camera/provider/2.4/vts/OWNERS b/camera/provider/2.4/vts/OWNERS new file mode 100644 index 0000000000..003fe71fa8 --- /dev/null +++ b/camera/provider/2.4/vts/OWNERS @@ -0,0 +1,11 @@ +# Camera team +cychen@google.com +epeev@google.com +etalvala@google.com +shuzhenwang@google.com +yinchiayeh@google.com +zhijunhe@google.com + +# VTS team +yim@google.com +zhuoyao@google.com From e9ab8227aea2ddd6d36304030d60590609ecdc68 Mon Sep 17 00:00:00 2001 From: Yin-Chia Yeh Date: Thu, 27 Jul 2017 11:36:44 -0700 Subject: [PATCH 077/265] Camera: fix various VTS issues Also fix wrong return values for processCaptureRequest in default wrapper. Test: running camera VTS Bug: 64041692 Change-Id: I397390af7c85a776713f6287bef1c4d11c721c9a --- .../3.2/default/CameraDeviceSession.cpp | 16 +++++++++- .../device/3.2/default/CameraDeviceSession.h | 1 + .../VtsHalCameraProviderV2_4TargetTest.cpp | 29 ++++++++++++++----- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/camera/device/3.2/default/CameraDeviceSession.cpp b/camera/device/3.2/default/CameraDeviceSession.cpp index f33adf8d1a..fcd134f45e 100644 --- a/camera/device/3.2/default/CameraDeviceSession.cpp +++ b/camera/device/3.2/default/CameraDeviceSession.cpp @@ -923,6 +923,7 @@ Return CameraDeviceSession::configureStreams( status = Status::INTERNAL_ERROR; } else { convertToHidl(stream_list, &outStreams); + mFirstRequest = true; } _hidl_cb(status, outStreams); @@ -1022,7 +1023,13 @@ Status CameraDeviceSession::processOneCaptureRequest(const CaptureRequest& reque if (!converted) { ALOGE("%s: capture request settings metadata is corrupt!", __FUNCTION__); - return Status::INTERNAL_ERROR; + return Status::ILLEGAL_ARGUMENT; + } + + if (mFirstRequest && halRequest.settings == nullptr) { + ALOGE("%s: capture request settings must not be null for first request!", + __FUNCTION__); + return Status::ILLEGAL_ARGUMENT; } hidl_vec allBufPtrs; @@ -1031,6 +1038,12 @@ Status CameraDeviceSession::processOneCaptureRequest(const CaptureRequest& reque request.inputBuffer.bufferId != 0); size_t numOutputBufs = request.outputBuffers.size(); size_t numBufs = numOutputBufs + (hasInputBuf ? 1 : 0); + + if (numOutputBufs == 0) { + ALOGE("%s: capture request must have at least one output buffer!", __FUNCTION__); + return Status::ILLEGAL_ARGUMENT; + } + status = importRequest(request, allBufPtrs, allFences); if (status != Status::OK) { return status; @@ -1102,6 +1115,7 @@ Status CameraDeviceSession::processOneCaptureRequest(const CaptureRequest& reque return Status::INTERNAL_ERROR; } + mFirstRequest = false; return Status::OK; } diff --git a/camera/device/3.2/default/CameraDeviceSession.h b/camera/device/3.2/default/CameraDeviceSession.h index fb3fc02a0f..2fe189fde1 100644 --- a/camera/device/3.2/default/CameraDeviceSession.h +++ b/camera/device/3.2/default/CameraDeviceSession.h @@ -148,6 +148,7 @@ private: static HandleImporter sHandleImporter; bool mInitFail; + bool mFirstRequest = false; common::V1_0::helper::CameraMetadata mDeviceInfo; diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index 5ece765d99..f7203032ff 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -132,22 +132,34 @@ namespace { const char *kHAL1_0 = "1.0"; bool matchDeviceName(const hidl_string& deviceName, - const hidl_string &providerType, std::smatch& sm) { + const hidl_string &providerType, + std::string* deviceVersion, + std::string* cameraId) { ::android::String8 pattern; pattern.appendFormat(kDeviceNameRE, providerType.c_str()); std::regex e(pattern.string()); std::string deviceNameStd(deviceName.c_str()); - return std::regex_match(deviceNameStd, sm, e); + std::smatch sm; + if (std::regex_match(deviceNameStd, sm, e)) { + if (deviceVersion != nullptr) { + *deviceVersion = sm[1]; + } + if (cameraId != nullptr) { + *cameraId = sm[2]; + } + return true; + } + return false; } int getCameraDeviceVersion(const hidl_string& deviceName, const hidl_string &providerType) { - std::smatch sm; - bool match = matchDeviceName(deviceName, providerType, sm); + std::string version; + bool match = matchDeviceName(deviceName, providerType, &version, nullptr); if (!match) { return -1; } - std::string version = sm[1].str(); + if (version.compare(kHAL3_2) == 0) { // maybe switched to 3.4 or define the hidl version enumlater return CAMERA_DEVICE_API_VERSION_3_2; @@ -2717,6 +2729,9 @@ TEST_F(CameraHidlTest, processCaptureRequestPreview) { // Empty settings should be supported after the first call // for repeating requests. request.settings.setToExternal(nullptr, 0, true); + // The buffer has been registered to HAL by bufferId, so per + // API contract we should send a null handle for this buffer + request.outputBuffers[0].buffer = nullptr; mInflightMap.clear(); inflightReq = {1, false, supportsPartialResults, partialResultCount, resultQueue}; mInflightMap.add(request.frameNumber, &inflightReq); @@ -2800,7 +2815,7 @@ TEST_F(CameraHidlTest, processCaptureRequestInvalidSinglePreview) { numRequestProcessed = n; }); ASSERT_TRUE(ret.isOk()); - ASSERT_EQ(Status::INTERNAL_ERROR, status); + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, status); ASSERT_EQ(numRequestProcessed, 0u); ret = session->close(); @@ -2854,7 +2869,7 @@ TEST_F(CameraHidlTest, processCaptureRequestInvalidBuffer) { numRequestProcessed = n; }); ASSERT_TRUE(ret.isOk()); - ASSERT_EQ(Status::INTERNAL_ERROR, status); + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, status); ASSERT_EQ(numRequestProcessed, 0u); ret = session->close(); From bba0a5498aad5ad27c668241786ec3dd12e04d1d Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Fri, 28 Jul 2017 10:07:50 +0100 Subject: [PATCH 078/265] Camera: Update stream consumer usage flag It is possible that the current default consumer usage flag may not be supported by some provider implementations. Use either HW composer or some other flag that is appropriate for the specific use case. Bug: 63913159 Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --skip-preconditions --primary-abi-only --module VtsHalCameraProviderV2_4Target -l INFO Change-Id: I04f89bf67166805191d6d40e5bd93c15ebc97ea6 --- .../VtsHalCameraProviderV2_4TargetTest.cpp | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index c9f03b0f27..8ff9847d77 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -2213,7 +2213,7 @@ TEST_F(CameraHidlTest, configureStreamsAvailableOutputs) { static_cast(it.width), static_cast(it.height), static_cast(it.format), - 0, + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 0, StreamRotation::ROTATION_0}; ::android::hardware::hidl_vec streams = {stream}; @@ -2257,7 +2257,7 @@ TEST_F(CameraHidlTest, configureStreamsInvalidOutputs) { static_cast(0), static_cast(0), static_cast(outputStreams[0].format), - 0, + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 0, StreamRotation::ROTATION_0}; ::android::hardware::hidl_vec streams = {stream}; @@ -2272,7 +2272,7 @@ TEST_F(CameraHidlTest, configureStreamsInvalidOutputs) { static_cast(UINT32_MAX), static_cast(UINT32_MAX), static_cast(outputStreams[0].format), - 0, + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 0, StreamRotation::ROTATION_0}; streams[0] = stream; @@ -2288,7 +2288,7 @@ TEST_F(CameraHidlTest, configureStreamsInvalidOutputs) { static_cast(it.width), static_cast(it.height), static_cast(UINT32_MAX), - 0, + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 0, StreamRotation::ROTATION_0}; streams[0] = stream; @@ -2303,7 +2303,7 @@ TEST_F(CameraHidlTest, configureStreamsInvalidOutputs) { static_cast(it.width), static_cast(it.height), static_cast(it.format), - 0, + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 0, static_cast(UINT32_MAX)}; streams[0] = stream; @@ -2383,7 +2383,7 @@ TEST_F(CameraHidlTest, configureStreamsZSLInputOutputs) { static_cast(outputIter.width), static_cast(outputIter.height), static_cast(outputIter.format), - 0, + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 0, StreamRotation::ROTATION_0}; @@ -2441,7 +2441,7 @@ TEST_F(CameraHidlTest, configureStreamsPreviewStillOutputs) { static_cast(previewIter.width), static_cast(previewIter.height), static_cast(previewIter.format), - 0, + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 0, StreamRotation::ROTATION_0}; Stream blobStream = {streamId++, @@ -2449,7 +2449,7 @@ TEST_F(CameraHidlTest, configureStreamsPreviewStillOutputs) { static_cast(blobIter.width), static_cast(blobIter.height), static_cast(blobIter.format), - 0, + GRALLOC1_CONSUMER_USAGE_CPU_READ, 0, StreamRotation::ROTATION_0}; ::android::hardware::hidl_vec streams = {previewStream, blobStream}; @@ -2501,7 +2501,7 @@ TEST_F(CameraHidlTest, configureStreamsConstrainedOutputs) { static_cast(hfrStream.width), static_cast(hfrStream.height), static_cast(hfrStream.format), - 0, + GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, 0, StreamRotation::ROTATION_0}; ::android::hardware::hidl_vec streams = {stream}; @@ -2520,7 +2520,7 @@ TEST_F(CameraHidlTest, configureStreamsConstrainedOutputs) { static_cast(0), static_cast(0), static_cast(hfrStream.format), - 0, + GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, 0, StreamRotation::ROTATION_0}; streams[0] = stream; @@ -2535,7 +2535,7 @@ TEST_F(CameraHidlTest, configureStreamsConstrainedOutputs) { static_cast(UINT32_MAX), static_cast(UINT32_MAX), static_cast(hfrStream.format), - 0, + GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, 0, StreamRotation::ROTATION_0}; streams[0] = stream; @@ -2550,7 +2550,7 @@ TEST_F(CameraHidlTest, configureStreamsConstrainedOutputs) { static_cast(hfrStream.width), static_cast(hfrStream.height), static_cast(UINT32_MAX), - 0, + GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, 0, StreamRotation::ROTATION_0}; streams[0] = stream; @@ -2603,7 +2603,7 @@ TEST_F(CameraHidlTest, configureStreamsVideoStillOutputs) { static_cast(videoIter.width), static_cast(videoIter.height), static_cast(videoIter.format), - 0, + GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, 0, StreamRotation::ROTATION_0}; Stream blobStream = {streamId++, @@ -2611,7 +2611,7 @@ TEST_F(CameraHidlTest, configureStreamsVideoStillOutputs) { static_cast(blobIter.width), static_cast(blobIter.height), static_cast(blobIter.format), - GRALLOC_USAGE_HW_VIDEO_ENCODER, + GRALLOC1_CONSUMER_USAGE_CPU_READ, 0, StreamRotation::ROTATION_0}; ::android::hardware::hidl_vec streams = {videoStream, blobStream}; @@ -3291,7 +3291,7 @@ void CameraHidlTest::configurePreviewStream(const std::string &name, static_cast (outputPreviewStreams[0].width), static_cast (outputPreviewStreams[0].height), static_cast (outputPreviewStreams[0].format), - 0, 0, StreamRotation::ROTATION_0}; + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 0, StreamRotation::ROTATION_0}; ::android::hardware::hidl_vec streams = {*previewStream}; StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; From 28cd8404d60962b4f6bf1cd6dee70cd5dc7b7e13 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Thu, 27 Jul 2017 15:50:47 +0530 Subject: [PATCH 079/265] bug fix: handle OMX_EventBufferFlag events OMX_EventBufferFlag event is sent when the component has processed a buffer with its EOS flag set. This event is not sent by soft omx components. Vendor components can send this. From IOMX point of view, this event is not sent for processing bug:64102197 Merged-In: I3a978a885b1e4446f82f2356ae677f70ea6f8150 Change-Id: I3a978a885b1e4446f82f2356ae677f70ea6f8150 --- .../1.0/vts/functional/common/media_hidl_test_common.cpp | 3 --- .../omx/1.0/vts/functional/common/media_hidl_test_common.h | 6 ++++++ .../video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 3 --- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp index a890c4f487..863731aa2a 100755 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp @@ -560,9 +560,6 @@ void testEOS(sp omxNode, sp observer, // something unexpected happened EXPECT_TRUE(false); } - } else if (msg.data.eventData.event == OMX_EventBufferFlag) { - // soft omx components donot send this, we will just ignore it - // for now } else { // something unexpected happened EXPECT_TRUE(false); diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h index 802f4d6075..b3ca92cd06 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h @@ -131,6 +131,12 @@ struct CodecObserver : public IOmxObserver { android::hardware::media::omx::V1_0::Message::Type::EVENT) { *msg = *it; msgQueue.erase(it); + // OMX_EventBufferFlag event is sent when the component has + // processed a buffer with its EOS flag set. This event is + // not sent by soft omx components. Vendor components can + // send this. From IOMX point of view, we will ignore this + // event. + if (msg->data.eventData.event == OMX_EventBufferFlag) break; return ::android::hardware::media::omx::V1_0::Status::OK; } else if (it->type == android::hardware::media::omx::V1_0:: Message::Type::FILL_BUFFER_DONE) { diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index a9c29c736a..16ba745eb1 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -587,9 +587,6 @@ void portReconfiguration(sp omxNode, sp observer, std::cout << "[ ] Warning ! OMX_EventError/ " "Decode Frame Call might be failed \n"; return; - } else if (msg.data.eventData.event == OMX_EventBufferFlag) { - // soft omx components donot send this, we will just ignore it - // for now } else { // something unexpected happened ASSERT_TRUE(false); From 6e93c9c8bafcee3e622e60ad60bbcd08addc14fa Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Tue, 25 Jul 2017 10:53:50 -0700 Subject: [PATCH 080/265] Broadcast Radio default implementation: analog forced switch. Bug: b/36864090 Test: VTS Change-Id: I2b7bcf2bb3ad7075f39280ab72b32bff5bf166a3 --- broadcastradio/1.1/default/Tuner.cpp | 12 ++--- broadcastradio/1.1/default/Tuner.h | 1 + .../VtsHalBroadcastradioV1_1TargetTest.cpp | 46 +++++++++++++++++++ 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index 133593ed85..2985d42377 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -52,7 +52,8 @@ const struct { Tuner::Tuner(const sp& callback) : mCallback(callback), mCallback1_1(ITunerCallback::castFrom(callback).withDefault(nullptr)), - mVirtualFm(make_fm_radio()) { + mVirtualFm(make_fm_radio()), + mIsAnalogForced(false) { // TODO (b/36864090): inject this data in a more elegant way setCompatibilityLevel(mCallback1_1 == nullptr ? 1 : 2); } @@ -320,15 +321,14 @@ Return Tuner::getProgramList(const hidl_string& filter __unused, getProgra Return Tuner::isAnalogForced(isAnalogForced_cb _hidl_cb) { ALOGV("%s", __func__); - // TODO(b/36864090): implement - _hidl_cb(Result::INVALID_STATE, false); + _hidl_cb(Result::OK, mIsAnalogForced); return Void(); } -Return Tuner::setAnalogForced(bool isForced __unused) { +Return Tuner::setAnalogForced(bool isForced) { ALOGV("%s", __func__); - // TODO(b/36864090): implement - return Result::INVALID_STATE; + mIsAnalogForced = isForced; + return Result::OK; } } // namespace implementation diff --git a/broadcastradio/1.1/default/Tuner.h b/broadcastradio/1.1/default/Tuner.h index 2222e5a877..3efbd09ebb 100644 --- a/broadcastradio/1.1/default/Tuner.h +++ b/broadcastradio/1.1/default/Tuner.h @@ -65,6 +65,7 @@ struct Tuner : public ITuner { bool mIsTuneCompleted = false; ProgramSelector mCurrentProgram = {}; ProgramInfo mCurrentProgramInfo = {}; + std::atomic mIsAnalogForced; void tuneInternalLocked(const ProgramSelector& sel); bool isFmLocked(); // TODO(b/36864090): make it generic, not FM only diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index c6bc344a8d..bd2e0a7241 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -416,6 +416,52 @@ TEST_P(BroadcastRadioHalTest, OobImagesOnly) { } } +/** + * Test AnalogForced switch. + * + * Verifies that: + * - setAnalogForced results either with INVALID_STATE, or isAnalogForced replying the same + */ +TEST_P(BroadcastRadioHalTest, AnalogForcedSwitch) { + if (skipped) return; + ASSERT_TRUE(openTuner()); + + bool forced; + Result halIsResult; + auto isCb = [&](Result result, bool isForced) { + halIsResult = result; + forced = isForced; + }; + + // set analog mode + auto setResult = mTuner->setAnalogForced(true); + ASSERT_TRUE(setResult.isOk()); + if (Result::INVALID_STATE == setResult) { + // if setter fails, getter should fail too - it means the switch is not supported at all + auto isResult = mTuner->isAnalogForced(isCb); + ASSERT_TRUE(isResult.isOk()); + EXPECT_EQ(Result::INVALID_STATE, halIsResult); + return; + } + ASSERT_EQ(Result::OK, setResult); + + // check, if it's analog + auto isResult = mTuner->isAnalogForced(isCb); + ASSERT_TRUE(isResult.isOk()); + EXPECT_EQ(Result::OK, halIsResult); + ASSERT_TRUE(forced); + + // set digital mode + setResult = mTuner->setAnalogForced(false); + ASSERT_EQ(Result::OK, setResult); + + // check, if it's digital + isResult = mTuner->isAnalogForced(isCb); + ASSERT_TRUE(isResult.isOk()); + EXPECT_EQ(Result::OK, halIsResult); + ASSERT_FALSE(forced); +} + INSTANTIATE_TEST_CASE_P(BroadcastRadioHalTestCases, BroadcastRadioHalTest, ::testing::Values(Class::AM_FM, Class::SAT, Class::DT)); From 5e644f15e48f6cd106fedf83172e879bc296177a Mon Sep 17 00:00:00 2001 From: sqian Date: Fri, 28 Jul 2017 12:28:51 -0700 Subject: [PATCH 081/265] Add corresponding error code to fix vts test Test: run vts Bug: 63152815 Bug: 62989786 Bug: 64041522 Change-Id: Ifbd17f85b39221de31ec7884b30dc176e1cbd3ab Merged-In: Ifbd17f85b39221de31ec7884b30dc176e1cbd3ab --- .../vts/functional/radio_hidl_hal_data.cpp | 10 +++++-- .../vts/functional/radio_hidl_hal_misc.cpp | 28 ++++++++++--------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/radio/1.0/vts/functional/radio_hidl_hal_data.cpp b/radio/1.0/vts/functional/radio_hidl_hal_data.cpp index 35d97ee686..df31563254 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_data.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_data.cpp @@ -98,7 +98,10 @@ TEST_F(RadioHidlTest, deactivateDataCall) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - EXPECT_EQ(RadioError::INVALID_CALL_ID, radioRsp->rspInfo.error); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::INVALID_CALL_ID || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT || CheckOEMError() || + radioRsp->rspInfo.error == RadioError::RADIO_NOT_AVAILABLE); } } @@ -220,6 +223,9 @@ TEST_F(RadioHidlTest, setDataProfile) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - // TODO(shuoq): Will add error check when we know the expected error from QC + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::RADIO_NOT_AVAILABLE || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); } } diff --git a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp index 864f84413e..cc519ca964 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp @@ -754,22 +754,24 @@ TEST_F(RadioHidlTest, setAllowedCarriers) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || CheckGeneralError()); - } + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); + } - /* Reset back to no carrier restriction */ - memset(&carriers, 0, sizeof(carriers)); - carriers.allowedCarriers.resize(0); - carriers.excludedCarriers.resize(0); + /* Reset back to no carrier restriction */ + memset(&carriers, 0, sizeof(carriers)); + carriers.allowedCarriers.resize(0); + carriers.excludedCarriers.resize(0); - radio->setAllowedCarriers(++serial, true, carriers); - EXPECT_EQ(std::cv_status::no_timeout, wait()); - EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type); - EXPECT_EQ(serial, radioRsp->rspInfo.serial); + radio->setAllowedCarriers(++serial, true, carriers); + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type); + EXPECT_EQ(serial, radioRsp->rspInfo.serial); - if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || CheckGeneralError()); - } + if (cardStatus.cardState == CardState::ABSENT) { + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); + } } /* From 390ced61349eabced38504cf63218990ae46647e Mon Sep 17 00:00:00 2001 From: Enrico Granata Date: Mon, 24 Jul 2017 18:07:04 -0700 Subject: [PATCH 082/265] Improvements to the documentation for the OBD2 properties Addition of a flag to the configuration for OBD2_FREEZE_FRAME_CLEAR to indicate support for deletion of individual freeze frames. Test: build Bug: 64024685 Change-Id: I43cc448c801a5d59095be03d8056530364860ef5 --- .../default/impl/vhal_v2_1/DefaultConfig.h | 3 +- automotive/vehicle/2.1/types.hal | 119 +++++++++--------- 2 files changed, 58 insertions(+), 64 deletions(-) diff --git a/automotive/vehicle/2.1/default/impl/vhal_v2_1/DefaultConfig.h b/automotive/vehicle/2.1/default/impl/vhal_v2_1/DefaultConfig.h index d024a557f6..701317b1c9 100644 --- a/automotive/vehicle/2.1/default/impl/vhal_v2_1/DefaultConfig.h +++ b/automotive/vehicle/2.1/default/impl/vhal_v2_1/DefaultConfig.h @@ -86,7 +86,8 @@ const V2_0::VehiclePropConfig kVehicleProperties[] = { { .prop = OBD2_FREEZE_FRAME_CLEAR, .access = V2_0::VehiclePropertyAccess::WRITE, - .changeMode = V2_0::VehiclePropertyChangeMode::ON_CHANGE + .changeMode = V2_0::VehiclePropertyChangeMode::ON_CHANGE, + .configArray = {1} }, { diff --git a/automotive/vehicle/2.1/types.hal b/automotive/vehicle/2.1/types.hal index d85ef433c2..aa62aa646f 100644 --- a/automotive/vehicle/2.1/types.hal +++ b/automotive/vehicle/2.1/types.hal @@ -131,33 +131,40 @@ enum VehicleProperty: @2.0::VehicleProperty { /** * OBD2 Live Sensor Data * - * This property uses COMPLEX data to send a snapshot of the current (live) - * values of the OBD2 sensors provided by the vehicle. + * Reports a snapshot of the current (live) values of the OBD2 sensors available. * - * VehiclePropConfig - * configArray[0] : number of vendor-specific integer-valued sensors - * that can be returned in a frame. - * configArray[1] : number of vendor-specific float-valued sensors - * that can be returned in a frame. + * The configArray is set as follows: + * configArray[0] = number of vendor-specific integer-valued sensors + * configArray[1] = number of vendor-specific float-valued sensors * - * The values are to be interpreted as follows: - * the indices defined in Obd2IntegerSensorIndex are to be used to - * read from int32Values; - * the indices defined in Obd2FloatSensorIndex are to be used to - * read from floatValues. - * the elements of bytes are to be interpreted as a bitmask, such that - * the bits 0 thru the integer value of - * Obd2IntegerSensorIndex.LAST_SYSTEM_INDEX + the value of configArray[0] - * are 1 if the corresponding index is a valid sensor index whose value can - * be read in the returned int32Values vector, 0 otherwise. - * the bits Obd2IntegerSensorIndex.LAST_SYSTEM_INDEX+1 thru - * Obd2FloatingSensorIndex.LAST_SYSTEM_INDEX + the value of configArray[1] - * are 1 if the corresponding index is a valid sensor index whose value - * can be read in the returned floatValues vector, 0 otherwise. + * The values of this property are to be interpreted as in the following example. + * Considering a configArray = {2,3} + * int32Values must be a vector containing Obd2IntegerSensorIndex.LAST_SYSTEM_INDEX + 2 + * elements (that is, 33 elements); + * floatValues must be a vector containing Obd2FloatSensorIndex.LAST_SYSTEM_INDEX + 3 + * elements (that is, 73 elements); * - * For example, int32Values[0] corresponds to FUEL_SYSTEM_STATUS, and - * floatValues[0] corresponds to CALCULATED_ENGINE_LOAD, but that mapping - * is only valid if the corresponding bits in the bytes vector are set to 1. + * It is possible for each frame to contain a different subset of sensor values, both system + * provided sensors, and vendor-specific ones. In order to support that, the bytes element + * of the property value is used as a bitmask,. + * + * bytes must have a sufficient number of bytes to represent the total number of possible + * sensors (in this case, 14 bytes to represent 106 possible values); it is to be read as + * a contiguous bitmask such that each bit indicates the presence or absence of a sensor + * from the frame, starting with as many bits as the size of int32Values, immediately + * followed by as many bits as the size of floatValues. + * + * For example, should bytes[0] = 0x4C (0b01001100) it would mean that: + * int32Values[0 and 1] are not valid sensor values + * int32Values[2 and 3] are valid sensor values + * int32Values[4 and 5] are not valid sensor values + * int32Values[6] is a valid sensor value + * int32Values[7] is not a valid sensor value + * Should bytes[5] = 0x61 (0b01100001) it would mean that: + * int32Values[32] is a valid sensor value + * floatValues[0 thru 3] are not valid sensor values + * floatValues[4 and 5] are valid sensor values + * floatValues[6] is not a valid sensor value * * @change_mode VehiclePropertyChangeMode:ON_CHANGE * @access VehiclePropertyAccess:READ @@ -171,41 +178,23 @@ enum VehicleProperty: @2.0::VehicleProperty { /** * OBD2 Freeze Frame Sensor Data * - * This property uses COMPLEX data to send a snapshot of the values of the - * OBD2 sensors provided by the vehicle at the time that a diagnostic - * troubleshooting code (DTC) was recorded by the vehicle. + * Reports a snapshot of the value of the OBD2 sensors available at the time that a fault + * occurred and was detected. * - * VehiclePropConfig - * configArray[0] : number of vendor-specific integer-valued sensors - * that can be returned in a frame. - * configArray[1] : number of vendor-specific float-valued sensors - * that can be returned in a frame. + * A configArray must be provided with the same meaning as defined for OBD2_LIVE_FRAME. * - * A get of this property must take the following form: - * int64Values[0]: timestamp of the freeze frame to retrieve. - * Valid timestamps are given by OBD2_DTC_INFO. + * The values of this property are to be interpreted in a similar fashion as those for + * OBD2_LIVE_FRAME, with the exception that the stringValue field may contain a non-empty + * diagnostic troubleshooting code (DTC). * - * The values are to be interpreted as follows: - * the indices defined in Obd2IntegerSensorIndex are to be used to - * read from int32Values; - * the indices defined in Obd2FloatSensorIndex are to be used to - * read from floatValues; - * the elements of bytes are to be interpreted as a bitmask, such that - * the bits 0 thru the integer value of - * Obd2IntegerSensorIndex.LAST_SYSTEM_INDEX + the value of configArray[0] - * are 1 if the corresponding index is a valid sensor index whose value can - * be read in the returned int32Values vector, 0 otherwise. - * the bits Obd2IntegerSensorIndex.LAST_SYSTEM_INDEX+1 thru - * Obd2FloatingSensorIndex.LAST_SYSTEM_INDEX + the value of configArray[1] - * are 1 if the corresponding index is a valid sensor index whose value - * can be read in the returned floatValues vector, 0 otherwise. - * stringValue is the DTC that caused this freeze frame to be recorded. + * A IVehicle#get request of this property must provide a value for int64Values[0]. + * This will be interpreted as the timestamp of the freeze frame to retrieve. A list of + * timestamps can be obtained by a IVehicle#get of OBD2_FREEZE_FRAME_INFO. * - * For example, int32Values[0] corresponds to FUEL_SYSTEM_STATUS, and - * floatValues[0] corresponds to CALCULATED_ENGINE_LOAD, but that mapping - * is only valid if the corresponding bits in the bytes vector are set to 1, - * and a possible valid stringValue is "P0176" to indicate a malfunction - * of the fuel composition sensor circuit. + * Should no freeze frame be available at the given timestamp, a response of NOT_AVAILABLE + * must be returned by the implementation. Because vehicles may have limited storage for + * freeze frames, it is possible for a frame request to respond with NOT_AVAILABLE even if + * the associated timestamp has been recently obtained via OBD2_FREEZE_FRAME_INFO. * * @change_mode VehiclePropertyChangeMode:ON_CHANGE * @access VehiclePropertyAccess:READ @@ -223,7 +212,7 @@ enum VehicleProperty: @2.0::VehicleProperty { * memory and available for retrieval via OBD2_FREEZE_FRAME. * * The values are to be interpreted as follows: - * each element of int64Values is the timestamp at which a a fault code + * each element of int64Values must be the timestamp at which a a fault code * has been detected and the corresponding freeze frame stored, and each * such element can be used as the key to OBD2_FREEZE_FRAME to retrieve * the corresponding freeze frame. @@ -241,14 +230,18 @@ enum VehicleProperty: @2.0::VehicleProperty { * OBD2 Freeze Frame Clear * * This property allows deletion of any of the freeze frames stored in - * vehicle memory, as described by OBD2_DTC_INFO. + * vehicle memory, as described by OBD2_FREEZE_FRAME_INFO. * - * A set of this property is to be interpreted as follows: - * if int64Values contains no elements, then all DTCs stored will be cleared; - * if int64Values contains one or more elements, then DTCs at the timestamps - * stored in int64Values will be cleared, and the others not cleared, except - * the memory will be compacted so that all remaining DTCs are stored - * contiguously. + * The configArray is set as follows: + * configArray[0] = 1 if the implementation is able to clear individual freeze frames + * by timestamp, 0 otherwise + * + * IVehicle#set of this property is to be interpreted as follows: + * if int64Values contains no elements, then all frames stored must be cleared; + * if int64Values contains one or more elements, then frames at the timestamps + * stored in int64Values must be cleared, and the others not cleared. Should the + * vehicle not support selective clearing of freeze frames, this latter mode must + * return NOT_AVAILABLE. * * @change_mode VehiclePropertyChangeMode:ON_CHANGE * @access VehiclePropertyAccess:WRITE From 13735eae6d98039113ce11c1e2808adc6b1aa948 Mon Sep 17 00:00:00 2001 From: Sanket Padawe Date: Mon, 24 Jul 2017 14:05:05 -0700 Subject: [PATCH 083/265] Update IRadioResponse.hal to add new error codes. Bug: 62926561 Test: Only build test as its only doc update. Change-Id: Ia94aa11a8a4bb8672811158c5daf80a1ae1470da --- current.txt | 1 + radio/1.0/IRadioResponse.hal | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/current.txt b/current.txt index 67f1169c6d..8488bf3ff5 100644 --- a/current.txt +++ b/current.txt @@ -192,6 +192,7 @@ fe3c3c2f572b72f15f8594c538b0577bd5c28722c31879cfe6231330cddb6747 android.hardwar 150a338ce11fcec70757c9675d83cf6a5d7b40d0c812741b91671fecce59eac9 android.hardware.broadcastradio@1.0::types 760485232f6cce07f8bb05e3475509956996b702f77415ee5bff05e2ec5a5bcc android.hardware.dumpstate@1.0::IDumpstateDevice e822cb7f4a1bdd45689c5e92ccd19a2201c20b771bd4b2ec1ae627e324591f9d android.hardware.radio@1.0::IRadioResponse +6e69adb24d7c0b0ca3a54a38c49a5625b161b3f5d5f7d6fda0befdbbfc8e9e06 android.hardware.radio@1.0::IRadioResponse 28e929b453df3d9f5060af2764e6cdb123ddb893e3e86923c877f6ff7e5f02c9 android.hardware.wifi@1.0::types # HALs released in Android O MR1 diff --git a/radio/1.0/IRadioResponse.hal b/radio/1.0/IRadioResponse.hal index a94aac3352..94b304a198 100644 --- a/radio/1.0/IRadioResponse.hal +++ b/radio/1.0/IRadioResponse.hal @@ -161,6 +161,7 @@ interface IRadioResponse { * RadioError:NO_RESOURCES * RadioError:CANCELLED * RadioError:REQUEST_NOT_SUPPORTED + * RadioError:SIM_ABSENT */ oneway supplyNetworkDepersonalizationResponse(RadioResponseInfo info, int32_t remainingRetries); @@ -544,6 +545,7 @@ interface IRadioResponse { * RadioError:OPERATION_NOT_ALLOWED * RadioError:NO_RESOURCES * RadioError:CANCELLED + * RadioError:SIM_ABSENT */ oneway sendSmsResponse(RadioResponseInfo info, SendSmsResult sms); @@ -574,6 +576,7 @@ interface IRadioResponse { * RadioError:OPERATION_NOT_ALLOWED * RadioError:NO_RESOURCES * RadioError:CANCELLED + * RadioError:SIM_ABSENT */ oneway sendSMSExpectMoreResponse(RadioResponseInfo info, SendSmsResult sms); @@ -594,6 +597,7 @@ interface IRadioResponse { * RadioError:NO_MEMORY * RadioError:NO_RESOURCES * RadioError:CANCELLED + * RadioError:SIM_ABSENT */ oneway setupDataCallResponse(RadioResponseInfo info, SetupDataCallResult dcResponse); @@ -860,6 +864,7 @@ interface IRadioResponse { * RadioError:NO_MEMORY * RadioError:NO_RESOURCES * RadioError:CANCELLED + * RadioError:SIM_ABSENT */ oneway deactivateDataCallResponse(RadioResponseInfo info); @@ -1166,6 +1171,7 @@ interface IRadioResponse { * RadioError:NO_RESOURCES * RadioError:CANCELLED * RadioError:REQUEST_NOT_SUPPORTED + * RadioError:SIM_ABSENT */ oneway getDataCallListResponse(RadioResponseInfo info, vec dcResponse); @@ -1210,6 +1216,7 @@ interface IRadioResponse { * RadioError:REQUEST_NOT_SUPPORTED * RadioError:CANCELLED * RadioError:INVALID_MODEM_STATE + * RadioError:SIM_ABSENT */ oneway writeSmsToSimResponse(RadioResponseInfo info, int32_t index); @@ -1231,6 +1238,7 @@ interface IRadioResponse { * RadioError:NO_RESOURCES * RadioError:CANCELLED * RadioError:INVALID_MODEM_STATE + * RadioError:SIM_ABSENT */ oneway deleteSmsOnSimResponse(RadioResponseInfo info); @@ -1615,6 +1623,7 @@ interface IRadioResponse { * RadioError:ENCODING_ERR * RadioError:NO_RESOURCES * RadioError:CANCELLED + * RadioError:SIM_ABSENT */ oneway sendCdmaSmsResponse(RadioResponseInfo info, SendSmsResult sms); @@ -1819,6 +1828,7 @@ interface IRadioResponse { * RadioError:NO_RESOURCES * RadioError:CANCELLED * RadioError:INVALID_MODEM_STATE + * RadioError:SIM_ABSENT */ oneway writeSmsToRuimResponse(RadioResponseInfo info, uint32_t index); @@ -1839,6 +1849,8 @@ interface IRadioResponse { * RadioError:NO_RESOURCES * RadioError:CANCELLED * RadioError:INVALID_MODEM_STATE + * RadioError:OPERATION_NOT_ALLOWED + * RadioError:SIM_ABSENT */ oneway deleteSmsOnRuimResponse(RadioResponseInfo info); @@ -1906,6 +1918,7 @@ interface IRadioResponse { * RadioError:OPERATION_NOT_ALLOWED * RadioError:NO_RESOURCES * RadioError:CANCELLED + * RadioError:SIM_ABSENT */ oneway getSmscAddressResponse(RadioResponseInfo info, string smsc); @@ -1927,6 +1940,7 @@ interface IRadioResponse { * RadioError:OPERATION_NOT_ALLOWED * RadioError:NO_RESOURCES * RadioError:CANCELLED + * RadioError:SIM_ABSENT */ oneway setSmscAddressResponse(RadioResponseInfo info); @@ -1946,6 +1960,7 @@ interface IRadioResponse { * RadioError:REQUEST_NOT_SUPPORTED * RadioError:NO_RESOURCES * RadioError:CANCELLED + * RadioError:SIM_ABSENT */ oneway reportSmsMemoryStatusResponse(RadioResponseInfo info); @@ -2024,6 +2039,7 @@ interface IRadioResponse { * RadioError:NO_RESOURCES * RadioError:CANCELLED * RadioError:REQUEST_NOT_SUPPORTED + * RadioError:SIM_ABSENT */ oneway sendEnvelopeWithStatusResponse(RadioResponseInfo info, IccIoResult iccIo); @@ -2328,6 +2344,7 @@ interface IRadioResponse { * RadioError:NO_RESOURCES * RadioError:CANCELLED * RadioError:REQUEST_NOT_SUPPORTED + * RadioError:SIM_ABSENT */ oneway setDataProfileResponse(RadioResponseInfo info); @@ -2414,6 +2431,7 @@ interface IRadioResponse { * RadioError:NO_RESOURCES * RadioError:CANCELLED * RadioError:REQUEST_NOT_SUPPORTED + * RadioError:SIM_ABSENT */ oneway stopLceServiceResponse(RadioResponseInfo info, LceStatusInfo statusInfo); @@ -2430,6 +2448,7 @@ interface IRadioResponse { * RadioError:NO_RESOURCES * RadioError:CANCELLED * RadioError:REQUEST_NOT_SUPPORTED + * RadioError:SIM_ABSENT */ oneway pullLceDataResponse(RadioResponseInfo info, LceDataInfo lceInfo); From 376ec0c0fd4a3f6b661599f37a03d66cbde9caa7 Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Thu, 27 Jul 2017 18:28:20 -0700 Subject: [PATCH 084/265] Move neuralnetworks HAL to hardware/interfaces The neuralnetworks hal was placed in frameworks/ml/nn/hardware/interfaces while VTS tests were being developed. This CL moves it to hardware/interfaces and another CL removes it from frameworks/ml/nn/hardware/interfaces. VTS tests included in a sibling CL in this topic. Bug: 63905942 Test: mm -j40 Change-Id: I0e6c84de72a763edbaef3e9b3063c3ecca216337 --- neuralnetworks/1.0/Android.bp | 70 +++++++++++ neuralnetworks/1.0/IDevice.hal | 31 +++++ neuralnetworks/1.0/IPreparedModel.hal | 25 ++++ neuralnetworks/1.0/types.hal | 174 ++++++++++++++++++++++++++ neuralnetworks/Android.bp | 4 + 5 files changed, 304 insertions(+) create mode 100644 neuralnetworks/1.0/Android.bp create mode 100644 neuralnetworks/1.0/IDevice.hal create mode 100644 neuralnetworks/1.0/IPreparedModel.hal create mode 100644 neuralnetworks/1.0/types.hal create mode 100644 neuralnetworks/Android.bp diff --git a/neuralnetworks/1.0/Android.bp b/neuralnetworks/1.0/Android.bp new file mode 100644 index 0000000000..1356d33d1c --- /dev/null +++ b/neuralnetworks/1.0/Android.bp @@ -0,0 +1,70 @@ +// This file is autogenerated by hidl-gen. Do not edit manually. + +filegroup { + name: "android.hardware.neuralnetworks@1.0_hal", + srcs: [ + "types.hal", + "IDevice.hal", + "IPreparedModel.hal", + ], +} + +genrule { + name: "android.hardware.neuralnetworks@1.0_genc++", + tools: ["hidl-gen"], + cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.neuralnetworks@1.0", + srcs: [ + ":android.hardware.neuralnetworks@1.0_hal", + ], + out: [ + "android/hardware/neuralnetworks/1.0/types.cpp", + "android/hardware/neuralnetworks/1.0/DeviceAll.cpp", + "android/hardware/neuralnetworks/1.0/PreparedModelAll.cpp", + ], +} + +genrule { + name: "android.hardware.neuralnetworks@1.0_genc++_headers", + tools: ["hidl-gen"], + cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.neuralnetworks@1.0", + srcs: [ + ":android.hardware.neuralnetworks@1.0_hal", + ], + out: [ + "android/hardware/neuralnetworks/1.0/types.h", + "android/hardware/neuralnetworks/1.0/hwtypes.h", + "android/hardware/neuralnetworks/1.0/IDevice.h", + "android/hardware/neuralnetworks/1.0/IHwDevice.h", + "android/hardware/neuralnetworks/1.0/BnHwDevice.h", + "android/hardware/neuralnetworks/1.0/BpHwDevice.h", + "android/hardware/neuralnetworks/1.0/BsDevice.h", + "android/hardware/neuralnetworks/1.0/IPreparedModel.h", + "android/hardware/neuralnetworks/1.0/IHwPreparedModel.h", + "android/hardware/neuralnetworks/1.0/BnHwPreparedModel.h", + "android/hardware/neuralnetworks/1.0/BpHwPreparedModel.h", + "android/hardware/neuralnetworks/1.0/BsPreparedModel.h", + ], +} + +cc_library_shared { + name: "android.hardware.neuralnetworks@1.0", + defaults: ["hidl-module-defaults"], + generated_sources: ["android.hardware.neuralnetworks@1.0_genc++"], + generated_headers: ["android.hardware.neuralnetworks@1.0_genc++_headers"], + export_generated_headers: ["android.hardware.neuralnetworks@1.0_genc++_headers"], + vendor_available: true, + shared_libs: [ + "libhidlbase", + "libhidltransport", + "libhwbinder", + "liblog", + "libutils", + "libcutils", + ], + export_shared_lib_headers: [ + "libhidlbase", + "libhidltransport", + "libhwbinder", + "libutils", + ], +} diff --git a/neuralnetworks/1.0/IDevice.hal b/neuralnetworks/1.0/IDevice.hal new file mode 100644 index 0000000000..b826b23774 --- /dev/null +++ b/neuralnetworks/1.0/IDevice.hal @@ -0,0 +1,31 @@ +/* + * Copyright (C) 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. + */ + +/* This HAL is a work in progress */ + +package android.hardware.neuralnetworks@1.0; + +import IPreparedModel; + +interface IDevice { + initialize() generates(Capabilities capabilities); + + getSupportedSubgraph(Model model) generates(vec supported); + + prepareModel(Model model) generates(IPreparedModel preparedModel); + + getStatus() generates(DeviceStatus status); +}; diff --git a/neuralnetworks/1.0/IPreparedModel.hal b/neuralnetworks/1.0/IPreparedModel.hal new file mode 100644 index 0000000000..566d6ace44 --- /dev/null +++ b/neuralnetworks/1.0/IPreparedModel.hal @@ -0,0 +1,25 @@ +/* + * Copyright (C) 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. + */ + +/* This HAL is a work in progress */ + +package android.hardware.neuralnetworks@1.0; + +interface IPreparedModel { + // TODO: The execution is synchronous. Change that to have a callback on completion. + // Multiple threads can call this execute function concurrently. + execute(Request request) generates(bool success); +}; diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal new file mode 100644 index 0000000000..ccc17f144e --- /dev/null +++ b/neuralnetworks/1.0/types.hal @@ -0,0 +1,174 @@ +/* + * Copyright (C) 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. + */ + +/* This HAL is a work in progress */ + +package android.hardware.neuralnetworks@1.0; + +// The types an operand can have. +// These values are the same as found in the NeuralNetworks.h file. +// When modifying, be sure to update HAL_NUM_OPERAND_TYPES in HalIntefaces.h. +enum OperandType : uint32_t { + FLOAT16 = 0, + FLOAT32 = 1, + INT8 = 2, + UINT8 = 3, + INT16 = 4, + UINT16 = 5, + INT32 = 6, + UINT32 = 7, + TENSOR_FLOAT16 = 8, + TENSOR_FLOAT32 = 9, + TENSOR_SYMMETRICAL_QUANT8 = 10, +}; + +// The type of operations. Unlike the operation types found in +// NeuralNetworks.h file, these specify the data type they operate on. +// This is done to simplify the work of drivers. +// TODO: Currently they are the same. Add a conversion when finalizing the model. +// When modifying, be sure to update HAL_NUM_OPERATION_TYPES in HalIntefaces.h. +enum OperationType : uint32_t { + AVERAGE_POOL_FLOAT32 = 0, + CONCATENATION_FLOAT32 = 1, + CONV_FLOAT32 = 2, + DEPTHWISE_CONV_FLOAT32 = 3, + MAX_POOL_FLOAT32 = 4, + L2_POOL_FLOAT32 = 5, + DEPTH_TO_SPACE_FLOAT32 = 6, + SPACE_TO_DEPTH_FLOAT32 = 7, + LOCAL_RESPONSE_NORMALIZATION_FLOAT32 = 8, + SOFTMAX_FLOAT32 = 9, + RESHAPE_FLOAT32 = 10, + SPLIT_FLOAT32 = 11, + FAKE_QUANT_FLOAT32 = 12, + ADD_FLOAT32 = 13, + FULLY_CONNECTED_FLOAT32 = 14, + CAST_FLOAT32 = 15, + MUL_FLOAT32 = 16, + L2_NORMALIZATION_FLOAT32 = 17, + LOGISTIC_FLOAT32 = 18, + RELU_FLOAT32 = 19, + RELU6_FLOAT32 = 20, + RELU1_FLOAT32 = 21, + TANH_FLOAT32 = 22, + DEQUANTIZE_FLOAT32 = 23, + FLOOR_FLOAT32 = 24, + GATHER_FLOAT32 = 25, + RESIZE_BILINEAR_FLOAT32 = 26, + LSH_PROJECTION_FLOAT32 = 27, + LSTM_FLOAT32 = 28, + SVDF_FLOAT32 = 29, + RNN_FLOAT32 = 30, + N_GRAM_FLOAT32 = 31, + LOOKUP_FLOAT32 = 32, +}; + +// Two special values that can be used instead of a regular poolIndex. +enum LocationValues : uint32_t { + // The location will be specified at runtime. It's either a temporary + // variable, an input, or an output. + LOCATION_AT_RUN_TIME = 0xFFFFFFFF, + // The operand's value is stored in the + // TODO: Only for old + LOCATION_SAME_BLOCK = 0xFFFFFFFE +}; + +// Status of a device. +enum DeviceStatus : uint32_t { + AVAILABLE, + BUSY, + OFFLINE, + UNKNOWN // Do we need this? +}; + +// For the reference workload +// Used by a driver to report its performance characteristics. +// TODO revisit the data types and scales. +struct PerformanceInfo { + float execTime; // in nanoseconds + float powerUsage; // in picoJoules +}; + +// The capabilities of a driver. +struct Capabilities { + vec supportedOperationTypes; + // TODO Do the same for baseline model IDs + bool cachesCompilation; + // TODO revisit the data types and scales. + float bootupTime; // in nanoseconds + PerformanceInfo float16Performance; + PerformanceInfo float32Performance; + PerformanceInfo quantized8Performance; +}; + +// Describes the location of a data object. +struct DataLocation { + // The index of the memory pool where this location is found. + // Two special values can also be used. See the LOCATION_* constants above. + uint32_t poolIndex; + // Offset in bytes from the start of the pool. + uint32_t offset; + // The length of the data, in bytes. + uint32_t length; +}; + +struct Operand { + OperandType type; + vec dimensions; + + // The number of operations that uses this operand as input. + // TODO It would be nice to track the actual consumers, e.g. vec consumers; + uint32_t numberOfConsumers; + + float scale; + int32_t zeroPoint; + + // Where to find the data for this operand. + DataLocation location; +}; + +// Describes one operation of the graph. +struct Operation { + // The type of operation. + OperationType type; + // Describes the table that contains the indexes of the inputs of the + // operation. The offset is the index in the operandIndexes table. + vec inputs; + // Describes the table that contains the indexes of the outputs of the + // operation. The offset is the index in the operandIndexes table. + vec outputs; +}; + +struct InputOutputInfo { + DataLocation location; + // If dimensions.size() > 0, we have updated dimensions. + vec dimensions; +}; + +struct Model { + vec operands; + vec operations; + vec inputIndexes; + vec outputIndexes; + vec operandValues; + vec pools; +}; + +struct Request { + vec inputs; + vec outputs; + vec pools; +}; diff --git a/neuralnetworks/Android.bp b/neuralnetworks/Android.bp new file mode 100644 index 0000000000..bbb3e4bac0 --- /dev/null +++ b/neuralnetworks/Android.bp @@ -0,0 +1,4 @@ +// This is an autogenerated file, do not edit. +subdirs = [ + "1.0", +] From 753c1d1ef27a7f0519c954ffa462fae0cfb18976 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Tue, 25 Jul 2017 14:55:49 -0700 Subject: [PATCH 085/265] Implement closing default radio implementation by invalidating all future calls. Also, use the new hidl_vec range constructor. Bug: b/36864090 Test: VTS Change-Id: I92a22ab7f263edd39e42abb65bc25b3d3dc33a1e --- broadcastradio/1.1/default/Tuner.cpp | 61 ++++++++++++++----- broadcastradio/1.1/default/Tuner.h | 2 +- broadcastradio/1.1/default/VirtualProgram.cpp | 2 +- broadcastradio/1.1/utils/Utils.cpp | 4 +- 4 files changed, 50 insertions(+), 19 deletions(-) diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index 2985d42377..0723cf7762 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -66,6 +66,8 @@ void Tuner::forceClose() { Return Tuner::setConfiguration(const BandConfig& config) { ALOGV("%s", __func__); + lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; if (config.lowerLimit >= config.upperLimit) return Result::INVALID_ARGUMENTS; @@ -87,14 +89,14 @@ Return Tuner::setConfiguration(const BandConfig& config) { Return Tuner::getConfiguration(getConfiguration_cb _hidl_cb) { ALOGV("%s", __func__); - lock_guard lk(mMut); - if (mIsAmfmConfigSet) { + + if (!mIsClosed && mIsAmfmConfigSet) { _hidl_cb(Result::OK, mAmfmConfig); } else { _hidl_cb(Result::NOT_INITIALIZED, {}); } - return Void(); + return {}; } // makes ProgramInfo that points to no program @@ -140,6 +142,8 @@ void Tuner::tuneInternalLocked(const ProgramSelector& sel) { Return Tuner::scan(Direction direction, bool skipSubChannel __unused) { ALOGV("%s", __func__); lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; + vector list; if (isFmLocked()) { @@ -196,9 +200,10 @@ Return Tuner::scan(Direction direction, bool skipSubChannel __unused) { Return Tuner::step(Direction direction, bool skipSubChannel) { ALOGV("%s", __func__); - ALOGW_IF(!skipSubChannel, "can't step to next frequency without ignoring subChannel"); - lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; + + ALOGW_IF(!skipSubChannel, "can't step to next frequency without ignoring subChannel"); if (!utils::isAmFm(utils::getType(mCurrentProgram))) { ALOGE("Can't step in anything else than AM/FM"); @@ -244,8 +249,8 @@ Return Tuner::tune(uint32_t channel, uint32_t subChannel) { Return Tuner::tune_1_1(const ProgramSelector& sel) { ALOGV("%s(%s)", __func__, toString(sel).c_str()); - lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; if (utils::isAmFm(utils::getType(mCurrentProgram))) { ALOGW_IF(!mIsAmfmConfigSet, "AM/FM config not set"); @@ -269,12 +274,18 @@ Return Tuner::tune_1_1(const ProgramSelector& sel) { Return Tuner::cancel() { ALOGV("%s", __func__); + lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; + mThread.cancelAll(); return Result::OK; } Return Tuner::cancelAnnouncement() { ALOGV("%s", __func__); + lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; + return Result::OK; } @@ -287,46 +298,64 @@ Return Tuner::getProgramInformation(getProgramInformation_cb _hidl_cb) { Return Tuner::getProgramInformation_1_1(getProgramInformation_1_1_cb _hidl_cb) { ALOGV("%s", __func__); - lock_guard lk(mMut); - if (mIsTuneCompleted) { + + if (mIsClosed) { + _hidl_cb(Result::NOT_INITIALIZED, {}); + } else if (mIsTuneCompleted) { _hidl_cb(Result::OK, mCurrentProgramInfo); } else { _hidl_cb(Result::NOT_INITIALIZED, makeDummyProgramInfo(mCurrentProgram)); } - return Void(); + return {}; } Return Tuner::startBackgroundScan() { ALOGV("%s", __func__); + lock_guard lk(mMut); + if (mIsClosed) return ProgramListResult::NOT_INITIALIZED; + return ProgramListResult::UNAVAILABLE; } -Return Tuner::getProgramList(const hidl_string& filter __unused, getProgramList_cb _hidl_cb) { - ALOGV("%s", __func__); +Return Tuner::getProgramList(const hidl_string& filter, getProgramList_cb _hidl_cb) { + ALOGV("%s(%s)", __func__, filter.c_str()); lock_guard lk(mMut); + if (mIsClosed) { + _hidl_cb(ProgramListResult::NOT_INITIALIZED, {}); + return {}; + } auto& virtualRadio = mVirtualFm; if (!isFmLocked()) { ALOGI("bands other than FM are not supported yet"); _hidl_cb(ProgramListResult::OK, {}); - return Void(); + return {}; } auto list = virtualRadio.getProgramList(); ALOGD("returning a list of %zu programs", list.size()); - _hidl_cb(ProgramListResult::OK, vector(list.begin(), list.end())); - return Void(); + _hidl_cb(ProgramListResult::OK, hidl_vec(list.begin(), list.end())); + return {}; } Return Tuner::isAnalogForced(isAnalogForced_cb _hidl_cb) { ALOGV("%s", __func__); - _hidl_cb(Result::OK, mIsAnalogForced); - return Void(); + lock_guard lk(mMut); + + if (mIsClosed) { + _hidl_cb(Result::NOT_INITIALIZED, false); + } else { + _hidl_cb(Result::OK, mIsAnalogForced); + } + return {}; } Return Tuner::setAnalogForced(bool isForced) { ALOGV("%s", __func__); + lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; + mIsAnalogForced = isForced; return Result::OK; } diff --git a/broadcastradio/1.1/default/Tuner.h b/broadcastradio/1.1/default/Tuner.h index 3efbd09ebb..c785586ec7 100644 --- a/broadcastradio/1.1/default/Tuner.h +++ b/broadcastradio/1.1/default/Tuner.h @@ -53,7 +53,7 @@ struct Tuner : public ITuner { private: std::mutex mMut; WorkerThread mThread; - bool mIsClosed = false; // TODO(b/36864090): use it + bool mIsClosed = false; const sp mCallback; const sp mCallback1_1; diff --git a/broadcastradio/1.1/default/VirtualProgram.cpp b/broadcastradio/1.1/default/VirtualProgram.cpp index 4c6b3b1b59..ef0e124a5d 100644 --- a/broadcastradio/1.1/default/VirtualProgram.cpp +++ b/broadcastradio/1.1/default/VirtualProgram.cpp @@ -41,7 +41,7 @@ static MetaData createDemoBitmap(MetadataKey key) { if (gHalVersion < 2) { bmp.type = MetadataType::RAW; bmp.intValue = 0; - bmp.rawValue = std::vector(resources::demoPng, std::end(resources::demoPng)); + bmp.rawValue = hidl_vec(resources::demoPng, std::end(resources::demoPng)); } return bmp; } diff --git a/broadcastradio/1.1/utils/Utils.cpp b/broadcastradio/1.1/utils/Utils.cpp index 8bb7691794..50a407c7b7 100644 --- a/broadcastradio/1.1/utils/Utils.cpp +++ b/broadcastradio/1.1/utils/Utils.cpp @@ -53,7 +53,9 @@ static bool anyHaveId(const ProgramSelector& a, const ProgramSelector& b, static bool haveEqualIds(const ProgramSelector& a, const ProgramSelector& b, const IdentifierType type) { if (!bothHaveId(a, b, type)) return false; - // TODO(b/36864090): we should check all Ids of a given type (ie. other AF), not just one + /* We should check all Ids of a given type (ie. other AF), + * but it doesn't matter for default implementation. + */ auto aId = getId(a, type); auto bId = getId(b, type); return aId == bId; From 5be4c2b6e3bd1c6c30b5ecf8debd1db441805a3e Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Thu, 27 Jul 2017 13:17:07 -0700 Subject: [PATCH 086/265] Remove a hack for 1.0/1.1 bitmap compatibility. Instead, implement it correctly. This hack was a quick jury-rigging before O MR1 FC. Bug: b/36864090 Test: VTS Change-Id: Ia9caff9228518ec573a85437e9070db777057359 --- broadcastradio/1.1/default/Tuner.cpp | 18 ++++++++---- broadcastradio/1.1/default/Tuner.h | 1 + broadcastradio/1.1/default/VirtualProgram.cpp | 29 +++++++++++-------- broadcastradio/1.1/default/VirtualProgram.h | 11 +++---- .../include/broadcastradio-utils/Utils.h | 6 ++++ 5 files changed, 42 insertions(+), 23 deletions(-) diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index 0723cf7762..2af221eb34 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -34,6 +34,7 @@ using namespace std::chrono_literals; using V1_0::Band; using V1_0::BandConfig; using V1_0::Direction; +using utils::HalRevision; using std::chrono::milliseconds; using std::lock_guard; @@ -53,10 +54,7 @@ Tuner::Tuner(const sp& callback) : mCallback(callback), mCallback1_1(ITunerCallback::castFrom(callback).withDefault(nullptr)), mVirtualFm(make_fm_radio()), - mIsAnalogForced(false) { - // TODO (b/36864090): inject this data in a more elegant way - setCompatibilityLevel(mCallback1_1 == nullptr ? 1 : 2); -} + mIsAnalogForced(false) {} void Tuner::forceClose() { lock_guard lk(mMut); @@ -111,6 +109,14 @@ static ProgramInfo makeDummyProgramInfo(const ProgramSelector& selector) { return info11; } +HalRevision Tuner::getHalRev() const { + if (mCallback1_1 != nullptr) { + return HalRevision::V1_1; + } else { + return HalRevision::V1_0; + } +} + bool Tuner::isFmLocked() { if (!utils::isAmFm(utils::getType(mCurrentProgram))) return false; return mAmfmConfig.type == Band::FM_HD || mAmfmConfig.type == Band::FM; @@ -125,7 +131,7 @@ void Tuner::tuneInternalLocked(const ProgramSelector& sel) { VirtualProgram virtualProgram; if (virtualRadio != nullptr && virtualRadio->getProgram(sel, virtualProgram)) { mCurrentProgram = virtualProgram.selector; - mCurrentProgramInfo = static_cast(virtualProgram); + mCurrentProgramInfo = virtualProgram.getProgramInfo(getHalRev()); } else { mCurrentProgram = sel; mCurrentProgramInfo = makeDummyProgramInfo(sel); @@ -335,7 +341,7 @@ Return Tuner::getProgramList(const hidl_string& filter, getProgramList_cb auto list = virtualRadio.getProgramList(); ALOGD("returning a list of %zu programs", list.size()); - _hidl_cb(ProgramListResult::OK, hidl_vec(list.begin(), list.end())); + _hidl_cb(ProgramListResult::OK, getProgramInfoVector(list, getHalRev())); return {}; } diff --git a/broadcastradio/1.1/default/Tuner.h b/broadcastradio/1.1/default/Tuner.h index c785586ec7..af19ec0f02 100644 --- a/broadcastradio/1.1/default/Tuner.h +++ b/broadcastradio/1.1/default/Tuner.h @@ -67,6 +67,7 @@ struct Tuner : public ITuner { ProgramInfo mCurrentProgramInfo = {}; std::atomic mIsAnalogForced; + utils::HalRevision getHalRev() const; void tuneInternalLocked(const ProgramSelector& sel); bool isFmLocked(); // TODO(b/36864090): make it generic, not FM only }; diff --git a/broadcastradio/1.1/default/VirtualProgram.cpp b/broadcastradio/1.1/default/VirtualProgram.cpp index ef0e124a5d..1c2285d35a 100644 --- a/broadcastradio/1.1/default/VirtualProgram.cpp +++ b/broadcastradio/1.1/default/VirtualProgram.cpp @@ -25,20 +25,16 @@ namespace broadcastradio { namespace V1_1 { namespace implementation { +using std::vector; + using V1_0::MetaData; using V1_0::MetadataKey; using V1_0::MetadataType; +using utils::HalRevision; -// TODO (b/36864090): inject this data in a more elegant way -static int gHalVersion = 2; // 1 = 1.0, 2 = 1.1 - -void setCompatibilityLevel(int halversion) { - gHalVersion = halversion; -} - -static MetaData createDemoBitmap(MetadataKey key) { +static MetaData createDemoBitmap(MetadataKey key, HalRevision halRev) { MetaData bmp = {MetadataType::INT, key, resources::demoPngId, {}, {}, {}}; - if (gHalVersion < 2) { + if (halRev < HalRevision::V1_1) { bmp.type = MetadataType::RAW; bmp.intValue = 0; bmp.rawValue = hidl_vec(resources::demoPng, std::end(resources::demoPng)); @@ -46,7 +42,7 @@ static MetaData createDemoBitmap(MetadataKey key) { return bmp; } -VirtualProgram::operator ProgramInfo() const { +ProgramInfo VirtualProgram::getProgramInfo(HalRevision halRev) const { ProgramInfo info11 = {}; auto& info10 = info11.base; @@ -61,8 +57,8 @@ VirtualProgram::operator ProgramInfo() const { {MetadataType::TEXT, MetadataKey::RDS_PS, {}, {}, programName, {}}, {MetadataType::TEXT, MetadataKey::TITLE, {}, {}, songTitle, {}}, {MetadataType::TEXT, MetadataKey::ARTIST, {}, {}, songArtist, {}}, - createDemoBitmap(MetadataKey::ICON), - createDemoBitmap(MetadataKey::ART), + createDemoBitmap(MetadataKey::ICON, halRev), + createDemoBitmap(MetadataKey::ART, halRev), }); return info11; @@ -89,6 +85,15 @@ bool operator<(const VirtualProgram& lhs, const VirtualProgram& rhs) { return false; } +vector getProgramInfoVector(const vector& vec, HalRevision halRev) { + vector out; + out.reserve(vec.size()); + for (auto&& program : vec) { + out.push_back(program.getProgramInfo(halRev)); + } + return out; +} + } // namespace implementation } // namespace V1_1 } // namespace broadcastradio diff --git a/broadcastradio/1.1/default/VirtualProgram.h b/broadcastradio/1.1/default/VirtualProgram.h index 2ee21a7064..33ec292215 100644 --- a/broadcastradio/1.1/default/VirtualProgram.h +++ b/broadcastradio/1.1/default/VirtualProgram.h @@ -17,7 +17,7 @@ #define ANDROID_HARDWARE_BROADCASTRADIO_V1_1_VIRTUALPROGRAM_H #include -#include +#include namespace android { namespace hardware { @@ -25,9 +25,6 @@ namespace broadcastradio { namespace V1_1 { namespace implementation { -// TODO (b/36864090): inject this data in a more elegant way -void setCompatibilityLevel(int halversion); - struct VirtualProgram { ProgramSelector selector; @@ -35,10 +32,14 @@ struct VirtualProgram { std::string songArtist = ""; std::string songTitle = ""; - explicit operator ProgramInfo() const; + ProgramInfo getProgramInfo(utils::HalRevision halRev) const; + friend bool operator<(const VirtualProgram& lhs, const VirtualProgram& rhs); }; +std::vector getProgramInfoVector(const std::vector& vec, + utils::HalRevision halRev); + } // namespace implementation } // namespace V1_1 } // namespace broadcastradio diff --git a/broadcastradio/1.1/utils/include/broadcastradio-utils/Utils.h b/broadcastradio/1.1/utils/include/broadcastradio-utils/Utils.h index a7da9fea4e..4d69c0a6aa 100644 --- a/broadcastradio/1.1/utils/include/broadcastradio-utils/Utils.h +++ b/broadcastradio/1.1/utils/include/broadcastradio-utils/Utils.h @@ -27,6 +27,12 @@ namespace broadcastradio { namespace V1_1 { namespace utils { +// TODO(b/64115813): move it out from frameworks/base/services/core/jni/BroadcastRadio/types.h +enum class HalRevision : uint32_t { + V1_0 = 1, + V1_1, +}; + /** * Checks, if {@code pointer} tunes to {@channel}. * From efadc19b6b41915b55834627f1303554135d9e0c Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Fri, 28 Jul 2017 10:08:46 -0700 Subject: [PATCH 087/265] Make virtual radio space generic, not only FM-exclusive. Bug: b/36864090 Test: VTS, instrumentalization Change-Id: I2764d09f56a397a1b80914a2634d6bad4b3bd3d2 --- broadcastradio/1.1/default/BroadcastRadio.cpp | 2 +- broadcastradio/1.1/default/Tuner.cpp | 45 ++++++++----------- broadcastradio/1.1/default/Tuner.h | 7 ++- broadcastradio/1.1/default/VirtualProgram.h | 6 +++ broadcastradio/1.1/default/VirtualRadio.cpp | 40 +++++++++++++++-- broadcastradio/1.1/default/VirtualRadio.h | 33 +++++++++++++- 6 files changed, 95 insertions(+), 38 deletions(-) diff --git a/broadcastradio/1.1/default/BroadcastRadio.cpp b/broadcastradio/1.1/default/BroadcastRadio.cpp index 7916407bdf..17ec7803ae 100644 --- a/broadcastradio/1.1/default/BroadcastRadio.cpp +++ b/broadcastradio/1.1/default/BroadcastRadio.cpp @@ -143,7 +143,7 @@ Return BroadcastRadio::openTuner(const BandConfig& config, bool audio __un mTuner = nullptr; } - sp newTuner = new Tuner(callback); + sp newTuner = new Tuner(mClassId, callback); mTuner = newTuner; if (mClassId == Class::AM_FM) { auto ret = newTuner->setConfiguration(config); diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index 2af221eb34..f48a8db369 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -33,6 +33,7 @@ using namespace std::chrono_literals; using V1_0::Band; using V1_0::BandConfig; +using V1_0::Class; using V1_0::Direction; using utils::HalRevision; @@ -50,10 +51,11 @@ const struct { milliseconds tune = 150ms; } gDefaultDelay; -Tuner::Tuner(const sp& callback) - : mCallback(callback), +Tuner::Tuner(V1_0::Class classId, const sp& callback) + : mClassId(classId), + mCallback(callback), mCallback1_1(ITunerCallback::castFrom(callback).withDefault(nullptr)), - mVirtualFm(make_fm_radio()), + mVirtualRadio(getRadio(classId)), mIsAnalogForced(false) {} void Tuner::forceClose() { @@ -66,6 +68,10 @@ Return Tuner::setConfiguration(const BandConfig& config) { ALOGV("%s", __func__); lock_guard lk(mMut); if (mIsClosed) return Result::NOT_INITIALIZED; + if (mClassId != Class::AM_FM) { + ALOGE("Can't set AM/FM configuration on SAT/DT radio tuner"); + return Result::INVALID_STATE; + } if (config.lowerLimit >= config.upperLimit) return Result::INVALID_ARGUMENTS; @@ -77,6 +83,12 @@ Return Tuner::setConfiguration(const BandConfig& config) { mAmfmConfig.antennaConnected = true; mCurrentProgram = utils::make_selector(mAmfmConfig.type, mAmfmConfig.lowerLimit); + if (mAmfmConfig.type == Band::FM_HD || mAmfmConfig.type == Band::FM) { + mVirtualRadio = std::ref(getFmRadio()); + } else { + mVirtualRadio = std::ref(getAmRadio()); + } + mIsAmfmConfigSet = true; mCallback->configChange(Result::OK, mAmfmConfig); }; @@ -117,19 +129,9 @@ HalRevision Tuner::getHalRev() const { } } -bool Tuner::isFmLocked() { - if (!utils::isAmFm(utils::getType(mCurrentProgram))) return false; - return mAmfmConfig.type == Band::FM_HD || mAmfmConfig.type == Band::FM; -} - void Tuner::tuneInternalLocked(const ProgramSelector& sel) { - VirtualRadio* virtualRadio = nullptr; - if (isFmLocked()) { - virtualRadio = &mVirtualFm; - } - VirtualProgram virtualProgram; - if (virtualRadio != nullptr && virtualRadio->getProgram(sel, virtualProgram)) { + if (mVirtualRadio.get().getProgram(sel, virtualProgram)) { mCurrentProgram = virtualProgram.selector; mCurrentProgramInfo = virtualProgram.getProgramInfo(getHalRev()); } else { @@ -150,11 +152,7 @@ Return Tuner::scan(Direction direction, bool skipSubChannel __unused) { lock_guard lk(mMut); if (mIsClosed) return Result::NOT_INITIALIZED; - vector list; - - if (isFmLocked()) { - list = mVirtualFm.getProgramList(); - } + auto list = mVirtualRadio.get().getProgramList(); if (list.empty()) { mIsTuneCompleted = false; @@ -332,14 +330,7 @@ Return Tuner::getProgramList(const hidl_string& filter, getProgramList_cb return {}; } - auto& virtualRadio = mVirtualFm; - if (!isFmLocked()) { - ALOGI("bands other than FM are not supported yet"); - _hidl_cb(ProgramListResult::OK, {}); - return {}; - } - - auto list = virtualRadio.getProgramList(); + auto list = mVirtualRadio.get().getProgramList(); ALOGD("returning a list of %zu programs", list.size()); _hidl_cb(ProgramListResult::OK, getProgramInfoVector(list, getHalRev())); return {}; diff --git a/broadcastradio/1.1/default/Tuner.h b/broadcastradio/1.1/default/Tuner.h index af19ec0f02..c4efe6ec4c 100644 --- a/broadcastradio/1.1/default/Tuner.h +++ b/broadcastradio/1.1/default/Tuner.h @@ -29,7 +29,7 @@ namespace V1_1 { namespace implementation { struct Tuner : public ITuner { - Tuner(const sp& callback); + Tuner(V1_0::Class classId, const sp& callback); void forceClose(); @@ -55,11 +55,11 @@ struct Tuner : public ITuner { WorkerThread mThread; bool mIsClosed = false; + V1_0::Class mClassId; const sp mCallback; const sp mCallback1_1; - VirtualRadio mVirtualFm; - + std::reference_wrapper mVirtualRadio; bool mIsAmfmConfigSet = false; V1_0::BandConfig mAmfmConfig; bool mIsTuneCompleted = false; @@ -69,7 +69,6 @@ struct Tuner : public ITuner { utils::HalRevision getHalRev() const; void tuneInternalLocked(const ProgramSelector& sel); - bool isFmLocked(); // TODO(b/36864090): make it generic, not FM only }; } // namespace implementation diff --git a/broadcastradio/1.1/default/VirtualProgram.h b/broadcastradio/1.1/default/VirtualProgram.h index 33ec292215..a14830d77a 100644 --- a/broadcastradio/1.1/default/VirtualProgram.h +++ b/broadcastradio/1.1/default/VirtualProgram.h @@ -25,6 +25,12 @@ namespace broadcastradio { namespace V1_1 { namespace implementation { +/** + * A radio program mock. + * + * This represents broadcast waves flying over the air, + * not an entry for a captured station in the radio tuner memory. + */ struct VirtualProgram { ProgramSelector selector; diff --git a/broadcastradio/1.1/default/VirtualRadio.cpp b/broadcastradio/1.1/default/VirtualRadio.cpp index 692e7bc91c..36d47a92e7 100644 --- a/broadcastradio/1.1/default/VirtualRadio.cpp +++ b/broadcastradio/1.1/default/VirtualRadio.cpp @@ -13,9 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#define LOG_TAG "BroadcastRadioDefault.VirtualRadio" +//#define LOG_NDEBUG 0 + #include "VirtualRadio.h" #include +#include namespace android { namespace hardware { @@ -24,6 +28,7 @@ namespace V1_1 { namespace implementation { using V1_0::Band; +using V1_0::Class; using std::lock_guard; using std::move; @@ -32,7 +37,7 @@ using std::vector; using utils::make_selector; -const vector gInitialFmPrograms{ +static const vector gInitialFmPrograms{ {make_selector(Band::FM, 94900), "Wild 94.9", "Drake ft. Rihanna", "Too Good"}, {make_selector(Band::FM, 96500), "KOIT", "Celine Dion", "All By Myself"}, {make_selector(Band::FM, 97300), "Alice@97.3", "Drops of Jupiter", "Train"}, @@ -42,7 +47,8 @@ const vector gInitialFmPrograms{ {make_selector(Band::FM, 106100), "106 KMEL", "Drake", "Marvins Room"}, }; -VirtualRadio::VirtualRadio(VirtualRadio&& o) : mPrograms(move(o.mPrograms)) {} +static VirtualRadio gEmptyRadio({}); +static VirtualRadio gFmRadio(gInitialFmPrograms); VirtualRadio::VirtualRadio(const vector initialList) : mPrograms(initialList) {} @@ -62,8 +68,34 @@ bool VirtualRadio::getProgram(const ProgramSelector& selector, VirtualProgram& p return false; } -VirtualRadio make_fm_radio() { - return VirtualRadio(gInitialFmPrograms); +VirtualRadio& getRadio(V1_0::Class classId) { + switch (classId) { + case Class::AM_FM: + return getFmRadio(); + case Class::SAT: + return getSatRadio(); + case Class::DT: + return getDigitalRadio(); + default: + ALOGE("Invalid class ID"); + return gEmptyRadio; + } +} + +VirtualRadio& getAmRadio() { + return gEmptyRadio; +} + +VirtualRadio& getFmRadio() { + return gFmRadio; +} + +VirtualRadio& getSatRadio() { + return gEmptyRadio; +} + +VirtualRadio& getDigitalRadio() { + return gEmptyRadio; } } // namespace implementation diff --git a/broadcastradio/1.1/default/VirtualRadio.h b/broadcastradio/1.1/default/VirtualRadio.h index 4cdc72ffc8..3c7ae5c193 100644 --- a/broadcastradio/1.1/default/VirtualRadio.h +++ b/broadcastradio/1.1/default/VirtualRadio.h @@ -27,9 +27,16 @@ namespace broadcastradio { namespace V1_1 { namespace implementation { +/** + * A radio frequency space mock. + * + * This represents all broadcast waves in the air for a given radio technology, + * not a captured station list in the radio tuner memory. + * + * It's meant to abstract out radio content from default tuner implementation. + */ class VirtualRadio { public: - VirtualRadio(VirtualRadio&& o); VirtualRadio(const std::vector initialList); std::vector getProgramList(); @@ -40,7 +47,29 @@ class VirtualRadio { std::vector mPrograms; }; -VirtualRadio make_fm_radio(); +/** + * Get virtual radio space for a given radio class. + * + * As a space, each virtual radio always exists. For example, DAB frequencies + * exists in US, but contains no programs. + * + * The lifetime of the virtual radio space is virtually infinite, but for the + * needs of default implementation, it's bound with the lifetime of default + * implementation process. + * + * Internally, it's a static object, so trying to access the reference during + * default implementation library unloading may result in segmentation fault. + * It's unlikely for testing purposes. + * + * @param classId A class of radio technology. + * @return A reference to virtual radio space for a given technology. + */ +VirtualRadio& getRadio(V1_0::Class classId); + +VirtualRadio& getAmRadio(); +VirtualRadio& getFmRadio(); +VirtualRadio& getSatRadio(); +VirtualRadio& getDigitalRadio(); } // namespace implementation } // namespace V1_1 From 614ffc163a8dfbd9f0ef37a7a27b7c8d52265004 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Thu, 27 Jul 2017 10:30:23 -0700 Subject: [PATCH 088/265] Refine broadcastradio HAL comments. Bug: b/64113304 Test: it builds Change-Id: I42c1d32dbe436c97f0a05b4fdb88f60f11ceb0a1 --- broadcastradio/1.0/types.hal | 17 ++++++++++++++--- broadcastradio/1.1/ITuner.hal | 7 +++++++ current.txt | 1 + 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/broadcastradio/1.0/types.hal b/broadcastradio/1.0/types.hal index e9ac4b7d30..8c3ec119d3 100644 --- a/broadcastradio/1.0/types.hal +++ b/broadcastradio/1.0/types.hal @@ -212,12 +212,23 @@ struct ProgramInfo { uint32_t channel; /** current channel. (e.g kHz for band type AM_FM) */ uint32_t subChannel; /** current sub channel. (FM_HD) */ - /** Tuned to a program (not a noise). It's the same condition that would stop scan operation. */ + /** + * Tuned to a program (not a noise). It's the same condition that would + * stop scan operation. + */ bool tuned; bool stereo; /** program is stereo or not */ bool digital; /** digital program or not (e.g HD Radio program) */ - uint32_t signalStrength; /** signal strength from 0 to 100 */ - vec metadata; /** non empty if meta data are present (e.g PTY, song title ...) */ + + /** + * Signal quality measured in 0% to 100% range. + * + * Despite the name, this is not a signal strength. + * The purpose of this field is primarily informative. + */ + uint32_t signalStrength; + + vec metadata; /** Metadata: PTY, song title etc. */ }; diff --git a/broadcastradio/1.1/ITuner.hal b/broadcastradio/1.1/ITuner.hal index a5c569a930..cc2e58db39 100644 --- a/broadcastradio/1.1/ITuner.hal +++ b/broadcastradio/1.1/ITuner.hal @@ -84,6 +84,13 @@ interface ITuner extends @1.0::ITuner { * subsequent calls to startBackgroundScan, issuing a single * backgroundScanComplete callback. * + * If a device supports continuous background scanning, it may succeed + * (return OK and call backgroundScanComplete) without any additional + * operation performed. + * + * Foreground scanning may be implemented in the front end app with + * @1.0::ITuner scan operation. + * * @return result OK if the scan was properly scheduled (this does not mean * it successfully finished). * UNAVAILABLE if the background scan is unavailable, diff --git a/current.txt b/current.txt index cc89c696c1..2017df5832 100644 --- a/current.txt +++ b/current.txt @@ -190,6 +190,7 @@ fe3c3c2f572b72f15f8594c538b0577bd5c28722c31879cfe6231330cddb6747 android.hardwar # ABI preserving changes to HALs released in Android O 150a338ce11fcec70757c9675d83cf6a5d7b40d0c812741b91671fecce59eac9 android.hardware.broadcastradio@1.0::types +dc7e6d4f537b9943e27edc4f86c5a03bb643b18f18f866f8c3c71c0ac4ea8cbc android.hardware.broadcastradio@1.0::types 760485232f6cce07f8bb05e3475509956996b702f77415ee5bff05e2ec5a5bcc android.hardware.dumpstate@1.0::IDumpstateDevice e822cb7f4a1bdd45689c5e92ccd19a2201c20b771bd4b2ec1ae627e324591f9d android.hardware.radio@1.0::IRadioResponse 28e929b453df3d9f5060af2764e6cdb123ddb893e3e86923c877f6ff7e5f02c9 android.hardware.wifi@1.0::types From 01d10a11cf59731f1e5bb43c2285aaffba45e1a3 Mon Sep 17 00:00:00 2001 From: Asaf Rosenfeld Date: Wed, 26 Jul 2017 23:30:15 -0700 Subject: [PATCH 089/265] Rename and Redoc VMS HAL defs. Test: All tests has been adjusted to post review names and pass. Bug: 64093467 Change-Id: I7b5646b179030b59b87abc23ffe6a2a81e1b74b2 --- automotive/vehicle/2.1/Android.mk | 202 +++++++++++++++++------------ automotive/vehicle/2.1/types.hal | 204 ++++++++++++++++++++++-------- 2 files changed, 270 insertions(+), 136 deletions(-) diff --git a/automotive/vehicle/2.1/Android.mk b/automotive/vehicle/2.1/Android.mk index 2dfbefc164..3001da05c4 100644 --- a/automotive/vehicle/2.1/Android.mk +++ b/automotive/vehicle/2.1/Android.mk @@ -207,6 +207,25 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) +# +# Build types.hal (VmsAvailabilityStateIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsAvailabilityStateIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsAvailabilityStateIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + # # Build types.hal (VmsBaseMessageIntegerValuesIndex) # @@ -226,25 +245,6 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) -# -# Build types.hal (VmsDataMessageIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsDataMessageIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsDataMessageIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - # # Build types.hal (VmsMessageType) # @@ -264,6 +264,44 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) +# +# Build types.hal (VmsMessageWithLayerAndPublisherIdIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageWithLayerAndPublisherIdIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsMessageWithLayerAndPublisherIdIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsMessageWithLayerIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageWithLayerIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsMessageWithLayerIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + # # Build types.hal (VmsOfferingMessageIntegerValuesIndex) # @@ -284,9 +322,9 @@ $(GEN): $(LOCAL_PATH)/types.hal LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (VmsSimpleMessageIntegerValuesIndex) +# Build types.hal (VmsSubscriptionsStateIntegerValuesIndex) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsSimpleMessageIntegerValuesIndex.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsSubscriptionsStateIntegerValuesIndex.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -296,26 +334,7 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsSimpleMessageIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsSubscriptionResponseFormat) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsSubscriptionResponseFormat.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsSubscriptionResponseFormat + android.hardware.automotive.vehicle@2.1::types.VmsSubscriptionsStateIntegerValuesIndex $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) @@ -547,6 +566,25 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) +# +# Build types.hal (VmsAvailabilityStateIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsAvailabilityStateIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsAvailabilityStateIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + # # Build types.hal (VmsBaseMessageIntegerValuesIndex) # @@ -566,25 +604,6 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) -# -# Build types.hal (VmsDataMessageIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsDataMessageIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsDataMessageIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - # # Build types.hal (VmsMessageType) # @@ -604,6 +623,44 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) +# +# Build types.hal (VmsMessageWithLayerAndPublisherIdIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageWithLayerAndPublisherIdIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsMessageWithLayerAndPublisherIdIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsMessageWithLayerIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageWithLayerIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsMessageWithLayerIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + # # Build types.hal (VmsOfferingMessageIntegerValuesIndex) # @@ -624,9 +681,9 @@ $(GEN): $(LOCAL_PATH)/types.hal LOCAL_GENERATED_SOURCES += $(GEN) # -# Build types.hal (VmsSimpleMessageIntegerValuesIndex) +# Build types.hal (VmsSubscriptionsStateIntegerValuesIndex) # -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsSimpleMessageIntegerValuesIndex.java +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsSubscriptionsStateIntegerValuesIndex.java $(GEN): $(HIDL) $(GEN): PRIVATE_HIDL := $(HIDL) $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal @@ -636,26 +693,7 @@ $(GEN): PRIVATE_CUSTOM_TOOL = \ -Ljava \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsSimpleMessageIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsSubscriptionResponseFormat) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsSubscriptionResponseFormat.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsSubscriptionResponseFormat + android.hardware.automotive.vehicle@2.1::types.VmsSubscriptionsStateIntegerValuesIndex $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) diff --git a/automotive/vehicle/2.1/types.hal b/automotive/vehicle/2.1/types.hal index e5f94113a3..f614b8b9bd 100644 --- a/automotive/vehicle/2.1/types.hal +++ b/automotive/vehicle/2.1/types.hal @@ -119,6 +119,8 @@ enum VehicleProperty: @2.0::VehicleProperty { * bytes is a serialized VMS message as defined in the vms protocol * which is opaque to the framework; * + * IVehicle#get must always return StatusCode::NOT_AVAILABLE. + * * @change_mode VehiclePropertyChangeMode:ON_CHANGE * @access VehiclePropertyAccess:READ_WRITE */ @@ -509,102 +511,196 @@ enum DiagnosticFloatSensorIndex : int32_t { }; /** - * This enum lists the types of supported VMS messages. + * This enum lists the types of supported VMS messages. It is used as the first + * integer in the vehicle property integers array and determines how the rest of + * the message is decoded. */ enum VmsMessageType : int32_t { - /** A client subscribes to a layer. */ + /** + * A request from the subscribers to the VMS service to subscribe to a layer. + * + * This message type uses enum VmsMessageWithLayerIntegerValuesIndex. + */ SUBSCRIBE = 1, - /** A client unsubscribes from a layer. */ - UNSUBSCRIBE = 2, + /** + * A request from the subscribers to the VMS service to subscribe to a layer from a specific publisher. + * + * This message type uses enum VmsMessageWithLayerAndPublisherIdIntegerValuesIndex. + */ + SUBSCRIBE_TO_PUBLISHER = 2, - /** A client publishes a data packet. */ - DATA = 3, + /** + * A request from the subscribers to the VMS service to unsubscribes from a layer. + * + * This message type uses enum VmsMessageWithLayerIntegerValuesIndex. + */ + UNSUBSCRIBE = 3, - /** A client declaring layers offering. */ - OFFERING = 4, + /** + * A request from the subscribers to the VMS service to unsubscribes from a layer from a specific publisher. + * + * This message type uses enum VmsMessageWithLayerAndPublisherIdIntegerValuesIndex. + */ + UNSUBSCRIBE_TO_PUBLISHER = 4, - /** Requesting the list of available layers. */ - AVAILABILITY_REQUEST = 5, + /** + * Information from the publishers to the VMS service about the layers which the client can publish. + * + * This message type uses enum VmsOfferingMessageIntegerValuesIndex. + */ + OFFERING = 5, - /** Returning the list of available layers. */ - AVAILABILITY_RESPONSE = 6, + /** + * A request from the subscribers to the VMS service to get the available layers. + * + * This message type uses enum VmsBaseMessageIntegerValuesIndex. + */ + AVAILABILITY_REQUEST = 6, - /** Sending to the HAL the current list of the available layers. */ - AVAILABILITY_CHANGE = 7, + /** + * A request from the publishers to the VMS service to get the layers with subscribers. + * + * This message type uses enum VmsBaseMessageIntegerValuesIndex. + */ + SUBSCRIPTIONS_REQUEST = 7, - /** Requesting layers that have subscribers. */ - SUBSCRIPTIONS_REQUEST = 8, + /** + * A response from the VMS service to the subscribers to a VmsMessageType.AVAILABILITY_REQUEST + * + * This message type uses enum VmsAvailabilityStateIntegerValuesIndex. + */ + AVAILABILITY_RESPONSE = 8, - /** Returning layers that have subscribers. */ - SUBSCRIPTIONS_RESPONSE = 9, + /** + * A notification from the VMS service to the subscribers on a change in the available layers. + * + * This message type uses enum VmsAvailabilityStateIntegerValuesIndex. + */ + AVAILABILITY_CHANGE = 9, - /** Sending to the HAL the current list of the subscribed layers. */ - SUBSCRIPTIONS_CHANGE = 10, + /** + * A response from the VMS service to the publishers to a VmsMessageType.SUBSCRIPTIONS_REQUEST + * + * This message type uses enum VmsSubscriptionsStateIntegerValuesIndex. + */ + SUBSCRIPTIONS_RESPONSE = 10, + + /** + * A notification from the VMS service to the publishers on a change in the layers with subscribers. + * + * This message type uses enum VmsSubscriptionsStateIntegerValuesIndex. + */ + SUBSCRIPTIONS_CHANGE = 11, + + /** + * A message from the VMS service to the subscribers or from the publishers to the VMS service + * with a serialized VMS data packet as defined in the VMS protocol. + * + * This message type uses enum VmsBaseMessageIntegerValuesIndex. + */ + DATA = 12, }; /** - * This enum provides the canonical mapping for VMS properties that have an - * integer value. + * Every VMS message starts with the type of the message from the VmsMessageType enum. + * Messages with no parameters such as VmsMessageType.AVAILABILITY_REQUEST, + * VmsMessageType.SUBSCRIPTIONS_REQUEST and VmsMessageType.DATA are also based on this enum. */ enum VmsBaseMessageIntegerValuesIndex : int32_t { /* The message type as enumerated by VmsMessageType enum. */ - VMS_MESSAGE_TYPE = 0, + MESSAGE_TYPE = 0, }; /* - * This enum provides the canonical mapping for VMS SUBMIT and UNSUBMIT - * messages integer value properties. + * A VMS message with a layer is sent as part of a VmsMessageType.SUBSCRIBE or + * VmsMessageType.UNSUBSCRIBE messages. + * + * The layer type is defined in the VMS protocol, and the subtype and version are + * controlled by the implementer of the publisher. */ -enum VmsSimpleMessageIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { - /* The layer ID as defined in the vms protocol. */ - VMS_LAYER_ID = 1, +enum VmsMessageWithLayerIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { + LAYER_TYPE = 1, - /* The version of the VMS layer. */ - VMS_LAYER_VERSION = 2, + LAYER_SUBTYPE = 2, - /* The layer type as defined in the vms protocol */ - VMS_LAYER_SUB_TYPE = 3, + LAYER_VERSION = 3, }; /* - * This enum provides the canonical mapping for VMS DATA - * message integer value properties. + * A VMS message with a layer and publisher ID is sent as part of a + * VmsMessageType.SUBSCRIBE_TO_PUBLISHER and VmsMessageType.UNSUBSCRIBE_TO_PUBLISHER messages. */ -enum VmsDataMessageIntegerValuesIndex : VmsSimpleMessageIntegerValuesIndex { - /* A publisher ID of the client that published this message. */ - VMS_PUBLISHER_ID = 4, +enum VmsMessageWithLayerAndPublisherIdIntegerValuesIndex : VmsMessageWithLayerIntegerValuesIndex { + PUBLISHER_ID = 4, }; /* - * This enum provides the canonical mapping for VMS offering messages integer - * value properties + * An offering can be sent by publishers as part of VmsMessageType.OFFERING in order to + * advertise which layers they can publish and under which constraints: e.g., I can publish Layer X + * if someone else will publish Layer Y. + * The offering contains the publisher ID which was assigned to the publisher by the VMS service. + * A single offering is represented as: + * - Layer type + * - Layer subtype + * - Layer version + * - Number of dependencies (N) + * - N x (Layer type, Layer subtype, Layer version) */ enum VmsOfferingMessageIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { - /* The ID assigend to the publisher by the VMS core. */ PUBLISHER_ID = 1, - /* The number of VMS layer dependencies. */ - VMS_NUMBER_OF_LAYERS_DEPENDENCIES = 2, + NUMBER_OF_OFFERS = 2, - /* The first index that contain dependencies */ - FIRST_DEPENDENCIES_INDEX = 3, + OFFERING_START = 3, }; /** - * A VMS subscription request only contains its message type. The format of a VMS subscription - * response is described below. + * A subscriptions state is sent to the publishers in response to a change in the subscriptions + * as part of a VmsMessageType.SUBSCRIPTIONS_CHANGE, or in response to a + * VmsMessageType.SUBSCRIPTIONS_REQUEST message as part of VmsMessageType.SUBSCRIPTIONS_RESPONSE. + * The VMS service issues monotonically increasing sequence numbers, and in case a subscriber receives + * a smaller sequnce number it should ignore the message. + * The subscriptions are sent as a list of layers followed by a list of associated layers: + * {Sequence number, N, M, N x layer, M x associated layer} + * A subscribed layer is represented as three integers: + * - Layer type + * - Layer subtype + * - Layer version + * A subscribed associated layer is a layer with a list of publisher IDs. It is represented as: + * - Layer type + * - Layer subtype + * - Layer version + * - Number of publisher IDs (N) + * - N x publisher ID */ -enum VmsSubscriptionResponseFormat : VmsBaseMessageIntegerValuesIndex { - /** - * Recipients should ignore any packet with a sequence number that is less than the highest - * sequence number they have seen thus far. - */ +enum VmsSubscriptionsStateIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { SEQUENCE_NUMBER = 1, - /** The number of VMS layers. Each layer has two integers: type and version. */ NUMBER_OF_LAYERS = 2, - /** The first index that contains a layer. */ - FIRST_LAYER = 3, + NUMBER_OF_ASSOCIATED_LAYERS = 3, + + SUBSCRIPTIONS_START = 4, +}; + +/** + * An availability state is sent to the subscribers in response to a change in the available + * layers as part of a VmsMessageType.AVAILABILITY_CHANGE message, or in response to a + * VmsMessageType.AVAILABILITY_REQUEST message as part of a VmsMessageType.AVAILABILITY_RESPONSE. + * The VMS service issues monotonically increasing sequence numbers, and in case a subscriber receives + * a smaller sequnce number, it should ignore the message. + * An available associated layer is a layer with a list of publisher IDs: + * - Layer type + * - Layer subtype + * - Layer version + * - Number of publisher IDs (N) + * - N x publisher ID +*/ +enum VmsAvailabilityStateIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { + SEQUENCE_NUMBER = 1, + + NUMBER_OF_ASSOCIATED_LAYERS = 2, + + LAYERS_START = 3, }; From fd8cc38275f8d42391d23aee25edd68a37df912a Mon Sep 17 00:00:00 2001 From: Sanket Padawe Date: Mon, 31 Jul 2017 14:18:09 -0700 Subject: [PATCH 090/265] Add owners for radio vts. Test: vts Fix: 64220334 Change-Id: I255d4fd9ed4416254c6897b0f314f65feacb04d6 --- radio/1.0/vts/OWNERS | 7 +++++++ radio/1.1/vts/OWNERS | 7 +++++++ 2 files changed, 14 insertions(+) create mode 100644 radio/1.0/vts/OWNERS create mode 100644 radio/1.1/vts/OWNERS diff --git a/radio/1.0/vts/OWNERS b/radio/1.0/vts/OWNERS new file mode 100644 index 0000000000..8236e9408a --- /dev/null +++ b/radio/1.0/vts/OWNERS @@ -0,0 +1,7 @@ +# Telephony team +amitmahajan@google.com +sanketpadawe@google.com + +# VTS team +yuexima@google.com +yim@google.com diff --git a/radio/1.1/vts/OWNERS b/radio/1.1/vts/OWNERS new file mode 100644 index 0000000000..8236e9408a --- /dev/null +++ b/radio/1.1/vts/OWNERS @@ -0,0 +1,7 @@ +# Telephony team +amitmahajan@google.com +sanketpadawe@google.com + +# VTS team +yuexima@google.com +yim@google.com From bb4ff6557fd69ca8a23ee667c4bdfbfdef58cc55 Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Fri, 28 Jul 2017 19:53:28 -0700 Subject: [PATCH 091/265] Initial VTS tests for Neural Networks HAL. This CL has the basic framework for the NNAPI VTS tests with one positive function test for each HAL function. This CL is being uploaded now because the NN API HAL files are being moved to hardware/interfaces. Bug: 63905942 Bug: 63525563 Test: mm -j40 Test: vts-tradefed runs and passes Change-Id: I8f3d606ec50a6a6d110c89132e6fb89f53f3bf48 --- neuralnetworks/1.0/vts/functional/Android.bp | 37 +++ .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 245 ++++++++++++++++++ .../VtsHalNeuralnetworksV1_0TargetTest.h | 82 ++++++ neuralnetworks/Android.bp | 1 + 4 files changed, 365 insertions(+) create mode 100644 neuralnetworks/1.0/vts/functional/Android.bp create mode 100644 neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp create mode 100644 neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h diff --git a/neuralnetworks/1.0/vts/functional/Android.bp b/neuralnetworks/1.0/vts/functional/Android.bp new file mode 100644 index 0000000000..96eb4cb51f --- /dev/null +++ b/neuralnetworks/1.0/vts/functional/Android.bp @@ -0,0 +1,37 @@ +// +// Copyright (C) 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. +// + +cc_test { + name: "VtsHalNeuralnetworksV1_0TargetTest", + srcs: ["VtsHalNeuralnetworksV1_0TargetTest.cpp"], + defaults: ["hidl_defaults"], + shared_libs: [ + "libbase", + "libhidlbase", + "libhidlmemory", + "libhidltransport", + "liblog", + "libutils", + "android.hardware.neuralnetworks@1.0", + "android.hidl.allocator@1.0", + "android.hidl.memory@1.0", + ], + static_libs: ["VtsHalHidlTargetTestBase"], + cflags: [ + "-O0", + "-g", + ], +} diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp new file mode 100644 index 0000000000..9fa694dfde --- /dev/null +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -0,0 +1,245 @@ +/* + * Copyright (C) 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 "neuralnetworks_hidl_hal_test" + +#include "VtsHalNeuralnetworksV1_0TargetTest.h" +#include +#include +#include +#include + +namespace android { +namespace hardware { +namespace neuralnetworks { +namespace V1_0 { +namespace vts { +namespace functional { + +// A class for test environment setup +NeuralnetworksHidlEnvironment::NeuralnetworksHidlEnvironment() {} + +NeuralnetworksHidlEnvironment* NeuralnetworksHidlEnvironment::getInstance() { + // This has to return a "new" object because it is freed inside + // ::testing::AddGlobalTestEnvironment when the gtest is being torn down + static NeuralnetworksHidlEnvironment* instance = new NeuralnetworksHidlEnvironment(); + return instance; +} + +void NeuralnetworksHidlEnvironment::registerTestServices() { + registerTestService("android.hardware.neuralnetworks", "1.0", "IDevice"); +} + +// The main test class for NEURALNETWORK HIDL HAL. +void NeuralnetworksHidlTest::SetUp() { + std::string instance = + NeuralnetworksHidlEnvironment::getInstance()->getServiceName(IDevice::descriptor); + LOG(INFO) << "running vts test with instance: " << instance; + device = ::testing::VtsHalHidlTargetTestBase::getService(instance); + ASSERT_NE(nullptr, device.get()); +} + +void NeuralnetworksHidlTest::TearDown() {} + +// create device test +TEST_F(NeuralnetworksHidlTest, CreateDevice) {} + +// status test +TEST_F(NeuralnetworksHidlTest, StatusTest) { + DeviceStatus status = device->getStatus(); + EXPECT_EQ(DeviceStatus::AVAILABLE, status); +} + +// initialization +TEST_F(NeuralnetworksHidlTest, InitializeTest) { + Return ret = device->initialize([](const Capabilities& capabilities) { + EXPECT_NE(nullptr, capabilities.supportedOperationTypes.data()); + EXPECT_NE(0ull, capabilities.supportedOperationTypes.size()); + EXPECT_EQ(0u, static_cast(capabilities.cachesCompilation) & ~0x1); + EXPECT_LT(0.0f, capabilities.bootupTime); + EXPECT_LT(0.0f, capabilities.float16Performance.execTime); + EXPECT_LT(0.0f, capabilities.float16Performance.powerUsage); + EXPECT_LT(0.0f, capabilities.float32Performance.execTime); + EXPECT_LT(0.0f, capabilities.float32Performance.powerUsage); + EXPECT_LT(0.0f, capabilities.quantized8Performance.execTime); + EXPECT_LT(0.0f, capabilities.quantized8Performance.powerUsage); + }); + EXPECT_TRUE(ret.isOk()); +} + +namespace { +// create the model +Model createTestModel() { + const std::vector operand2Data = {5.0f, 6.0f, 7.0f, 8.0f}; + const uint32_t size = operand2Data.size() * sizeof(float); + + const uint32_t operand1 = 0; + const uint32_t operand2 = 1; + const uint32_t operand3 = 2; + + const std::vector operands = { + { + .type = OperandType::FLOAT32, + .dimensions = {1, 2, 2, 1}, + .numberOfConsumers = 1, + .scale = 0.0f, + .zeroPoint = 0, + .location = {.poolIndex = static_cast(LocationValues::LOCATION_AT_RUN_TIME), + .offset = 0, + .length = 0}, + }, + { + .type = OperandType::FLOAT32, + .dimensions = {1, 2, 2, 1}, + .numberOfConsumers = 1, + .scale = 0.0f, + .zeroPoint = 0, + .location = {.poolIndex = static_cast(LocationValues::LOCATION_SAME_BLOCK), + .offset = 0, + .length = size}, + }, + { + .type = OperandType::FLOAT32, + .dimensions = {1, 2, 2, 1}, + .numberOfConsumers = 0, + .scale = 0.0f, + .zeroPoint = 0, + .location = {.poolIndex = static_cast(LocationValues::LOCATION_AT_RUN_TIME), + .offset = 0, + .length = 0}, + }, + }; + + const std::vector operations = {{ + .type = OperationType::ADD_FLOAT32, .inputs = {operand1, operand2}, .outputs = {operand3}, + }}; + + const std::vector inputIndexes = {operand1}; + const std::vector outputIndexes = {operand3}; + const std::vector operandValues(reinterpret_cast(operand2Data.data()), + reinterpret_cast(operand2Data.data()) + + operand2Data.size() * sizeof(float)); + const std::vector pools = {}; + + return { + .operands = operands, + .operations = operations, + .inputIndexes = inputIndexes, + .outputIndexes = outputIndexes, + .operandValues = operandValues, + .pools = pools, + }; +} + +// allocator helper +hidl_memory allocateSharedMemory(int64_t size, const std::string& type = "ashmem") { + hidl_memory memory; + + sp allocator = IAllocator::getService(type); + if (!allocator.get()) { + return {}; + } + + Return ret = allocator->allocate(size, [&](bool success, const hidl_memory& mem) { + ASSERT_TRUE(success); + memory = mem; + }); + if (!ret.isOk()) { + return {}; + } + + return memory; +} +} // anonymous namespace + +// supported subgraph test +TEST_F(NeuralnetworksHidlTest, SupportedSubgraphTest) { + Model model = createTestModel(); + std::vector supported; + Return ret = device->getSupportedSubgraph( + model, [&](const hidl_vec& hidl_supported) { supported = hidl_supported; }); + ASSERT_TRUE(ret.isOk()); + EXPECT_EQ(/*model.operations.size()*/ 0ull, supported.size()); +} + +// execute simple graph +TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphTest) { + std::vector inputData = {1.0f, 2.0f, 3.0f, 4.0f}; + std::vector outputData = {-1.0f, -1.0f, -1.0f, -1.0f}; + std::vector expectedData = {6.0f, 8.0f, 10.0f, 12.0f}; + const uint32_t INPUT = 0; + const uint32_t OUTPUT = 1; + + // prpeare request + Model model = createTestModel(); + sp preparedModel = device->prepareModel(model); + ASSERT_NE(nullptr, preparedModel.get()); + + // prepare inputs + uint32_t inputSize = static_cast(inputData.size() * sizeof(float)); + uint32_t outputSize = static_cast(outputData.size() * sizeof(float)); + std::vector inputs = {{ + .location = {.poolIndex = INPUT, .offset = 0, .length = inputSize}, .dimensions = {}, + }}; + std::vector outputs = {{ + .location = {.poolIndex = OUTPUT, .offset = 0, .length = outputSize}, .dimensions = {}, + }}; + std::vector pools = {allocateSharedMemory(inputSize), + allocateSharedMemory(outputSize)}; + ASSERT_NE(0ull, pools[INPUT].size()); + ASSERT_NE(0ull, pools[OUTPUT].size()); + + // load data + sp inputMemory = mapMemory(pools[INPUT]); + sp outputMemory = mapMemory(pools[OUTPUT]); + ASSERT_NE(nullptr, inputMemory.get()); + ASSERT_NE(nullptr, outputMemory.get()); + float* inputPtr = reinterpret_cast(static_cast(inputMemory->getPointer())); + float* outputPtr = reinterpret_cast(static_cast(outputMemory->getPointer())); + ASSERT_NE(nullptr, inputPtr); + ASSERT_NE(nullptr, outputPtr); + std::copy(inputData.begin(), inputData.end(), inputPtr); + std::copy(outputData.begin(), outputData.end(), outputPtr); + inputMemory->commit(); + outputMemory->commit(); + + // execute request + bool success = preparedModel->execute({.inputs = inputs, .outputs = outputs, .pools = pools}); + EXPECT_TRUE(success); + + // validate results { 1+5, 2+6, 3+7, 4+8 } + outputMemory->update(); + std::copy(outputPtr, outputPtr + outputData.size(), outputData.begin()); + EXPECT_EQ(expectedData, outputData); +} + +} // namespace functional +} // namespace vts +} // namespace V1_0 +} // namespace neuralnetworks +} // namespace hardware +} // namespace android + +using android::hardware::neuralnetworks::V1_0::vts::functional::NeuralnetworksHidlEnvironment; + +int main(int argc, char** argv) { + ::testing::AddGlobalTestEnvironment(NeuralnetworksHidlEnvironment::getInstance()); + ::testing::InitGoogleTest(&argc, argv); + NeuralnetworksHidlEnvironment::getInstance()->init(&argc, argv); + + int status = RUN_ALL_TESTS(); + return status; +} diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h new file mode 100644 index 0000000000..bb0cdaa457 --- /dev/null +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 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. + */ + +#ifndef VTS_HAL_NEURALNETWORKS_V1_0_TARGET_TESTS_H +#define VTS_HAL_NEURALNETWORKS_V1_0_TARGET_TESTS_H + +#include +#include +#include +#include + +#include +#include +#include +#include + +using ::android::hardware::neuralnetworks::V1_0::IDevice; +using ::android::hardware::neuralnetworks::V1_0::IPreparedModel; +using ::android::hardware::neuralnetworks::V1_0::Capabilities; +using ::android::hardware::neuralnetworks::V1_0::DeviceStatus; +using ::android::hardware::neuralnetworks::V1_0::Model; +using ::android::hardware::neuralnetworks::V1_0::OperationType; +using ::android::hardware::neuralnetworks::V1_0::PerformanceInfo; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::hardware::hidl_memory; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hidl::allocator::V1_0::IAllocator; +using ::android::hidl::memory::V1_0::IMemory; +using ::android::sp; + +namespace android { +namespace hardware { +namespace neuralnetworks { +namespace V1_0 { +namespace vts { +namespace functional { + +// A class for test environment setup +class NeuralnetworksHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase { + NeuralnetworksHidlEnvironment(); + NeuralnetworksHidlEnvironment(const NeuralnetworksHidlEnvironment&) = delete; + NeuralnetworksHidlEnvironment(NeuralnetworksHidlEnvironment&&) = delete; + NeuralnetworksHidlEnvironment& operator=(const NeuralnetworksHidlEnvironment&) = delete; + NeuralnetworksHidlEnvironment& operator=(NeuralnetworksHidlEnvironment&&) = delete; + + public: + static NeuralnetworksHidlEnvironment* getInstance(); + virtual void registerTestServices() override; +}; + +// The main test class for NEURALNETWORKS HIDL HAL. +class NeuralnetworksHidlTest : public ::testing::VtsHalHidlTargetTestBase { + public: + virtual void SetUp() override; + virtual void TearDown() override; + + sp device; +}; + +} // namespace functional +} // namespace vts +} // namespace V1_0 +} // namespace neuralnetworks +} // namespace hardware +} // namespace android + +#endif // VTS_HAL_NEURALNETWORKS_V1_0_TARGET_TESTS_H diff --git a/neuralnetworks/Android.bp b/neuralnetworks/Android.bp index bbb3e4bac0..33f70ebae2 100644 --- a/neuralnetworks/Android.bp +++ b/neuralnetworks/Android.bp @@ -1,4 +1,5 @@ // This is an autogenerated file, do not edit. subdirs = [ "1.0", + "1.0/vts/functional", ] From 7a47d2d0be1f1a56a210e25af978b05ee6555aea Mon Sep 17 00:00:00 2001 From: sqian Date: Mon, 31 Jul 2017 10:57:14 -0700 Subject: [PATCH 092/265] Add EMPTY_RECORD for getDeviceIdentity Remove same unit test case with arguments "","0" for: - sendEnvelope - sendTerminalResponseToSim - sendEnvelopeWithStatus Test: verified by vendor, treehuger Bug: 62926561 Change-Id: I5f535bdfc5821275a7ea2571d411374e0d7a8822 Merged-In: I5f535bdfc5821275a7ea2571d411374e0d7a8822 --- .../vts/functional/radio_hidl_hal_misc.cpp | 3 +- .../1.0/vts/functional/radio_hidl_hal_stk.cpp | 51 ------------------- 2 files changed, 2 insertions(+), 52 deletions(-) diff --git a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp index cc519ca964..0507cc98f5 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp @@ -397,7 +397,8 @@ TEST_F(RadioHidlTest, getDeviceIdentity) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::EMPTY_RECORD); } } diff --git a/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp b/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp index 9e51df43ec..f97f5febd6 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp @@ -40,24 +40,6 @@ TEST_F(RadioHidlTest, sendEnvelope) { radioRsp->rspInfo.error == RadioError::NONE || radioRsp->rspInfo.error == RadioError::MODEM_ERR); } - - // Test with sending random string - serial = GetRandomSerialNumber(); - content = "0"; - - radio->sendEnvelope(serial, content); - - EXPECT_EQ(std::cv_status::no_timeout, wait()); - EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type); - EXPECT_EQ(serial, radioRsp->rspInfo.serial); - - if (cardStatus.cardState == CardState::ABSENT) { - std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; - ASSERT_TRUE(CheckGeneralError() || - radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || - radioRsp->rspInfo.error == RadioError::NONE || - radioRsp->rspInfo.error == RadioError::MODEM_ERR); - } } /* @@ -81,23 +63,6 @@ TEST_F(RadioHidlTest, sendTerminalResponseToSim) { radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || radioRsp->rspInfo.error == RadioError::NONE); } - - serial = GetRandomSerialNumber(); - - // Test with sending random string - commandResponse = "0"; - - radio->sendTerminalResponseToSim(serial, commandResponse); - - EXPECT_EQ(std::cv_status::no_timeout, wait()); - EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type); - EXPECT_EQ(serial, radioRsp->rspInfo.serial); - - if (cardStatus.cardState == CardState::ABSENT) { - std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; - ASSERT_TRUE(CheckGeneralError() || - radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS); - } } /* @@ -158,20 +123,4 @@ TEST_F(RadioHidlTest, sendEnvelopeWithStatus) { radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || radioRsp->rspInfo.error == RadioError::MODEM_ERR); } - - // Test with sending random string - serial = GetRandomSerialNumber(); - contents = "0"; - - radio->sendEnvelopeWithStatus(serial, contents); - - EXPECT_EQ(std::cv_status::no_timeout, wait()); - EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type); - EXPECT_EQ(serial, radioRsp->rspInfo.serial); - - if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(CheckGeneralError() || - radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || - radioRsp->rspInfo.error == RadioError::MODEM_ERR); - } } From 4492a30e143ba645433f4bf1231fd842abf3e9ed Mon Sep 17 00:00:00 2001 From: Steven Thomas Date: Fri, 7 Jul 2017 12:34:20 -0700 Subject: [PATCH 093/265] Guard against racy ComposerClient reconnection The hardware composer service has a rule that only one client can be connected at a time. The surface flinger process, when transitioning composer ownership from surface flinger to vr flinger, will destroy the current client on one thread and create a new client on another thread. Although surface flinger ensures that these events happen in the expected sequence (delete then create), the requests sometimes land in the hardware composer service in inverted order, causing the creation request to fail with an error. Instead of failing with an error, block for a brief period (1 second) until the existing client is removed, then proceed to initialize the new client. This gives us enough time to ensure an inverted creation/destruction order doesn't cause client creation to fail, while avoiding a deadlock if the existing client is never destroyed. Bug: 62925812 Test: - Transitioned to/from vr flinger hundreds of times, and confirmed I no longer see sporadic composer client creation failure due to an already existing client. - Ran the vts graphics composer tests and confirmed they all pass. Change-Id: I40be1fb0cb3d42ddb5a9fc159188886e9f5b6267 --- graphics/composer/2.1/default/Hwc.cpp | 23 ++++++++++++++++++++++- graphics/composer/2.1/default/Hwc.h | 4 +++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/graphics/composer/2.1/default/Hwc.cpp b/graphics/composer/2.1/default/Hwc.cpp index 8ca0eb3351..862dff138e 100644 --- a/graphics/composer/2.1/default/Hwc.cpp +++ b/graphics/composer/2.1/default/Hwc.cpp @@ -18,6 +18,7 @@ #include "Hwc.h" +#include #include #include @@ -25,6 +26,8 @@ #include "hardware/hwcomposer.h" #include "hwc2on1adapter/HWC2On1Adapter.h" +using namespace std::chrono_literals; + namespace android { namespace hardware { namespace graphics { @@ -218,7 +221,24 @@ Return HwcHal::createClient(createClient_cb hidl_cb) sp client; { - std::lock_guard lock(mClientMutex); + std::unique_lock lock(mClientMutex); + + if (mClient != nullptr) { + // In surface flinger we delete a composer client on one thread and + // then create a new client on another thread. Although surface + // flinger ensures the calls are made in that sequence (destroy and + // then create), sometimes the calls land in the composer service + // inverted (create and then destroy). Wait for a brief period to + // see if the existing client is destroyed. + ALOGI("HwcHal::createClient: Client already exists. Waiting for" + " it to be destroyed."); + mClientDestroyedWait.wait_for(lock, 1s, + [this] { return mClient == nullptr; }); + std::string doneMsg = mClient == nullptr ? + "Existing client was destroyed." : + "Existing client was never destroyed!"; + ALOGI("HwcHal::createClient: Done waiting. %s", doneMsg.c_str()); + } // only one client is allowed if (mClient == nullptr) { @@ -245,6 +265,7 @@ void HwcHal::removeClient() { std::lock_guard lock(mClientMutex); mClient = nullptr; + mClientDestroyedWait.notify_all(); } void HwcHal::hotplugHook(hwc2_callback_data_t callbackData, diff --git a/graphics/composer/2.1/default/Hwc.h b/graphics/composer/2.1/default/Hwc.h index b45389ad82..756132759c 100644 --- a/graphics/composer/2.1/default/Hwc.h +++ b/graphics/composer/2.1/default/Hwc.h @@ -17,8 +17,9 @@ #ifndef ANDROID_HARDWARE_GRAPHICS_COMPOSER_V2_1_HWC_H #define ANDROID_HARDWARE_GRAPHICS_COMPOSER_V2_1_HWC_H -#include +#include #include +#include #include #include @@ -211,6 +212,7 @@ private: } mDispatch; std::mutex mClientMutex; + std::condition_variable mClientDestroyedWait; wp mClient; // If the HWC implementation version is < 2.0, use an adapter to interface From d7f198c9abb04c88d2035e12a526e55cbbe111f2 Mon Sep 17 00:00:00 2001 From: Sanket Padawe Date: Tue, 1 Aug 2017 09:53:44 -0700 Subject: [PATCH 094/265] Update VTS tests so that more tests pass for O. Cherry picked from ag/2562201 Bug: b/62926561 Test: vts tests Change-Id: Ic927f9efd437c6411fb14feac8c681334e4b5e60 Merged-in: Ic927f9efd437c6411fb14feac8c681334e4b5e60 --- .../vts/functional/radio_hidl_hal_data.cpp | 5 ++-- .../1.0/vts/functional/radio_hidl_hal_icc.cpp | 5 ++-- .../vts/functional/radio_hidl_hal_misc.cpp | 9 ++++-- .../1.0/vts/functional/radio_hidl_hal_sms.cpp | 30 ++++++++++++------- .../1.0/vts/functional/radio_hidl_hal_stk.cpp | 3 +- 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/radio/1.0/vts/functional/radio_hidl_hal_data.cpp b/radio/1.0/vts/functional/radio_hidl_hal_data.cpp index df31563254..4684e0f961 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_data.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_data.cpp @@ -79,7 +79,7 @@ TEST_F(RadioHidlTest, setupDataCall) { radioRsp->rspInfo.error == RadioError::RADIO_NOT_AVAILABLE || radioRsp->rspInfo.error == RadioError::OP_NOT_ALLOWED_BEFORE_REG_TO_NW || radioRsp->rspInfo.error == RadioError::OP_NOT_ALLOWED_DURING_VOICE_CALL || - CheckOEMError()); + radioRsp->rspInfo.error == RadioError::SIM_ABSENT || CheckOEMError()); } } @@ -119,7 +119,8 @@ TEST_F(RadioHidlTest, getDataCallList) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || - radioRsp->rspInfo.error == RadioError::RADIO_NOT_AVAILABLE); + radioRsp->rspInfo.error == RadioError::RADIO_NOT_AVAILABLE || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } diff --git a/radio/1.0/vts/functional/radio_hidl_hal_icc.cpp b/radio/1.0/vts/functional/radio_hidl_hal_icc.cpp index 9e003e2d77..e56e3c88c3 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_icc.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_icc.cpp @@ -317,6 +317,7 @@ TEST_F(RadioHidlTest, getIccCardStatus) { radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || radioRsp->rspInfo.error == RadioError::INVALID_SIM_STATE || radioRsp->rspInfo.error == RadioError::PASSWORD_INCORRECT || - radioRsp->rspInfo.error == RadioError::INTERNAL_ERR); + radioRsp->rspInfo.error == RadioError::INTERNAL_ERR || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } -} + } diff --git a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp index 0507cc98f5..d93b176d2a 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp @@ -676,9 +676,11 @@ TEST_F(RadioHidlTest, startLceService) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { + std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::RADIO_NOT_AVAILABLE || radioRsp->rspInfo.error == RadioError::LCE_NOT_SUPPORTED || - radioRsp->rspInfo.error == RadioError::INTERNAL_ERR); + radioRsp->rspInfo.error == RadioError::INTERNAL_ERR || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -696,7 +698,8 @@ TEST_F(RadioHidlTest, stopLceService) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || radioRsp->rspInfo.error == RadioError::LCE_NOT_SUPPORTED || - radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -845,4 +848,4 @@ TEST_F(RadioHidlTest, setSimCardPower) { ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); } -} \ No newline at end of file +} diff --git a/radio/1.0/vts/functional/radio_hidl_hal_sms.cpp b/radio/1.0/vts/functional/radio_hidl_hal_sms.cpp index 271a23aa5b..7d747030f0 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_sms.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_sms.cpp @@ -36,7 +36,8 @@ TEST_F(RadioHidlTest, sendSms) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || - radioRsp->rspInfo.error == RadioError::INVALID_STATE); + radioRsp->rspInfo.error == RadioError::INVALID_STATE || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); EXPECT_EQ(0, radioRsp->sendSmsResult.errorCode); } } @@ -62,7 +63,8 @@ TEST_F(RadioHidlTest, sendSMSExpectMore) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || - radioRsp->rspInfo.error == RadioError::INVALID_STATE); + radioRsp->rspInfo.error == RadioError::INVALID_STATE || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -145,7 +147,8 @@ TEST_F(RadioHidlTest, sendCdmaSms) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || - radioRsp->rspInfo.error == RadioError::INVALID_STATE); + radioRsp->rspInfo.error == RadioError::INVALID_STATE || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -237,7 +240,8 @@ TEST_F(RadioHidlTest, getSmscAddress) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_STATE || - radioRsp->rspInfo.error == RadioError::INVALID_MODEM_STATE); + radioRsp->rspInfo.error == RadioError::INVALID_MODEM_STATE || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -257,7 +261,8 @@ TEST_F(RadioHidlTest, setSmscAddress) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || - radioRsp->rspInfo.error == RadioError::INVALID_SMS_FORMAT); + radioRsp->rspInfo.error == RadioError::INVALID_SMS_FORMAT || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -285,7 +290,8 @@ TEST_F(RadioHidlTest, writeSmsToSim) { radioRsp->rspInfo.error == RadioError::ENCODING_ERR || radioRsp->rspInfo.error == RadioError::NO_RESOURCES || radioRsp->rspInfo.error == RadioError::NETWORK_NOT_READY || - radioRsp->rspInfo.error == RadioError::INVALID_SMSC_ADDRESS); + radioRsp->rspInfo.error == RadioError::INVALID_SMSC_ADDRESS || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -308,7 +314,8 @@ TEST_F(RadioHidlTest, deleteSmsOnSim) { radioRsp->rspInfo.error == RadioError::NONE || radioRsp->rspInfo.error == RadioError::MODEM_ERR || radioRsp->rspInfo.error == RadioError::NO_SUCH_ENTRY || - radioRsp->rspInfo.error == RadioError::INVALID_MODEM_STATE); + radioRsp->rspInfo.error == RadioError::INVALID_MODEM_STATE || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -361,7 +368,8 @@ TEST_F(RadioHidlTest, writeSmsToRuim) { radioRsp->rspInfo.error == RadioError::NONE || radioRsp->rspInfo.error == RadioError::MODEM_ERR || radioRsp->rspInfo.error == RadioError::NO_SUCH_ENTRY || - radioRsp->rspInfo.error == RadioError::INVALID_SMSC_ADDRESS); + radioRsp->rspInfo.error == RadioError::INVALID_SMSC_ADDRESS || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -413,7 +421,8 @@ TEST_F(RadioHidlTest, deleteSmsOnRuim) { radioRsp->rspInfo.error == RadioError::NONE || radioRsp->rspInfo.error == RadioError::MODEM_ERR || radioRsp->rspInfo.error == RadioError::NO_SUCH_ENTRY || - radioRsp->rspInfo.error == RadioError::INVALID_MODEM_STATE); + radioRsp->rspInfo.error == RadioError::INVALID_MODEM_STATE || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -434,6 +443,7 @@ TEST_F(RadioHidlTest, reportSmsMemoryStatus) { ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || radioRsp->rspInfo.error == RadioError::INVALID_STATE || - radioRsp->rspInfo.error == RadioError::MODEM_ERR); + radioRsp->rspInfo.error == RadioError::MODEM_ERR || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } diff --git a/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp b/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp index f97f5febd6..da46e88857 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp @@ -121,6 +121,7 @@ TEST_F(RadioHidlTest, sendEnvelopeWithStatus) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || - radioRsp->rspInfo.error == RadioError::MODEM_ERR); + radioRsp->rspInfo.error == RadioError::MODEM_ERR || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } From b8a2afe4469586e9ed68d3c886a94eea130cd99f Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Tue, 1 Aug 2017 10:52:18 -0700 Subject: [PATCH 095/265] Address Broadcast Radio HAL review notes. Bug: b/64229617 Test: instrumentation, VTS Change-Id: I4009b33eaea6df585f514711f22dfb7fec5ad379 --- broadcastradio/1.1/IBroadcastRadio.hal | 13 +++++++++ broadcastradio/1.1/ITuner.hal | 28 +++++++++---------- broadcastradio/1.1/ITunerCallback.hal | 25 +++++++++-------- broadcastradio/1.1/default/Tuner.cpp | 22 +++++++-------- broadcastradio/1.1/default/Tuner.h | 4 +-- .../VtsHalBroadcastradioV1_1TargetTest.cpp | 6 ++-- 6 files changed, 57 insertions(+), 41 deletions(-) diff --git a/broadcastradio/1.1/IBroadcastRadio.hal b/broadcastradio/1.1/IBroadcastRadio.hal index 9bde361bdb..6e7002d785 100644 --- a/broadcastradio/1.1/IBroadcastRadio.hal +++ b/broadcastradio/1.1/IBroadcastRadio.hal @@ -40,6 +40,19 @@ interface IBroadcastRadio extends @1.0::IBroadcastRadio { * The data should be a valid PNG, JPEG, GIF or BMP file. * Invalid format must be handled gracefully as if the image was missing. * + * The image identifier may become invalid after some time from passing it + * with metadata struct (due to resource cleanup at the HAL implementation). + * However, it must remain valid for a currently tuned program at least + * until currentProgramInfoChanged or programListChanged is called and + * metadata changes for the current program. + * + * There is still a race condition possible (if the HAL deletes the old + * image immediately after notifying about the new one) between + * currentProgramInfoChanged callback propagating through the framework and + * the HAL implementation removing previous image. In such case, client + * application may expect the new currentProgramInfoChanged callback with + * updated image identifier. + * * @param id Identifier of an image; * value of 0 is reserved and should be treated as invalid image. * @return image A binary blob with image data diff --git a/broadcastradio/1.1/ITuner.hal b/broadcastradio/1.1/ITuner.hal index cc2e58db39..034f9c6d6c 100644 --- a/broadcastradio/1.1/ITuner.hal +++ b/broadcastradio/1.1/ITuner.hal @@ -39,7 +39,7 @@ interface ITuner extends @1.0::ITuner { * INVALID_ARGUMENTS if invalid arguments are passed. * NOT_INITIALIZED if another error occurs. */ - tune_1_1(ProgramSelector program) generates (Result result); + tuneByProgramSelector(ProgramSelector program) generates (Result result); /** * Cancels announcement. @@ -121,19 +121,6 @@ interface ITuner extends @1.0::ITuner { getProgramList(string filter) generates (ProgramListResult result, vec programList); - /** - * Checks, if the analog playback is forced, see setAnalogForced. - * - * The isForced value is only valid if result was OK. - * - * @return result OK if the call succeeded and isForced is valid. - * INVALID_STATE if the switch is not supported at current - * configuration. - * NOT_INITIALIZED if any other error occurs. - * @return isForced true if analog is forced, false otherwise. - */ - isAnalogForced() generates (Result result, bool isForced); - /** * Forces the analog playback for the supporting radio technology. * @@ -150,4 +137,17 @@ interface ITuner extends @1.0::ITuner { * NOT_INITIALIZED if any other error occurs. */ setAnalogForced(bool isForced) generates (Result result); + + /** + * Checks, if the analog playback is forced, see setAnalogForced. + * + * The isForced value is only valid if result was OK. + * + * @return result OK if the call succeeded and isForced is valid. + * INVALID_STATE if the switch is not supported at current + * configuration. + * NOT_INITIALIZED if any other error occurs. + * @return isForced true if analog is forced, false otherwise. + */ + isAnalogForced() generates (Result result, bool isForced); }; diff --git a/broadcastradio/1.1/ITunerCallback.hal b/broadcastradio/1.1/ITunerCallback.hal index b1c5b01d5b..2e593b0fad 100644 --- a/broadcastradio/1.1/ITunerCallback.hal +++ b/broadcastradio/1.1/ITunerCallback.hal @@ -29,9 +29,9 @@ interface ITunerCallback extends @1.0::ITunerCallback { * Method called by the HAL when a tuning operation completes * following a step(), scan() or tune() command. * - * This callback supersedes V1_0::tuneComplete. For performance reasons, - * the 1.0 callback may not be called when HAL implementation detects 1.1 - * client (by casting V1_0::ITunerCallback to V1_1::ITunerCallback). + * This callback supersedes V1_0::tuneComplete. + * The 1.0 callback must not be called when HAL implementation detects + * 1.1 client (by casting V1_0::ITunerCallback to V1_1::ITunerCallback). * * @param result OK if tune succeeded or TIMEOUT in case of time out. * @param selector A ProgramSelector structure describing the tuned station. @@ -41,9 +41,9 @@ interface ITunerCallback extends @1.0::ITunerCallback { /** * Method called by the HAL when a frequency switch occurs. * - * This callback supersedes V1_0::afSwitch. For performance reasons, - * the 1.0 callback may not be called when HAL implementation detects 1.1 - * client (by casting V1_0::ITunerCallback to V1_1::ITunerCallback). + * This callback supersedes V1_0::afSwitch. + * The 1.0 callback must not be called when HAL implementation detects + * 1.1 client (by casting V1_0::ITunerCallback to V1_1::ITunerCallback). * * @param selector A ProgramSelector structure describing the tuned station. */ @@ -73,6 +73,9 @@ interface ITunerCallback extends @1.0::ITunerCallback { * call it immediately, ie. it may wait for a short time to accumulate * multiple list change notifications into a single event. * + * This callback is only for notifying about insertions and deletions, + * not about metadata changes. + * * It may be triggered either by an explicitly issued background scan, * or a scan issued by the device internally. * @@ -89,10 +92,10 @@ interface ITunerCallback extends @1.0::ITunerCallback { * * This may be called together with tuneComplete_1_1 or afSwitch_1_1. * - * This callback supersedes V1_0::tuneComplete, V1_0::afSwitch and - * newMetadata. For performance reasons, these callbacks may not be called - * when HAL implementation detects 1.1 client (by casting - * V1_0::ITunerCallback to V1_1::ITunerCallback). + * This callback supersedes V1_0::newMetadata and partly V1_0::tuneComplete + * and V1_0::afSwitch. + * 1.0 callbacks must not be called when HAL implementation detects + * 1.1 client (by casting V1_0::ITunerCallback to V1_1::ITunerCallback). */ - oneway programInfoChanged(); + oneway currentProgramInfoChanged(); }; diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index f48a8db369..1e6b9daae0 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -248,10 +248,10 @@ Return Tuner::tune(uint32_t channel, uint32_t subChannel) { lock_guard lk(mMut); band = mAmfmConfig.type; } - return tune_1_1(utils::make_selector(band, channel, subChannel)); + return tuneByProgramSelector(utils::make_selector(band, channel, subChannel)); } -Return Tuner::tune_1_1(const ProgramSelector& sel) { +Return Tuner::tuneByProgramSelector(const ProgramSelector& sel) { ALOGV("%s(%s)", __func__, toString(sel).c_str()); lock_guard lk(mMut); if (mIsClosed) return Result::NOT_INITIALIZED; @@ -336,6 +336,15 @@ Return Tuner::getProgramList(const hidl_string& filter, getProgramList_cb return {}; } +Return Tuner::setAnalogForced(bool isForced) { + ALOGV("%s", __func__); + lock_guard lk(mMut); + if (mIsClosed) return Result::NOT_INITIALIZED; + + mIsAnalogForced = isForced; + return Result::OK; +} + Return Tuner::isAnalogForced(isAnalogForced_cb _hidl_cb) { ALOGV("%s", __func__); lock_guard lk(mMut); @@ -348,15 +357,6 @@ Return Tuner::isAnalogForced(isAnalogForced_cb _hidl_cb) { return {}; } -Return Tuner::setAnalogForced(bool isForced) { - ALOGV("%s", __func__); - lock_guard lk(mMut); - if (mIsClosed) return Result::NOT_INITIALIZED; - - mIsAnalogForced = isForced; - return Result::OK; -} - } // namespace implementation } // namespace V1_1 } // namespace broadcastradio diff --git a/broadcastradio/1.1/default/Tuner.h b/broadcastradio/1.1/default/Tuner.h index c4efe6ec4c..f375a84a37 100644 --- a/broadcastradio/1.1/default/Tuner.h +++ b/broadcastradio/1.1/default/Tuner.h @@ -39,7 +39,7 @@ struct Tuner : public ITuner { virtual Return scan(V1_0::Direction direction, bool skipSubChannel) override; virtual Return step(V1_0::Direction direction, bool skipSubChannel) override; virtual Return tune(uint32_t channel, uint32_t subChannel) override; - virtual Return tune_1_1(const ProgramSelector& program) override; + virtual Return tuneByProgramSelector(const ProgramSelector& program) override; virtual Return cancel() override; virtual Return cancelAnnouncement() override; virtual Return getProgramInformation(getProgramInformation_cb _hidl_cb) override; @@ -47,8 +47,8 @@ struct Tuner : public ITuner { virtual Return startBackgroundScan() override; virtual Return getProgramList(const hidl_string& filter, getProgramList_cb _hidl_cb) override; - virtual Return isAnalogForced(isAnalogForced_cb _hidl_cb) override; virtual Return setAnalogForced(bool isForced) override; + virtual Return isAnalogForced(isAnalogForced_cb _hidl_cb) override; private: std::mutex mMut; diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index bd2e0a7241..41cea275b0 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -84,7 +84,7 @@ struct TunerCallbackMock : public ITunerCallback { MOCK_METHOD1(backgroundScanAvailable, Return(bool)); MOCK_TIMEOUT_METHOD1(backgroundScanComplete, Return(ProgramListResult)); MOCK_METHOD0(programListChanged, Return()); - MOCK_METHOD0(programInfoChanged, Return()); + MOCK_METHOD0(currentProgramInfoChanged, Return()); }; class BroadcastRadioHalTest : public ::testing::VtsHalHidlTargetTestBase, @@ -315,7 +315,7 @@ TEST_P(BroadcastRadioHalTest, OpenTunerTwice) { * - getProgramList either succeeds or returns NOT_STARTED/NOT_READY status; * - if the program list is NOT_STARTED, startBackgroundScan makes it completed * within a full scan timeout and the next getProgramList call succeeds; - * - if the program list is not empty, tune_1_1 call succeeds. + * - if the program list is not empty, tuneByProgramSelector call succeeds. */ TEST_P(BroadcastRadioHalTest, TuneFromProgramList) { if (skipped) return; @@ -340,7 +340,7 @@ TEST_P(BroadcastRadioHalTest, TuneFromProgramList) { EXPECT_CALL(*mCallback, tuneComplete(_, _)).Times(0); EXPECT_TIMEOUT_CALL(*mCallback, tuneComplete_1_1, Result::OK, _) .WillOnce(DoAll(SaveArg<1>(&selCb), testing::Return(ByMove(Void())))); - auto tuneResult = mTuner->tune_1_1(firstProgram.selector); + auto tuneResult = mTuner->tuneByProgramSelector(firstProgram.selector); ASSERT_EQ(Result::OK, tuneResult); EXPECT_TIMEOUT_CALL_WAIT(*mCallback, tuneComplete_1_1, kTuneTimeout); EXPECT_EQ(firstProgram.selector.primaryId, selCb.primaryId); From 8864792125eecc79797af3dc7b1a2fb28676b7ba Mon Sep 17 00:00:00 2001 From: Enrico Granata Date: Tue, 1 Aug 2017 16:58:51 -0700 Subject: [PATCH 096/265] Fix a typo in one of the OBD2 ignition monitors Test: build Bug: 64024685 Change-Id: Iab438e53ef71e61a4f58af48171bb0151a602fd6 --- automotive/vehicle/2.1/types.hal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automotive/vehicle/2.1/types.hal b/automotive/vehicle/2.1/types.hal index e5f94113a3..3cd2cdfab3 100644 --- a/automotive/vehicle/2.1/types.hal +++ b/automotive/vehicle/2.1/types.hal @@ -328,7 +328,7 @@ enum Obd2CompressionIgnitionMonitors : Obd2CommonIgnitionMonitors { BOOST_PRESSURE_AVAILABLE = 0x1 << 12, BOOST_PRESSURE_INCOMPLETE = 0x1 << 13, - NOx_SCR__AVAILABLE = 0x1 << 14, + NOx_SCR_AVAILABLE = 0x1 << 14, NOx_SCR_INCOMPLETE = 0x1 << 15, NMHC_CATALYST_AVAILABLE = 0x1 << 16, From 5b25fa66ca58f7f7b11aa890973eb61ecdbf314e Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Tue, 1 Aug 2017 15:53:15 +0530 Subject: [PATCH 097/265] bug fix: android list management in dequeueMsg() 1. use erase() to update iterator as it is safer 2. correct abstime (delayUs) for waitRelative() call Bug: 63796949 Change-Id: I3aece23a6bf4bd33aebfeecd070214911b58c75b --- .../common/media_hidl_test_common.h | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h index b3ca92cd06..29e6450ff6 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h @@ -123,20 +123,21 @@ struct CodecObserver : public IOmxObserver { android::Vector* iBuffers = nullptr, android::Vector* oBuffers = nullptr) { int64_t finishBy = android::ALooper::GetNowUs() + timeoutUs; + android::Mutex::Autolock autoLock(msgLock); for (;;) { - android::Mutex::Autolock autoLock(msgLock); android::List::iterator it = msgQueue.begin(); while (it != msgQueue.end()) { if (it->type == android::hardware::media::omx::V1_0::Message::Type::EVENT) { *msg = *it; - msgQueue.erase(it); + it = msgQueue.erase(it); // OMX_EventBufferFlag event is sent when the component has // processed a buffer with its EOS flag set. This event is // not sent by soft omx components. Vendor components can // send this. From IOMX point of view, we will ignore this // event. - if (msg->data.eventData.event == OMX_EventBufferFlag) break; + if (msg->data.eventData.event == OMX_EventBufferFlag) + continue; return ::android::hardware::media::omx::V1_0::Status::OK; } else if (it->type == android::hardware::media::omx::V1_0:: Message::Type::FILL_BUFFER_DONE) { @@ -147,7 +148,7 @@ struct CodecObserver : public IOmxObserver { it->data.bufferData.buffer) { if (callBack) callBack(*it, &(*oBuffers)[i]); oBuffers->editItemAt(i).owner = client; - msgQueue.erase(it); + it = msgQueue.erase(it); break; } } @@ -162,24 +163,22 @@ struct CodecObserver : public IOmxObserver { it->data.bufferData.buffer) { if (callBack) callBack(*it, &(*iBuffers)[i]); iBuffers->editItemAt(i).owner = client; - msgQueue.erase(it); + it = msgQueue.erase(it); break; } } EXPECT_LE(i, iBuffers->size()); } + } else { + EXPECT_TRUE(false) << "Received unexpected message"; + ++it; } - ++it; } - if (finishBy - android::ALooper::GetNowUs() < 0) - return toStatus(android::TIMED_OUT); - android::status_t err = - (timeoutUs < 0) - ? msgCondition.wait(msgLock) - : msgCondition.waitRelative( - msgLock, - (finishBy - android::ALooper::GetNowUs()) * 1000ll); - if (err == android::TIMED_OUT) return toStatus(err); + int64_t delayUs = finishBy - android::ALooper::GetNowUs(); + if (delayUs < 0) return toStatus(android::TIMED_OUT); + (timeoutUs < 0) + ? msgCondition.wait(msgLock) + : msgCondition.waitRelative(msgLock, delayUs * 1000ll); } } From bf556d1b91f112405411a3655c582612fe060821 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Tue, 4 Jul 2017 19:21:19 +0530 Subject: [PATCH 098/265] bug fix: output colorformat configuration fixed The eColorFormat field in OMX_PARAM_PORTDEFINITIONTYPE structure has no effect on the component. This has to be configured from OMX_VIDEO_PARAM_PORTFORMATTYPE. This is corrected. This color format information is passed to graphic buffer during its allocation Bug: 63796949 Change-Id: I51b1e59631647d1291ecfac373781ac5e5a0ffd5 --- .../omx/1.0/vts/functional/common/Android.bp | 0 .../common/media_hidl_test_common.cpp | 0 .../VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 248 ++++++++++++++---- media/res/bbb_aac_stereo_128kbps_48000hz.aac | Bin media/res/bbb_aac_stereo_128kbps_48000hz.info | 0 media/res/bbb_amrwb_1ch_14kbps_16000hz.amrwb | Bin media/res/bbb_amrwb_1ch_14kbps_16000hz.info | 0 media/res/bbb_g711alaw_1ch_8khz.info | 0 media/res/bbb_g711alaw_1ch_8khz.raw | 0 media/res/bbb_g711mulaw_1ch_8khz.info | 0 media/res/bbb_g711mulaw_1ch_8khz.raw | 0 media/res/bbb_gsm_1ch_8khz_13kbps.info | 0 media/res/bbb_gsm_1ch_8khz_13kbps.raw | Bin .../res/bbb_opus_stereo_128kbps_48000hz.info | 0 .../res/bbb_opus_stereo_128kbps_48000hz.opus | Bin media/res/bbb_raw_1ch_8khz_s32le.info | 0 media/res/bbb_raw_1ch_8khz_s32le.raw | Bin .../bbb_vorbis_stereo_128kbps_48000hz.info | 0 .../bbb_vorbis_stereo_128kbps_48000hz.vorbis | Bin 19 files changed, 200 insertions(+), 48 deletions(-) mode change 100755 => 100644 media/omx/1.0/vts/functional/common/Android.bp mode change 100755 => 100644 media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp mode change 100755 => 100644 media/res/bbb_aac_stereo_128kbps_48000hz.aac mode change 100755 => 100644 media/res/bbb_aac_stereo_128kbps_48000hz.info mode change 100755 => 100644 media/res/bbb_amrwb_1ch_14kbps_16000hz.amrwb mode change 100755 => 100644 media/res/bbb_amrwb_1ch_14kbps_16000hz.info mode change 100755 => 100644 media/res/bbb_g711alaw_1ch_8khz.info mode change 100755 => 100644 media/res/bbb_g711alaw_1ch_8khz.raw mode change 100755 => 100644 media/res/bbb_g711mulaw_1ch_8khz.info mode change 100755 => 100644 media/res/bbb_g711mulaw_1ch_8khz.raw mode change 100755 => 100644 media/res/bbb_gsm_1ch_8khz_13kbps.info mode change 100755 => 100644 media/res/bbb_gsm_1ch_8khz_13kbps.raw mode change 100755 => 100644 media/res/bbb_opus_stereo_128kbps_48000hz.info mode change 100755 => 100644 media/res/bbb_opus_stereo_128kbps_48000hz.opus mode change 100755 => 100644 media/res/bbb_raw_1ch_8khz_s32le.info mode change 100755 => 100644 media/res/bbb_raw_1ch_8khz_s32le.raw mode change 100755 => 100644 media/res/bbb_vorbis_stereo_128kbps_48000hz.info mode change 100755 => 100644 media/res/bbb_vorbis_stereo_128kbps_48000hz.vorbis diff --git a/media/omx/1.0/vts/functional/common/Android.bp b/media/omx/1.0/vts/functional/common/Android.bp old mode 100755 new mode 100644 diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp old mode 100755 new mode 100644 diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index 16ba745eb1..0771719c67 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -27,6 +27,7 @@ #include #include #include +#include using ::android::hardware::graphics::common::V1_0::BufferUsage; using ::android::hardware::graphics::common::V1_0::PixelFormat; @@ -47,6 +48,7 @@ using ::android::sp; #include #include +#include #include #include #include @@ -410,7 +412,7 @@ void GetURLForComponent(VideoDecHidlTest::standardComp comp, char* mURL, void allocateGraphicBuffers(sp omxNode, OMX_U32 portIndex, android::Vector* buffArray, uint32_t nFrameWidth, uint32_t nFrameHeight, - int32_t* nStride, uint32_t count) { + int32_t* nStride, int format, uint32_t count) { android::hardware::media::omx::V1_0::Status status; sp allocator = android::hardware::graphics::allocator::V2_0::IAllocator::getService(); @@ -427,7 +429,7 @@ void allocateGraphicBuffers(sp omxNode, OMX_U32 portIndex, descriptorInfo.width = nFrameWidth; descriptorInfo.height = nFrameHeight; descriptorInfo.layerCount = 1; - descriptorInfo.format = PixelFormat::RGBA_8888; + descriptorInfo.format = static_cast(format); descriptorInfo.usage = static_cast(BufferUsage::CPU_READ_OFTEN); omxNode->getGraphicBufferUsage( portIndex, @@ -452,6 +454,9 @@ void allocateGraphicBuffers(sp omxNode, OMX_U32 portIndex, EXPECT_EQ(error, android::hardware::graphics::mapper::V2_0::Error::NONE); EXPECT_EQ(buffArray->size(), count); + + static volatile int32_t nextId = 0; + uint64_t id = static_cast(getpid()) << 32; allocator->allocate( descriptor, count, [&](android::hardware::graphics::mapper::V2_0::Error _s, uint32_t _n1, @@ -475,7 +480,7 @@ void allocateGraphicBuffers(sp omxNode, OMX_U32 portIndex, buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.layerCount = descriptorInfo.layerCount; buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.id = - (*buffArray)[i].id; + id | static_cast(android_atomic_inc(&nextId)); } }); } @@ -521,12 +526,15 @@ void portReconfiguration(sp omxNode, sp observer, // set Port Params uint32_t nFrameWidth, nFrameHeight, xFramerate; - OMX_COLOR_FORMATTYPE eColorFormat = - OMX_COLOR_FormatYUV420Planar; getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, &xFramerate); + // get configured color format + OMX_PARAM_PORTDEFINITIONTYPE portDef; + status = getPortParam(omxNode, OMX_IndexParamPortDefinition, + kPortIndexOutput, &portDef); setDefaultPortParam(omxNode, kPortIndexOutput, - OMX_VIDEO_CodingUnused, eColorFormat, + OMX_VIDEO_CodingUnused, + portDef.format.video.eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); // If you can disable a port, then you should be able to @@ -558,6 +566,7 @@ void portReconfiguration(sp omxNode, sp observer, portDef.format.video.nFrameWidth, portDef.format.video.nFrameHeight, &portDef.format.video.nStride, + portDef.format.video.eColorFormat, portDef.nBufferCountActual); } status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, @@ -717,6 +726,116 @@ void decodeNFrames(sp omxNode, sp observer, } } +// DescribeColorFormatParams Copy Constructor (Borrowed from OMXUtils.cpp) +android::DescribeColorFormatParams::DescribeColorFormatParams( + const android::DescribeColorFormat2Params& params) { + eColorFormat = params.eColorFormat; + nFrameWidth = params.nFrameWidth; + nFrameHeight = params.nFrameHeight; + nStride = params.nStride; + nSliceHeight = params.nSliceHeight; + bUsingNativeBuffers = params.bUsingNativeBuffers; +}; + +bool isColorFormatFlexibleYUV(sp omxNode, + OMX_COLOR_FORMATTYPE eColorFormat) { + android::hardware::media::omx::V1_0::Status status; + unsigned int index = OMX_IndexMax, index2 = OMX_IndexMax; + omxNode->getExtensionIndex( + "OMX.google.android.index.describeColorFormat", + [&index](android::hardware::media::omx::V1_0::Status _s, + unsigned int _nl) { + if (_s == ::android::hardware::media::omx::V1_0::Status::OK) + index = _nl; + }); + omxNode->getExtensionIndex( + "OMX.google.android.index.describeColorFormat2", + [&index2](android::hardware::media::omx::V1_0::Status _s, + unsigned int _nl) { + if (_s == ::android::hardware::media::omx::V1_0::Status::OK) + index2 = _nl; + }); + + android::DescribeColorFormat2Params describeParams; + describeParams.eColorFormat = eColorFormat; + describeParams.nFrameWidth = 128; + describeParams.nFrameHeight = 128; + describeParams.nStride = 128; + describeParams.nSliceHeight = 128; + describeParams.bUsingNativeBuffers = OMX_FALSE; + if (index != OMX_IndexMax) { + android::DescribeColorFormatParams describeParamsV1(describeParams); + status = getParam(omxNode, static_cast(index), + &describeParamsV1); + if (status == ::android::hardware::media::omx::V1_0::Status::OK) { + android::MediaImage& img = describeParamsV1.sMediaImage; + if (img.mType == android::MediaImage::MEDIA_IMAGE_TYPE_YUV) { + if (img.mNumPlanes == 3 && + img.mPlane[img.Y].mHorizSubsampling == 1 && + img.mPlane[img.Y].mVertSubsampling == 1) { + if (img.mPlane[img.U].mHorizSubsampling == 2 && + img.mPlane[img.U].mVertSubsampling == 2 && + img.mPlane[img.V].mHorizSubsampling == 2 && + img.mPlane[img.V].mVertSubsampling == 2) { + if (img.mBitDepth <= 8) { + return true; + } + } + } + } + } + } else if (index2 != OMX_IndexMax) { + status = getParam(omxNode, static_cast(index2), + &describeParams); + android::MediaImage2& img = describeParams.sMediaImage; + if (img.mType == android::MediaImage2::MEDIA_IMAGE_TYPE_YUV) { + if (img.mNumPlanes == 3 && + img.mPlane[img.Y].mHorizSubsampling == 1 && + img.mPlane[img.Y].mVertSubsampling == 1) { + if (img.mPlane[img.U].mHorizSubsampling == 2 && + img.mPlane[img.U].mVertSubsampling == 2 && + img.mPlane[img.V].mHorizSubsampling == 2 && + img.mPlane[img.V].mVertSubsampling == 2) { + if (img.mBitDepth <= 8) { + return true; + } + } + } + } + } + return false; +} + +// get default color format for output port +void getDefaultColorFormat(sp omxNode, OMX_U32 kPortIndexOutput, + PortMode oPortMode, + OMX_COLOR_FORMATTYPE* eColorFormat) { + android::hardware::media::omx::V1_0::Status status; + OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; + *eColorFormat = OMX_COLOR_FormatUnused; + portFormat.nIndex = 0; + while (1) { + status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, + kPortIndexOutput, &portFormat); + if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; + EXPECT_EQ(portFormat.eCompressionFormat, OMX_VIDEO_CodingUnused); + if (oPortMode != PortMode::PRESET_BYTE_BUFFER) { + *eColorFormat = portFormat.eColorFormat; + break; + } + if (isColorFormatFlexibleYUV(omxNode, portFormat.eColorFormat)) { + *eColorFormat = portFormat.eColorFormat; + break; + } + if (OMX_COLOR_FormatYUV420SemiPlanar == portFormat.eColorFormat || + OMX_COLOR_FormatYUV420Planar == portFormat.eColorFormat) { + *eColorFormat = portFormat.eColorFormat; + break; + } + portFormat.nIndex++; + } +} + // set component role TEST_F(VideoDecHidlTest, SetRole) { description("Test Set Component Role"); @@ -806,9 +925,17 @@ TEST_F(VideoDecHidlTest, DecodeTest) { // set Port Params uint32_t nFrameWidth, nFrameHeight, xFramerate; - OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, &xFramerate); + // get default color format + OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; + getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], + &eColorFormat); + ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); + status = + setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, xFramerate); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); omxNode->prepareForAdaptivePlayback(kPortIndexOutput, false, 1920, 1080); @@ -830,7 +957,8 @@ TEST_F(VideoDecHidlTest, DecodeTest) { allocateGraphicBuffers( omxNode, kPortIndexOutput, &oBuffer, portDef.format.video.nFrameWidth, portDef.format.video.nFrameHeight, - &portDef.format.video.nStride, portDef.nBufferCountActual); + &portDef.format.video.nStride, portDef.format.video.eColorFormat, + portDef.nBufferCountActual); } // Port Reconfiguration @@ -868,22 +996,28 @@ TEST_F(VideoDecHidlTest, EOSTest_M) { kPortIndexOutput = kPortIndexInput + 1; } - // set Port Params - uint32_t nFrameWidth, nFrameHeight, xFramerate; - OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; - getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, - &xFramerate); - setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, - eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); - // set port mode - PortMode portMode[2]; - portMode[0] = portMode[1] = PortMode::PRESET_BYTE_BUFFER; status = omxNode->setPortMode(kPortIndexInput, portMode[0]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + // set Port Params + uint32_t nFrameWidth, nFrameHeight, xFramerate; + getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, + &xFramerate); + // get default color format + OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; + getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], + &eColorFormat); + ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); + status = + setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, xFramerate); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); + android::Vector iBuffer, oBuffer; // set state to idle @@ -944,22 +1078,28 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) { } eleInfo.close(); - // set Port Params - uint32_t nFrameWidth, nFrameHeight, xFramerate; - OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; - getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, - &xFramerate); - setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, - eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); - // set port mode - PortMode portMode[2]; - portMode[0] = portMode[1] = PortMode::PRESET_BYTE_BUFFER; status = omxNode->setPortMode(kPortIndexInput, portMode[0]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + // set Port Params + uint32_t nFrameWidth, nFrameHeight, xFramerate; + getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, + &xFramerate); + // get default color format + OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; + getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], + &eColorFormat); + ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); + status = + setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, xFramerate); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); + android::Vector iBuffer, oBuffer; // set state to idle @@ -1045,22 +1185,28 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) { } eleInfo.close(); - // set Port Params - uint32_t nFrameWidth, nFrameHeight, xFramerate; - OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; - getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, - &xFramerate); - setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, - eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); - // set port mode - PortMode portMode[2]; - portMode[0] = portMode[1] = PortMode::PRESET_BYTE_BUFFER; status = omxNode->setPortMode(kPortIndexInput, portMode[0]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + // set Port Params + uint32_t nFrameWidth, nFrameHeight, xFramerate; + getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, + &xFramerate); + // get default color format + OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; + getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], + &eColorFormat); + ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); + status = + setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, xFramerate); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); + android::Vector iBuffer, oBuffer; // set state to idle @@ -1128,22 +1274,28 @@ TEST_F(VideoDecHidlTest, FlushTest) { } eleInfo.close(); - // set Port Params - uint32_t nFrameWidth, nFrameHeight, xFramerate; - OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; - getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, - &xFramerate); - setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, - eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); - // set port mode - PortMode portMode[2]; - portMode[0] = portMode[1] = PortMode::PRESET_BYTE_BUFFER; status = omxNode->setPortMode(kPortIndexInput, portMode[0]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + // set Port Params + uint32_t nFrameWidth, nFrameHeight, xFramerate; + getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, + &xFramerate); + // get default color format + OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; + getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], + &eColorFormat); + ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); + status = + setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, xFramerate); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); + android::Vector iBuffer, oBuffer; // set state to idle diff --git a/media/res/bbb_aac_stereo_128kbps_48000hz.aac b/media/res/bbb_aac_stereo_128kbps_48000hz.aac old mode 100755 new mode 100644 diff --git a/media/res/bbb_aac_stereo_128kbps_48000hz.info b/media/res/bbb_aac_stereo_128kbps_48000hz.info old mode 100755 new mode 100644 diff --git a/media/res/bbb_amrwb_1ch_14kbps_16000hz.amrwb b/media/res/bbb_amrwb_1ch_14kbps_16000hz.amrwb old mode 100755 new mode 100644 diff --git a/media/res/bbb_amrwb_1ch_14kbps_16000hz.info b/media/res/bbb_amrwb_1ch_14kbps_16000hz.info old mode 100755 new mode 100644 diff --git a/media/res/bbb_g711alaw_1ch_8khz.info b/media/res/bbb_g711alaw_1ch_8khz.info old mode 100755 new mode 100644 diff --git a/media/res/bbb_g711alaw_1ch_8khz.raw b/media/res/bbb_g711alaw_1ch_8khz.raw old mode 100755 new mode 100644 diff --git a/media/res/bbb_g711mulaw_1ch_8khz.info b/media/res/bbb_g711mulaw_1ch_8khz.info old mode 100755 new mode 100644 diff --git a/media/res/bbb_g711mulaw_1ch_8khz.raw b/media/res/bbb_g711mulaw_1ch_8khz.raw old mode 100755 new mode 100644 diff --git a/media/res/bbb_gsm_1ch_8khz_13kbps.info b/media/res/bbb_gsm_1ch_8khz_13kbps.info old mode 100755 new mode 100644 diff --git a/media/res/bbb_gsm_1ch_8khz_13kbps.raw b/media/res/bbb_gsm_1ch_8khz_13kbps.raw old mode 100755 new mode 100644 diff --git a/media/res/bbb_opus_stereo_128kbps_48000hz.info b/media/res/bbb_opus_stereo_128kbps_48000hz.info old mode 100755 new mode 100644 diff --git a/media/res/bbb_opus_stereo_128kbps_48000hz.opus b/media/res/bbb_opus_stereo_128kbps_48000hz.opus old mode 100755 new mode 100644 diff --git a/media/res/bbb_raw_1ch_8khz_s32le.info b/media/res/bbb_raw_1ch_8khz_s32le.info old mode 100755 new mode 100644 diff --git a/media/res/bbb_raw_1ch_8khz_s32le.raw b/media/res/bbb_raw_1ch_8khz_s32le.raw old mode 100755 new mode 100644 diff --git a/media/res/bbb_vorbis_stereo_128kbps_48000hz.info b/media/res/bbb_vorbis_stereo_128kbps_48000hz.info old mode 100755 new mode 100644 diff --git a/media/res/bbb_vorbis_stereo_128kbps_48000hz.vorbis b/media/res/bbb_vorbis_stereo_128kbps_48000hz.vorbis old mode 100755 new mode 100644 From dfc529dfefd033accdb01e4e747e6480017f0bd2 Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Wed, 2 Aug 2017 00:21:06 -0700 Subject: [PATCH 099/265] Add OWNERS file to Neuralnetworks VTS test directory Added all six Neuralnetworks team members and two VTS team members Bug: 63905942 Bug: 63525563 Test: Not needed Change-Id: I87a2968af5ceec656e8f392cc0291689e66fef5d --- neuralnetworks/1.0/vts/OWNERS | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 neuralnetworks/1.0/vts/OWNERS diff --git a/neuralnetworks/1.0/vts/OWNERS b/neuralnetworks/1.0/vts/OWNERS new file mode 100644 index 0000000000..59e7c28b64 --- /dev/null +++ b/neuralnetworks/1.0/vts/OWNERS @@ -0,0 +1,11 @@ +# Neuralnetworks team +butlermichael@google.com +dgross@google.com +ijsung@google.com +jeanluc@google.com +miaowang@google.com +yangni@google.com + +# VTS team +yim@google.com +yuexima@google.com From 208a586cf8aa37e83b39e72354e0f6f7c76e4c4a Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Wed, 26 Jul 2017 10:14:57 -0700 Subject: [PATCH 100/265] Update HIDL makefiles. Allow them to be static. This is required for a couple of reasons: - enabling HIDL passthrough in recovery - enabling VTS tests to be static blobs Bug: 32920003 Bug: 64040096 Test: update-all-google-makefiles.sh Merged-In: I1b2401fb273ab80819e3870aa71fe742269674ba Change-Id: I1b2401fb273ab80819e3870aa71fe742269674ba (cherry picked from commit 7206708528e1f0393347719f156ddf0bd0b6249c) --- bluetooth/1.0/Android.bp | 2 +- boot/1.0/Android.bp | 2 +- configstore/1.0/Android.bp | 2 +- ir/1.0/Android.bp | 2 +- nfc/1.0/Android.bp | 2 +- radio/1.0/Android.bp | 2 +- radio/1.1/Android.bp | 2 +- radio/deprecated/1.0/Android.bp | 2 +- renderscript/1.0/Android.bp | 2 +- tests/bar/1.0/Android.bp | 2 +- tests/baz/1.0/Android.bp | 2 +- tests/expression/1.0/Android.bp | 2 +- tests/foo/1.0/Android.bp | 2 +- tests/hash/1.0/Android.bp | 2 +- tests/inheritance/1.0/Android.bp | 2 +- tests/libhwbinder/1.0/Android.bp | 2 +- tests/memory/1.0/Android.bp | 2 +- tests/msgq/1.0/Android.bp | 2 +- tests/multithread/1.0/Android.bp | 2 +- tests/pointer/1.0/Android.bp | 2 +- tetheroffload/config/1.0/Android.bp | 2 +- tetheroffload/control/1.0/Android.bp | 2 +- wifi/1.0/Android.bp | 2 +- wifi/supplicant/1.0/Android.bp | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/bluetooth/1.0/Android.bp b/bluetooth/1.0/Android.bp index 48159b34ec..34d16482be 100644 --- a/bluetooth/1.0/Android.bp +++ b/bluetooth/1.0/Android.bp @@ -46,7 +46,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.bluetooth@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.bluetooth@1.0_genc++"], diff --git a/boot/1.0/Android.bp b/boot/1.0/Android.bp index de42647ca7..e13860183e 100644 --- a/boot/1.0/Android.bp +++ b/boot/1.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.boot@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.boot@1.0_genc++"], diff --git a/configstore/1.0/Android.bp b/configstore/1.0/Android.bp index 89f99f2056..6e60433fc9 100644 --- a/configstore/1.0/Android.bp +++ b/configstore/1.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.configstore@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.configstore@1.0_genc++"], diff --git a/ir/1.0/Android.bp b/ir/1.0/Android.bp index a059da53dd..12e62c0291 100644 --- a/ir/1.0/Android.bp +++ b/ir/1.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.ir@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.ir@1.0_genc++"], diff --git a/nfc/1.0/Android.bp b/nfc/1.0/Android.bp index 7c9a66edce..9e055d0c7a 100644 --- a/nfc/1.0/Android.bp +++ b/nfc/1.0/Android.bp @@ -46,7 +46,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.nfc@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.nfc@1.0_genc++"], diff --git a/radio/1.0/Android.bp b/radio/1.0/Android.bp index 988f5d2c6e..8af2675c43 100644 --- a/radio/1.0/Android.bp +++ b/radio/1.0/Android.bp @@ -67,7 +67,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.radio@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.radio@1.0_genc++"], diff --git a/radio/1.1/Android.bp b/radio/1.1/Android.bp index 3a3f639c69..32de319b46 100644 --- a/radio/1.1/Android.bp +++ b/radio/1.1/Android.bp @@ -60,7 +60,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.radio@1.1", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.radio@1.1_genc++"], diff --git a/radio/deprecated/1.0/Android.bp b/radio/deprecated/1.0/Android.bp index e45ecc36c8..f4a6666725 100644 --- a/radio/deprecated/1.0/Android.bp +++ b/radio/deprecated/1.0/Android.bp @@ -49,7 +49,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.radio.deprecated@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.radio.deprecated@1.0_genc++"], diff --git a/renderscript/1.0/Android.bp b/renderscript/1.0/Android.bp index d59931508a..2632505743 100644 --- a/renderscript/1.0/Android.bp +++ b/renderscript/1.0/Android.bp @@ -46,7 +46,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.renderscript@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.renderscript@1.0_genc++"], diff --git a/tests/bar/1.0/Android.bp b/tests/bar/1.0/Android.bp index 4c76014ab8..b6ee0423a7 100644 --- a/tests/bar/1.0/Android.bp +++ b/tests/bar/1.0/Android.bp @@ -67,7 +67,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tests.bar@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.bar@1.0_genc++"], diff --git a/tests/baz/1.0/Android.bp b/tests/baz/1.0/Android.bp index 1445b11fb0..ef68149984 100644 --- a/tests/baz/1.0/Android.bp +++ b/tests/baz/1.0/Android.bp @@ -60,7 +60,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tests.baz@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.baz@1.0_genc++"], diff --git a/tests/expression/1.0/Android.bp b/tests/expression/1.0/Android.bp index 0cfe47d037..bc389b0a65 100644 --- a/tests/expression/1.0/Android.bp +++ b/tests/expression/1.0/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tests.expression@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.expression@1.0_genc++"], diff --git a/tests/foo/1.0/Android.bp b/tests/foo/1.0/Android.bp index b698847069..638795046a 100644 --- a/tests/foo/1.0/Android.bp +++ b/tests/foo/1.0/Android.bp @@ -67,7 +67,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tests.foo@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.foo@1.0_genc++"], diff --git a/tests/hash/1.0/Android.bp b/tests/hash/1.0/Android.bp index 617ddecf7d..505a4ad553 100644 --- a/tests/hash/1.0/Android.bp +++ b/tests/hash/1.0/Android.bp @@ -35,7 +35,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tests.hash@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.hash@1.0_genc++"], diff --git a/tests/inheritance/1.0/Android.bp b/tests/inheritance/1.0/Android.bp index 4dbcf4b240..5d8d53de20 100644 --- a/tests/inheritance/1.0/Android.bp +++ b/tests/inheritance/1.0/Android.bp @@ -56,7 +56,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tests.inheritance@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.inheritance@1.0_genc++"], diff --git a/tests/libhwbinder/1.0/Android.bp b/tests/libhwbinder/1.0/Android.bp index f254bad30b..338a72b1d7 100644 --- a/tests/libhwbinder/1.0/Android.bp +++ b/tests/libhwbinder/1.0/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tests.libhwbinder@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.libhwbinder@1.0_genc++"], diff --git a/tests/memory/1.0/Android.bp b/tests/memory/1.0/Android.bp index 5a62896906..a7538240b2 100644 --- a/tests/memory/1.0/Android.bp +++ b/tests/memory/1.0/Android.bp @@ -35,7 +35,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tests.memory@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.memory@1.0_genc++"], diff --git a/tests/msgq/1.0/Android.bp b/tests/msgq/1.0/Android.bp index 19ff89cfc6..0937545983 100644 --- a/tests/msgq/1.0/Android.bp +++ b/tests/msgq/1.0/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tests.msgq@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.msgq@1.0_genc++"], diff --git a/tests/multithread/1.0/Android.bp b/tests/multithread/1.0/Android.bp index c3782a0d6d..5f4c44c980 100644 --- a/tests/multithread/1.0/Android.bp +++ b/tests/multithread/1.0/Android.bp @@ -35,7 +35,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tests.multithread@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.multithread@1.0_genc++"], diff --git a/tests/pointer/1.0/Android.bp b/tests/pointer/1.0/Android.bp index 37fea949eb..a765ae76d6 100644 --- a/tests/pointer/1.0/Android.bp +++ b/tests/pointer/1.0/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tests.pointer@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.pointer@1.0_genc++"], diff --git a/tetheroffload/config/1.0/Android.bp b/tetheroffload/config/1.0/Android.bp index 7beefbf644..4a928295be 100644 --- a/tetheroffload/config/1.0/Android.bp +++ b/tetheroffload/config/1.0/Android.bp @@ -35,7 +35,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tetheroffload.config@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tetheroffload.config@1.0_genc++"], diff --git a/tetheroffload/control/1.0/Android.bp b/tetheroffload/control/1.0/Android.bp index d351edb817..707ec3a80e 100644 --- a/tetheroffload/control/1.0/Android.bp +++ b/tetheroffload/control/1.0/Android.bp @@ -46,7 +46,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tetheroffload.control@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tetheroffload.control@1.0_genc++"], diff --git a/wifi/1.0/Android.bp b/wifi/1.0/Android.bp index c8b694c460..2e954ee514 100644 --- a/wifi/1.0/Android.bp +++ b/wifi/1.0/Android.bp @@ -123,7 +123,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.wifi@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.wifi@1.0_genc++"], diff --git a/wifi/supplicant/1.0/Android.bp b/wifi/supplicant/1.0/Android.bp index 9242fb67ae..3c83d12224 100644 --- a/wifi/supplicant/1.0/Android.bp +++ b/wifi/supplicant/1.0/Android.bp @@ -116,7 +116,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.wifi.supplicant@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.wifi.supplicant@1.0_genc++"], From 9214894ebc24b2c600539ff78002330762c7e674 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Mon, 31 Jul 2017 15:04:35 -0700 Subject: [PATCH 101/265] Linguistic fixes for broadcastradio 1.1 HAL. Bug: b/64113304 Test: it builds Change-Id: I5d5d090a44146e327d7b0f69cc2ba97060f3b515 --- broadcastradio/1.1/IBroadcastRadio.hal | 12 +++++++----- broadcastradio/1.1/IBroadcastRadioFactory.hal | 6 ++++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/broadcastradio/1.1/IBroadcastRadio.hal b/broadcastradio/1.1/IBroadcastRadio.hal index 9bde361bdb..c722e40acd 100644 --- a/broadcastradio/1.1/IBroadcastRadio.hal +++ b/broadcastradio/1.1/IBroadcastRadio.hal @@ -31,19 +31,21 @@ interface IBroadcastRadio extends @1.0::IBroadcastRadio { * Fetch image from radio module. * * This call is meant to make V1_0::MetaData lightweight - instead of - * passing image data blob in MetadataType.RAW field, only identifier is - * passed, so the client may cache images or even not fetch them. + * passing an image data blob in the MetadataType.RAW field, the HAL + * implementation only passes the identifier, so the client may cache images + * or even not fetch them. * - * Identifier may be any arbitrary number - sequential, sha256 prefix, + * The identifier may be any arbitrary number - sequential, sha256 prefix, * or any other unique value selected by the vendor. * * The data should be a valid PNG, JPEG, GIF or BMP file. - * Invalid format must be handled gracefully as if the image was missing. + * Image data with an invalid format must be handled gracefully in the same + * way as a missing image. * * @param id Identifier of an image; * value of 0 is reserved and should be treated as invalid image. * @return image A binary blob with image data - * or zero-length vector if identifier doesn't exists. + * or a zero-length vector if identifier doesn't exist. */ getImage(int32_t id) generates (vec image); }; diff --git a/broadcastradio/1.1/IBroadcastRadioFactory.hal b/broadcastradio/1.1/IBroadcastRadioFactory.hal index fce1cc0c72..edf78ff09a 100644 --- a/broadcastradio/1.1/IBroadcastRadioFactory.hal +++ b/broadcastradio/1.1/IBroadcastRadioFactory.hal @@ -19,8 +19,10 @@ package android.hardware.broadcastradio@1.1; import @1.0::IBroadcastRadioFactory; /** - * To use 1.1 features you must cast specific interfaces after being returned from 1.0 HAL, - * for example V1_1::ITuner::castFrom() after retrieving it from IBroadcastRadio::openTuner(). + * To use 1.1 features you must cast specific interfaces returned from the + * 1.0 HAL. For example V1_0::IBroadcastRadio::openTuner() returns V1_0::ITuner, + * which can be cast with V1_1::ITuner::castFrom() call. + * * The 1.1 server must always return the 1.1 version of specific interface. */ interface IBroadcastRadioFactory extends @1.0::IBroadcastRadioFactory { From f5d136c231a8c0b601e236a63b7bb4d4c92ca526 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Wed, 2 Aug 2017 15:19:22 -0700 Subject: [PATCH 102/265] Update Android.bp HIDL makefiles Allow HAL definition libs to be static. Bug: 32920003 Bug: 64040096 Test: update-all-google-makefiles.sh Change-Id: I1483d572bea6799717d1614fb7d52fe225e31104 --- audio/2.0/Android.bp | 2 +- audio/common/2.0/Android.bp | 2 +- audio/effect/2.0/Android.bp | 2 +- automotive/evs/1.0/Android.bp | 2 +- automotive/vehicle/2.0/Android.bp | 2 +- automotive/vehicle/2.1/Android.bp | 2 +- biometrics/fingerprint/2.1/Android.bp | 2 +- broadcastradio/1.0/Android.bp | 2 +- broadcastradio/1.1/Android.bp | 2 +- camera/common/1.0/Android.bp | 2 +- camera/device/1.0/Android.bp | 2 +- camera/device/3.2/Android.bp | 2 +- camera/metadata/3.2/Android.bp | 2 +- camera/provider/2.4/Android.bp | 2 +- cas/1.0/Android.bp | 2 +- cas/native/1.0/Android.bp | 2 +- configstore/1.1/Android.bp | 2 +- contexthub/1.0/Android.bp | 2 +- drm/1.0/Android.bp | 4 +--- drm/Android.bp | 1 + dumpstate/1.0/Android.bp | 2 +- gatekeeper/1.0/Android.bp | 2 +- gnss/1.0/Android.bp | 2 +- graphics/allocator/2.0/Android.bp | 2 +- graphics/bufferqueue/1.0/Android.bp | 2 +- graphics/common/1.0/Android.bp | 2 +- graphics/composer/2.1/Android.bp | 2 +- graphics/mapper/2.0/Android.bp | 2 +- health/1.0/Android.bp | 2 +- health/1.0/default/Android.bp | 4 ---- health/Android.bp | 1 + keymaster/3.0/Android.bp | 2 +- light/2.0/Android.bp | 2 +- media/1.0/Android.bp | 2 +- media/omx/1.0/Android.bp | 2 +- memtrack/1.0/Android.bp | 2 +- neuralnetworks/1.0/Android.bp | 2 +- oemlock/1.0/Android.bp | 2 +- power/1.0/Android.bp | 2 +- power/1.1/Android.bp | 2 +- sensors/1.0/Android.bp | 2 +- soundtrigger/2.0/Android.bp | 2 +- tests/extension/light/2.0/Android.bp | 2 +- thermal/1.0/Android.bp | 2 +- tv/cec/1.0/Android.bp | 2 +- tv/input/1.0/Android.bp | 2 +- usb/1.0/Android.bp | 2 +- usb/1.1/Android.bp | 2 +- vibrator/1.0/Android.bp | 2 +- vibrator/1.1/Android.bp | 2 +- vr/1.0/Android.bp | 2 +- weaver/1.0/Android.bp | 2 +- wifi/1.1/Android.bp | 2 +- wifi/offload/1.0/Android.bp | 2 +- 54 files changed, 53 insertions(+), 57 deletions(-) diff --git a/audio/2.0/Android.bp b/audio/2.0/Android.bp index b193c8f294..b1419517ba 100644 --- a/audio/2.0/Android.bp +++ b/audio/2.0/Android.bp @@ -81,7 +81,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.audio@2.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.audio@2.0_genc++"], diff --git a/audio/common/2.0/Android.bp b/audio/common/2.0/Android.bp index 39db15a14d..ee28eff634 100644 --- a/audio/common/2.0/Android.bp +++ b/audio/common/2.0/Android.bp @@ -32,7 +32,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.audio.common@2.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.audio.common@2.0_genc++"], diff --git a/audio/effect/2.0/Android.bp b/audio/effect/2.0/Android.bp index a004263aa8..8bfde143f5 100644 --- a/audio/effect/2.0/Android.bp +++ b/audio/effect/2.0/Android.bp @@ -130,7 +130,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.audio.effect@2.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.audio.effect@2.0_genc++"], diff --git a/automotive/evs/1.0/Android.bp b/automotive/evs/1.0/Android.bp index 9ca97a7bde..05bc72172b 100644 --- a/automotive/evs/1.0/Android.bp +++ b/automotive/evs/1.0/Android.bp @@ -60,7 +60,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.automotive.evs@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.automotive.evs@1.0_genc++"], diff --git a/automotive/vehicle/2.0/Android.bp b/automotive/vehicle/2.0/Android.bp index e21bef02da..3fd56239b1 100644 --- a/automotive/vehicle/2.0/Android.bp +++ b/automotive/vehicle/2.0/Android.bp @@ -46,7 +46,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.automotive.vehicle@2.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.automotive.vehicle@2.0_genc++"], diff --git a/automotive/vehicle/2.1/Android.bp b/automotive/vehicle/2.1/Android.bp index 9e45fb5aa5..5fb188a58d 100644 --- a/automotive/vehicle/2.1/Android.bp +++ b/automotive/vehicle/2.1/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.automotive.vehicle@2.1", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.automotive.vehicle@2.1_genc++"], diff --git a/biometrics/fingerprint/2.1/Android.bp b/biometrics/fingerprint/2.1/Android.bp index c16fd786b8..04d35073a0 100644 --- a/biometrics/fingerprint/2.1/Android.bp +++ b/biometrics/fingerprint/2.1/Android.bp @@ -46,7 +46,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.biometrics.fingerprint@2.1", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.biometrics.fingerprint@2.1_genc++"], diff --git a/broadcastradio/1.0/Android.bp b/broadcastradio/1.0/Android.bp index f0c4b225f4..06126d3002 100644 --- a/broadcastradio/1.0/Android.bp +++ b/broadcastradio/1.0/Android.bp @@ -60,7 +60,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.broadcastradio@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.broadcastradio@1.0_genc++"], diff --git a/broadcastradio/1.1/Android.bp b/broadcastradio/1.1/Android.bp index 3b50416818..4c37b36211 100644 --- a/broadcastradio/1.1/Android.bp +++ b/broadcastradio/1.1/Android.bp @@ -60,7 +60,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.broadcastradio@1.1", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.broadcastradio@1.1_genc++"], diff --git a/camera/common/1.0/Android.bp b/camera/common/1.0/Android.bp index 252d49069b..22457b0991 100644 --- a/camera/common/1.0/Android.bp +++ b/camera/common/1.0/Android.bp @@ -32,7 +32,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.camera.common@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.camera.common@1.0_genc++"], diff --git a/camera/device/1.0/Android.bp b/camera/device/1.0/Android.bp index 3ef40c8444..3a6615c5d8 100644 --- a/camera/device/1.0/Android.bp +++ b/camera/device/1.0/Android.bp @@ -53,7 +53,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.camera.device@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.camera.device@1.0_genc++"], diff --git a/camera/device/3.2/Android.bp b/camera/device/3.2/Android.bp index dbc80ab62b..3c60570bd8 100644 --- a/camera/device/3.2/Android.bp +++ b/camera/device/3.2/Android.bp @@ -53,7 +53,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.camera.device@3.2", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.camera.device@3.2_genc++"], diff --git a/camera/metadata/3.2/Android.bp b/camera/metadata/3.2/Android.bp index 707b5210be..1bec475798 100644 --- a/camera/metadata/3.2/Android.bp +++ b/camera/metadata/3.2/Android.bp @@ -32,7 +32,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.camera.metadata@3.2", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.camera.metadata@3.2_genc++"], diff --git a/camera/provider/2.4/Android.bp b/camera/provider/2.4/Android.bp index 36a726a61b..02f4d8d144 100644 --- a/camera/provider/2.4/Android.bp +++ b/camera/provider/2.4/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.camera.provider@2.4", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.camera.provider@2.4_genc++"], diff --git a/cas/1.0/Android.bp b/cas/1.0/Android.bp index 2251f119f5..f351d10c04 100644 --- a/cas/1.0/Android.bp +++ b/cas/1.0/Android.bp @@ -60,7 +60,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.cas@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.cas@1.0_genc++"], diff --git a/cas/native/1.0/Android.bp b/cas/native/1.0/Android.bp index 414fca7b93..18361566c6 100644 --- a/cas/native/1.0/Android.bp +++ b/cas/native/1.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.cas.native@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.cas.native@1.0_genc++"], diff --git a/configstore/1.1/Android.bp b/configstore/1.1/Android.bp index 2d8cb64eb3..157265ab7d 100644 --- a/configstore/1.1/Android.bp +++ b/configstore/1.1/Android.bp @@ -35,7 +35,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.configstore@1.1", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.configstore@1.1_genc++"], diff --git a/contexthub/1.0/Android.bp b/contexthub/1.0/Android.bp index 45d2e5c0c4..286e9610d0 100644 --- a/contexthub/1.0/Android.bp +++ b/contexthub/1.0/Android.bp @@ -46,7 +46,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.contexthub@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.contexthub@1.0_genc++"], diff --git a/drm/1.0/Android.bp b/drm/1.0/Android.bp index 731f58fa1c..a6c2021d1a 100644 --- a/drm/1.0/Android.bp +++ b/drm/1.0/Android.bp @@ -67,7 +67,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.drm@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.drm@1.0_genc++"], @@ -89,5 +89,3 @@ cc_library_shared { "libutils", ], } - -subdirs = ["default"] diff --git a/drm/Android.bp b/drm/Android.bp index 33f70ebae2..ed19a37034 100644 --- a/drm/Android.bp +++ b/drm/Android.bp @@ -1,5 +1,6 @@ // This is an autogenerated file, do not edit. subdirs = [ "1.0", + "1.0/default", "1.0/vts/functional", ] diff --git a/dumpstate/1.0/Android.bp b/dumpstate/1.0/Android.bp index 2424c33e7a..a2b497b03f 100644 --- a/dumpstate/1.0/Android.bp +++ b/dumpstate/1.0/Android.bp @@ -35,7 +35,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.dumpstate@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.dumpstate@1.0_genc++"], diff --git a/gatekeeper/1.0/Android.bp b/gatekeeper/1.0/Android.bp index eb70c09c3c..4b54561217 100644 --- a/gatekeeper/1.0/Android.bp +++ b/gatekeeper/1.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.gatekeeper@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.gatekeeper@1.0_genc++"], diff --git a/gnss/1.0/Android.bp b/gnss/1.0/Android.bp index c2988defb6..0b342f4410 100644 --- a/gnss/1.0/Android.bp +++ b/gnss/1.0/Android.bp @@ -172,7 +172,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.gnss@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.gnss@1.0_genc++"], diff --git a/graphics/allocator/2.0/Android.bp b/graphics/allocator/2.0/Android.bp index 2c2a3da9ac..4b358982ac 100644 --- a/graphics/allocator/2.0/Android.bp +++ b/graphics/allocator/2.0/Android.bp @@ -35,7 +35,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.graphics.allocator@2.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.graphics.allocator@2.0_genc++"], diff --git a/graphics/bufferqueue/1.0/Android.bp b/graphics/bufferqueue/1.0/Android.bp index 477396396c..ff51843481 100644 --- a/graphics/bufferqueue/1.0/Android.bp +++ b/graphics/bufferqueue/1.0/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.graphics.bufferqueue@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.graphics.bufferqueue@1.0_genc++"], diff --git a/graphics/common/1.0/Android.bp b/graphics/common/1.0/Android.bp index 3d9aa90b6f..f694ea8070 100644 --- a/graphics/common/1.0/Android.bp +++ b/graphics/common/1.0/Android.bp @@ -32,7 +32,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.graphics.common@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.graphics.common@1.0_genc++"], diff --git a/graphics/composer/2.1/Android.bp b/graphics/composer/2.1/Android.bp index 299570d1a2..0292f03fb3 100644 --- a/graphics/composer/2.1/Android.bp +++ b/graphics/composer/2.1/Android.bp @@ -53,7 +53,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.graphics.composer@2.1", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.graphics.composer@2.1_genc++"], diff --git a/graphics/mapper/2.0/Android.bp b/graphics/mapper/2.0/Android.bp index 408d58fd30..36babd0ad6 100644 --- a/graphics/mapper/2.0/Android.bp +++ b/graphics/mapper/2.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.graphics.mapper@2.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.graphics.mapper@2.0_genc++"], diff --git a/health/1.0/Android.bp b/health/1.0/Android.bp index 4fb2d7bd19..3b5dde8fbc 100644 --- a/health/1.0/Android.bp +++ b/health/1.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.health@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.health@1.0_genc++"], diff --git a/health/1.0/default/Android.bp b/health/1.0/default/Android.bp index c57152f01a..cb2e87d16e 100644 --- a/health/1.0/default/Android.bp +++ b/health/1.0/default/Android.bp @@ -1,7 +1,3 @@ -subdirs = [ - "libhealthd", -] - cc_library_static { name: "android.hardware.health@1.0-convert", vendor_available: true, diff --git a/health/Android.bp b/health/Android.bp index ed19a37034..a6f60173d8 100644 --- a/health/Android.bp +++ b/health/Android.bp @@ -2,5 +2,6 @@ subdirs = [ "1.0", "1.0/default", + "1.0/default/libhealthd", "1.0/vts/functional", ] diff --git a/keymaster/3.0/Android.bp b/keymaster/3.0/Android.bp index 184620073f..deb622ba4f 100644 --- a/keymaster/3.0/Android.bp +++ b/keymaster/3.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.keymaster@3.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.keymaster@3.0_genc++"], diff --git a/light/2.0/Android.bp b/light/2.0/Android.bp index cffdbe0a2d..08c249389a 100644 --- a/light/2.0/Android.bp +++ b/light/2.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.light@2.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.light@2.0_genc++"], diff --git a/media/1.0/Android.bp b/media/1.0/Android.bp index 61eeb3f9b4..754453a426 100644 --- a/media/1.0/Android.bp +++ b/media/1.0/Android.bp @@ -32,7 +32,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.media@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.media@1.0_genc++"], diff --git a/media/omx/1.0/Android.bp b/media/omx/1.0/Android.bp index 8e5527ecb0..67e05291a0 100644 --- a/media/omx/1.0/Android.bp +++ b/media/omx/1.0/Android.bp @@ -74,7 +74,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.media.omx@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.media.omx@1.0_genc++"], diff --git a/memtrack/1.0/Android.bp b/memtrack/1.0/Android.bp index 6f6e16d5e6..54995d8cb5 100644 --- a/memtrack/1.0/Android.bp +++ b/memtrack/1.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.memtrack@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.memtrack@1.0_genc++"], diff --git a/neuralnetworks/1.0/Android.bp b/neuralnetworks/1.0/Android.bp index 1356d33d1c..a0269b3d8b 100644 --- a/neuralnetworks/1.0/Android.bp +++ b/neuralnetworks/1.0/Android.bp @@ -46,7 +46,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.neuralnetworks@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.neuralnetworks@1.0_genc++"], diff --git a/oemlock/1.0/Android.bp b/oemlock/1.0/Android.bp index 21e7271bfd..8e219cf78e 100644 --- a/oemlock/1.0/Android.bp +++ b/oemlock/1.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.oemlock@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.oemlock@1.0_genc++"], diff --git a/power/1.0/Android.bp b/power/1.0/Android.bp index 1d967fd2fb..f393c91d07 100644 --- a/power/1.0/Android.bp +++ b/power/1.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.power@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.power@1.0_genc++"], diff --git a/power/1.1/Android.bp b/power/1.1/Android.bp index bfc140f6ca..fd5ec75d8b 100644 --- a/power/1.1/Android.bp +++ b/power/1.1/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.power@1.1", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.power@1.1_genc++"], diff --git a/sensors/1.0/Android.bp b/sensors/1.0/Android.bp index f6cf4a7a1a..ac1cb1879e 100644 --- a/sensors/1.0/Android.bp +++ b/sensors/1.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.sensors@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.sensors@1.0_genc++"], diff --git a/soundtrigger/2.0/Android.bp b/soundtrigger/2.0/Android.bp index 825977695c..d7e395f723 100644 --- a/soundtrigger/2.0/Android.bp +++ b/soundtrigger/2.0/Android.bp @@ -46,7 +46,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.soundtrigger@2.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.soundtrigger@2.0_genc++"], diff --git a/tests/extension/light/2.0/Android.bp b/tests/extension/light/2.0/Android.bp index 6469b45aae..c5987a77c3 100644 --- a/tests/extension/light/2.0/Android.bp +++ b/tests/extension/light/2.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tests.extension.light@2.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.extension.light@2.0_genc++"], diff --git a/thermal/1.0/Android.bp b/thermal/1.0/Android.bp index 6a9f9c793a..9c3240b1fc 100644 --- a/thermal/1.0/Android.bp +++ b/thermal/1.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.thermal@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.thermal@1.0_genc++"], diff --git a/tv/cec/1.0/Android.bp b/tv/cec/1.0/Android.bp index bf3ffe214f..810dc205e5 100644 --- a/tv/cec/1.0/Android.bp +++ b/tv/cec/1.0/Android.bp @@ -46,7 +46,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tv.cec@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tv.cec@1.0_genc++"], diff --git a/tv/input/1.0/Android.bp b/tv/input/1.0/Android.bp index a3f8c94010..b48ef58816 100644 --- a/tv/input/1.0/Android.bp +++ b/tv/input/1.0/Android.bp @@ -46,7 +46,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.tv.input@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tv.input@1.0_genc++"], diff --git a/usb/1.0/Android.bp b/usb/1.0/Android.bp index b03f75b77e..4157d9232d 100644 --- a/usb/1.0/Android.bp +++ b/usb/1.0/Android.bp @@ -46,7 +46,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.usb@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.usb@1.0_genc++"], diff --git a/usb/1.1/Android.bp b/usb/1.1/Android.bp index f067606d55..fa4ca117ac 100644 --- a/usb/1.1/Android.bp +++ b/usb/1.1/Android.bp @@ -46,7 +46,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.usb@1.1", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.usb@1.1_genc++"], diff --git a/vibrator/1.0/Android.bp b/vibrator/1.0/Android.bp index 0beff681cf..4f3263a31d 100644 --- a/vibrator/1.0/Android.bp +++ b/vibrator/1.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.vibrator@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.vibrator@1.0_genc++"], diff --git a/vibrator/1.1/Android.bp b/vibrator/1.1/Android.bp index ee81d83365..e8729defac 100644 --- a/vibrator/1.1/Android.bp +++ b/vibrator/1.1/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.vibrator@1.1", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.vibrator@1.1_genc++"], diff --git a/vr/1.0/Android.bp b/vr/1.0/Android.bp index d6949c5f34..2d64a71c77 100644 --- a/vr/1.0/Android.bp +++ b/vr/1.0/Android.bp @@ -35,7 +35,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.vr@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.vr@1.0_genc++"], diff --git a/weaver/1.0/Android.bp b/weaver/1.0/Android.bp index b64391cc71..c58468a31b 100644 --- a/weaver/1.0/Android.bp +++ b/weaver/1.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.weaver@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.weaver@1.0_genc++"], diff --git a/wifi/1.1/Android.bp b/wifi/1.1/Android.bp index f991fa5465..cb7acc8ebd 100644 --- a/wifi/1.1/Android.bp +++ b/wifi/1.1/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.wifi@1.1", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.wifi@1.1_genc++"], diff --git a/wifi/offload/1.0/Android.bp b/wifi/offload/1.0/Android.bp index 28e8e6acf7..c8a1305981 100644 --- a/wifi/offload/1.0/Android.bp +++ b/wifi/offload/1.0/Android.bp @@ -46,7 +46,7 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.wifi.offload@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.wifi.offload@1.0_genc++"], From c716b8c3070f560c11fcc0d7d9b8b19af6bbaf28 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Tue, 25 Jul 2017 18:24:40 -0700 Subject: [PATCH 103/265] Update makefiles for vndk enabled. Test: none Bug: 63866913 Change-Id: I29174fdadca2828455ef49f14e53bc95c5238dbb --- bluetooth/1.0/Android.bp | 3 +++ boot/1.0/Android.bp | 3 +++ configstore/1.0/Android.bp | 3 +++ ir/1.0/Android.bp | 3 +++ nfc/1.0/Android.bp | 3 +++ radio/1.0/Android.bp | 3 +++ radio/1.1/Android.bp | 3 +++ radio/deprecated/1.0/Android.bp | 3 +++ renderscript/1.0/Android.bp | 3 +++ tests/bar/1.0/Android.bp | 3 +++ tests/baz/1.0/Android.bp | 3 +++ tests/expression/1.0/Android.bp | 3 +++ tests/foo/1.0/Android.bp | 3 +++ tests/hash/1.0/Android.bp | 3 +++ tests/inheritance/1.0/Android.bp | 3 +++ tests/libhwbinder/1.0/Android.bp | 3 +++ tests/memory/1.0/Android.bp | 3 +++ tests/msgq/1.0/Android.bp | 3 +++ tests/multithread/1.0/Android.bp | 3 +++ tests/pointer/1.0/Android.bp | 3 +++ tetheroffload/config/1.0/Android.bp | 3 +++ tetheroffload/control/1.0/Android.bp | 3 +++ wifi/1.0/Android.bp | 3 +++ wifi/supplicant/1.0/Android.bp | 3 +++ 24 files changed, 72 insertions(+) diff --git a/bluetooth/1.0/Android.bp b/bluetooth/1.0/Android.bp index 48159b34ec..14c6a6eb07 100644 --- a/bluetooth/1.0/Android.bp +++ b/bluetooth/1.0/Android.bp @@ -53,6 +53,9 @@ cc_library_shared { generated_headers: ["android.hardware.bluetooth@1.0_genc++_headers"], export_generated_headers: ["android.hardware.bluetooth@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/boot/1.0/Android.bp b/boot/1.0/Android.bp index de42647ca7..761a68e558 100644 --- a/boot/1.0/Android.bp +++ b/boot/1.0/Android.bp @@ -46,6 +46,9 @@ cc_library_shared { generated_headers: ["android.hardware.boot@1.0_genc++_headers"], export_generated_headers: ["android.hardware.boot@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/configstore/1.0/Android.bp b/configstore/1.0/Android.bp index 89f99f2056..d304a87ee4 100644 --- a/configstore/1.0/Android.bp +++ b/configstore/1.0/Android.bp @@ -46,6 +46,9 @@ cc_library_shared { generated_headers: ["android.hardware.configstore@1.0_genc++_headers"], export_generated_headers: ["android.hardware.configstore@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/ir/1.0/Android.bp b/ir/1.0/Android.bp index a059da53dd..e9a334dadc 100644 --- a/ir/1.0/Android.bp +++ b/ir/1.0/Android.bp @@ -46,6 +46,9 @@ cc_library_shared { generated_headers: ["android.hardware.ir@1.0_genc++_headers"], export_generated_headers: ["android.hardware.ir@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/nfc/1.0/Android.bp b/nfc/1.0/Android.bp index 7c9a66edce..cb69114bb3 100644 --- a/nfc/1.0/Android.bp +++ b/nfc/1.0/Android.bp @@ -53,6 +53,9 @@ cc_library_shared { generated_headers: ["android.hardware.nfc@1.0_genc++_headers"], export_generated_headers: ["android.hardware.nfc@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/radio/1.0/Android.bp b/radio/1.0/Android.bp index 988f5d2c6e..6b0acd26a7 100644 --- a/radio/1.0/Android.bp +++ b/radio/1.0/Android.bp @@ -74,6 +74,9 @@ cc_library_shared { generated_headers: ["android.hardware.radio@1.0_genc++_headers"], export_generated_headers: ["android.hardware.radio@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/radio/1.1/Android.bp b/radio/1.1/Android.bp index 3a3f639c69..9e77cbe327 100644 --- a/radio/1.1/Android.bp +++ b/radio/1.1/Android.bp @@ -67,6 +67,9 @@ cc_library_shared { generated_headers: ["android.hardware.radio@1.1_genc++_headers"], export_generated_headers: ["android.hardware.radio@1.1_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/radio/deprecated/1.0/Android.bp b/radio/deprecated/1.0/Android.bp index e45ecc36c8..f57d6dff21 100644 --- a/radio/deprecated/1.0/Android.bp +++ b/radio/deprecated/1.0/Android.bp @@ -56,6 +56,9 @@ cc_library_shared { generated_headers: ["android.hardware.radio.deprecated@1.0_genc++_headers"], export_generated_headers: ["android.hardware.radio.deprecated@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/renderscript/1.0/Android.bp b/renderscript/1.0/Android.bp index d59931508a..a87d3abe47 100644 --- a/renderscript/1.0/Android.bp +++ b/renderscript/1.0/Android.bp @@ -53,6 +53,9 @@ cc_library_shared { generated_headers: ["android.hardware.renderscript@1.0_genc++_headers"], export_generated_headers: ["android.hardware.renderscript@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/bar/1.0/Android.bp b/tests/bar/1.0/Android.bp index 4c76014ab8..7ba8215c17 100644 --- a/tests/bar/1.0/Android.bp +++ b/tests/bar/1.0/Android.bp @@ -74,6 +74,9 @@ cc_library_shared { generated_headers: ["android.hardware.tests.bar@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.bar@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/baz/1.0/Android.bp b/tests/baz/1.0/Android.bp index 1445b11fb0..6be5079baa 100644 --- a/tests/baz/1.0/Android.bp +++ b/tests/baz/1.0/Android.bp @@ -67,6 +67,9 @@ cc_library_shared { generated_headers: ["android.hardware.tests.baz@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.baz@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/expression/1.0/Android.bp b/tests/expression/1.0/Android.bp index 0cfe47d037..5390726397 100644 --- a/tests/expression/1.0/Android.bp +++ b/tests/expression/1.0/Android.bp @@ -49,6 +49,9 @@ cc_library_shared { generated_headers: ["android.hardware.tests.expression@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.expression@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/foo/1.0/Android.bp b/tests/foo/1.0/Android.bp index b698847069..6bfe5abf40 100644 --- a/tests/foo/1.0/Android.bp +++ b/tests/foo/1.0/Android.bp @@ -74,6 +74,9 @@ cc_library_shared { generated_headers: ["android.hardware.tests.foo@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.foo@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/hash/1.0/Android.bp b/tests/hash/1.0/Android.bp index 617ddecf7d..3dae8bc5d6 100644 --- a/tests/hash/1.0/Android.bp +++ b/tests/hash/1.0/Android.bp @@ -42,6 +42,9 @@ cc_library_shared { generated_headers: ["android.hardware.tests.hash@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.hash@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/inheritance/1.0/Android.bp b/tests/inheritance/1.0/Android.bp index 4dbcf4b240..fcab903654 100644 --- a/tests/inheritance/1.0/Android.bp +++ b/tests/inheritance/1.0/Android.bp @@ -63,6 +63,9 @@ cc_library_shared { generated_headers: ["android.hardware.tests.inheritance@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.inheritance@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/libhwbinder/1.0/Android.bp b/tests/libhwbinder/1.0/Android.bp index f254bad30b..183e49d200 100644 --- a/tests/libhwbinder/1.0/Android.bp +++ b/tests/libhwbinder/1.0/Android.bp @@ -49,6 +49,9 @@ cc_library_shared { generated_headers: ["android.hardware.tests.libhwbinder@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.libhwbinder@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/memory/1.0/Android.bp b/tests/memory/1.0/Android.bp index 5a62896906..997062d7ad 100644 --- a/tests/memory/1.0/Android.bp +++ b/tests/memory/1.0/Android.bp @@ -42,6 +42,9 @@ cc_library_shared { generated_headers: ["android.hardware.tests.memory@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.memory@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/msgq/1.0/Android.bp b/tests/msgq/1.0/Android.bp index 19ff89cfc6..ecd91a8d34 100644 --- a/tests/msgq/1.0/Android.bp +++ b/tests/msgq/1.0/Android.bp @@ -49,6 +49,9 @@ cc_library_shared { generated_headers: ["android.hardware.tests.msgq@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.msgq@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/multithread/1.0/Android.bp b/tests/multithread/1.0/Android.bp index c3782a0d6d..a8e855ec48 100644 --- a/tests/multithread/1.0/Android.bp +++ b/tests/multithread/1.0/Android.bp @@ -42,6 +42,9 @@ cc_library_shared { generated_headers: ["android.hardware.tests.multithread@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.multithread@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/pointer/1.0/Android.bp b/tests/pointer/1.0/Android.bp index 37fea949eb..209f143762 100644 --- a/tests/pointer/1.0/Android.bp +++ b/tests/pointer/1.0/Android.bp @@ -49,6 +49,9 @@ cc_library_shared { generated_headers: ["android.hardware.tests.pointer@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.pointer@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tetheroffload/config/1.0/Android.bp b/tetheroffload/config/1.0/Android.bp index 7beefbf644..b4ddaa74be 100644 --- a/tetheroffload/config/1.0/Android.bp +++ b/tetheroffload/config/1.0/Android.bp @@ -42,6 +42,9 @@ cc_library_shared { generated_headers: ["android.hardware.tetheroffload.config@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tetheroffload.config@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tetheroffload/control/1.0/Android.bp b/tetheroffload/control/1.0/Android.bp index d351edb817..00d81f3988 100644 --- a/tetheroffload/control/1.0/Android.bp +++ b/tetheroffload/control/1.0/Android.bp @@ -53,6 +53,9 @@ cc_library_shared { generated_headers: ["android.hardware.tetheroffload.control@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tetheroffload.control@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/wifi/1.0/Android.bp b/wifi/1.0/Android.bp index c8b694c460..1164f7081f 100644 --- a/wifi/1.0/Android.bp +++ b/wifi/1.0/Android.bp @@ -130,6 +130,9 @@ cc_library_shared { generated_headers: ["android.hardware.wifi@1.0_genc++_headers"], export_generated_headers: ["android.hardware.wifi@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/wifi/supplicant/1.0/Android.bp b/wifi/supplicant/1.0/Android.bp index 9242fb67ae..b7eddb2db2 100644 --- a/wifi/supplicant/1.0/Android.bp +++ b/wifi/supplicant/1.0/Android.bp @@ -123,6 +123,9 @@ cc_library_shared { generated_headers: ["android.hardware.wifi.supplicant@1.0_genc++_headers"], export_generated_headers: ["android.hardware.wifi.supplicant@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", From dd58770c39fe328f186d991f02bc379ae2b02e37 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Mon, 31 Jul 2017 14:28:04 -0700 Subject: [PATCH 104/265] Implement missing broadcastradio 1.1 VTS tests. Bug: b/36864490 Test: VTS Change-Id: Iff25fdd65624db09e6667d32108e479d5eee6964 --- broadcastradio/1.1/default/Tuner.cpp | 25 ++++-- .../VtsHalBroadcastradioV1_1TargetTest.cpp | 80 +++++++++++++++++-- .../broadcastradio-vts-utils/mock-timeout.h | 8 ++ 3 files changed, 102 insertions(+), 11 deletions(-) diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index 1e6b9daae0..aacd523ab6 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -144,6 +144,7 @@ void Tuner::tuneInternalLocked(const ProgramSelector& sel) { mCallback->tuneComplete(Result::OK, mCurrentProgramInfo.base); } else { mCallback1_1->tuneComplete_1_1(Result::OK, mCurrentProgramInfo.selector); + mCallback1_1->currentProgramInfoChanged(); } } @@ -214,8 +215,10 @@ Return Tuner::step(Direction direction, bool skipSubChannel) { return Result::NOT_INITIALIZED; } - ALOGW_IF(!mIsAmfmConfigSet, "AM/FM config not set"); - if (!mIsAmfmConfigSet) return Result::INVALID_STATE; + if (!mIsAmfmConfigSet) { + ALOGW("AM/FM config not set"); + return Result::INVALID_STATE; + } mIsTuneCompleted = false; auto task = [this, direction]() { @@ -256,14 +259,26 @@ Return Tuner::tuneByProgramSelector(const ProgramSelector& sel) { lock_guard lk(mMut); if (mIsClosed) return Result::NOT_INITIALIZED; - if (utils::isAmFm(utils::getType(mCurrentProgram))) { - ALOGW_IF(!mIsAmfmConfigSet, "AM/FM config not set"); - if (!mIsAmfmConfigSet) return Result::INVALID_STATE; + // checking if ProgramSelector is valid + auto programType = utils::getType(sel); + if (utils::isAmFm(programType)) { + if (!mIsAmfmConfigSet) { + ALOGW("AM/FM config not set"); + return Result::INVALID_STATE; + } auto freq = utils::getId(sel, IdentifierType::AMFM_FREQUENCY); if (freq < mAmfmConfig.lowerLimit || freq > mAmfmConfig.upperLimit) { return Result::INVALID_ARGUMENTS; } + } else if (programType == ProgramType::DAB) { + if (!utils::hasId(sel, IdentifierType::DAB_SIDECC)) return Result::INVALID_ARGUMENTS; + } else if (programType == ProgramType::DRMO) { + if (!utils::hasId(sel, IdentifierType::DRMO_SERVICE_ID)) return Result::INVALID_ARGUMENTS; + } else if (programType == ProgramType::SXM) { + if (!utils::hasId(sel, IdentifierType::SXM_SERVICE_ID)) return Result::INVALID_ARGUMENTS; + } else { + return Result::INVALID_ARGUMENTS; } mIsTuneCompleted = false; diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index 41cea275b0..9143c41f0e 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -62,8 +62,17 @@ using std::this_thread::sleep_for; static constexpr auto kConfigTimeout = 10s; static constexpr auto kConnectModuleTimeout = 1s; static constexpr auto kTuneTimeout = 30s; +static constexpr auto kEventPropagationTimeout = 1s; static constexpr auto kFullScanTimeout = 1min; +static constexpr ProgramType kStandardProgramTypes[] = { + ProgramType::AM, ProgramType::FM, ProgramType::AM_HD, ProgramType::FM_HD, + ProgramType::DAB, ProgramType::DRMO, ProgramType::SXM}; + +static constexpr IdentifierType kVendorPrimartIds[] = { + IdentifierType::VENDOR1_PRIMARY, IdentifierType::VENDOR2_PRIMARY, + IdentifierType::VENDOR3_PRIMARY, IdentifierType::VENDOR4_PRIMARY}; + static void printSkipped(std::string msg) { std::cout << "[ SKIPPED ] " << msg << std::endl; } @@ -84,7 +93,7 @@ struct TunerCallbackMock : public ITunerCallback { MOCK_METHOD1(backgroundScanAvailable, Return(bool)); MOCK_TIMEOUT_METHOD1(backgroundScanComplete, Return(ProgramListResult)); MOCK_METHOD0(programListChanged, Return()); - MOCK_METHOD0(currentProgramInfoChanged, Return()); + MOCK_TIMEOUT_METHOD0(currentProgramInfoChanged, Return()); }; class BroadcastRadioHalTest : public ::testing::VtsHalHidlTargetTestBase, @@ -315,7 +324,8 @@ TEST_P(BroadcastRadioHalTest, OpenTunerTwice) { * - getProgramList either succeeds or returns NOT_STARTED/NOT_READY status; * - if the program list is NOT_STARTED, startBackgroundScan makes it completed * within a full scan timeout and the next getProgramList call succeeds; - * - if the program list is not empty, tuneByProgramSelector call succeeds. + * - if the program list is not empty, tuneByProgramSelector call succeeds; + * - getProgramInformation_1_1 returns the same selector as returned in tuneComplete_1_1 call. */ TEST_P(BroadcastRadioHalTest, TuneFromProgramList) { if (skipped) return; @@ -340,12 +350,70 @@ TEST_P(BroadcastRadioHalTest, TuneFromProgramList) { EXPECT_CALL(*mCallback, tuneComplete(_, _)).Times(0); EXPECT_TIMEOUT_CALL(*mCallback, tuneComplete_1_1, Result::OK, _) .WillOnce(DoAll(SaveArg<1>(&selCb), testing::Return(ByMove(Void())))); + EXPECT_TIMEOUT_CALL(*mCallback, currentProgramInfoChanged); auto tuneResult = mTuner->tuneByProgramSelector(firstProgram.selector); ASSERT_EQ(Result::OK, tuneResult); EXPECT_TIMEOUT_CALL_WAIT(*mCallback, tuneComplete_1_1, kTuneTimeout); + EXPECT_TIMEOUT_CALL_WAIT(*mCallback, currentProgramInfoChanged, kEventPropagationTimeout); EXPECT_EQ(firstProgram.selector.primaryId, selCb.primaryId); + + bool called = false; + auto getResult = mTuner->getProgramInformation_1_1([&](Result result, ProgramInfo info) { + called = true; + EXPECT_EQ(Result::OK, result); + EXPECT_EQ(selCb, info.selector); + }); + ASSERT_TRUE(getResult.isOk()); + ASSERT_TRUE(called); } +/** + * Test that primary vendor identifier isn't used for standard program types. + * + * Verifies that: + * - tuneByProgramSelector fails when VENDORn_PRIMARY is set as a primary + * identifier for program types other than VENDORn. + */ +TEST_P(BroadcastRadioHalTest, TuneFailsForPrimaryVendor) { + if (skipped) return; + ASSERT_TRUE(openTuner()); + + for (auto ptype : kStandardProgramTypes) { + ALOGD("Checking %s...", toString(ptype).c_str()); + for (auto idtype : kVendorPrimartIds) { + ALOGD("...with %s", toString(idtype).c_str()); + ProgramSelector sel = {}; + sel.programType = static_cast(ptype); + sel.primaryId.type = static_cast(idtype); + + auto tuneResult = mTuner->tuneByProgramSelector(sel); + ASSERT_NE(Result::OK, tuneResult); + } + } +} + +/** + * Test that tune with unknown program type fails. + * + * Verifies that: + * - tuneByProgramSelector fails with INVALID_ARGUMENT when unknown program type is passed. + */ +TEST_P(BroadcastRadioHalTest, TuneFailsForUnknownProgram) { + if (skipped) return; + ASSERT_TRUE(openTuner()); + + // Program type is 1-based, so 0 will be always invalid. + ProgramSelector sel = {}; + auto tuneResult = mTuner->tuneByProgramSelector(sel); + ASSERT_EQ(Result::INVALID_ARGUMENTS, tuneResult); +} + +/** + * Test cancelling announcement. + * + * Verifies that: + * - cancelAnnouncement succeeds either when there is an announcement or there is none. + */ TEST_P(BroadcastRadioHalTest, CancelAnnouncement) { if (skipped) return; ASSERT_TRUE(openTuner()); @@ -358,7 +426,7 @@ TEST_P(BroadcastRadioHalTest, CancelAnnouncement) { * Test getImage call with invalid image ID. * * Verifies that: - * - getImage call handles argument 0 gracefully + * - getImage call handles argument 0 gracefully. */ TEST_P(BroadcastRadioHalTest, GetNoImage) { if (skipped) return; @@ -375,8 +443,8 @@ TEST_P(BroadcastRadioHalTest, GetNoImage) { * Test proper image format in metadata. * * Verifies that: - * - all images in metadata are provided out-of-band (by id, not as a binary blob) - * - images are available for getImage call + * - all images in metadata are provided out-of-band (by id, not as a binary blob); + * - images are available for getImage call. */ TEST_P(BroadcastRadioHalTest, OobImagesOnly) { if (skipped) return; @@ -420,7 +488,7 @@ TEST_P(BroadcastRadioHalTest, OobImagesOnly) { * Test AnalogForced switch. * * Verifies that: - * - setAnalogForced results either with INVALID_STATE, or isAnalogForced replying the same + * - setAnalogForced results either with INVALID_STATE, or isAnalogForced replying the same. */ TEST_P(BroadcastRadioHalTest, AnalogForcedSwitch) { if (skipped) return; diff --git a/broadcastradio/1.1/vts/utils/include/broadcastradio-vts-utils/mock-timeout.h b/broadcastradio/1.1/vts/utils/include/broadcastradio-vts-utils/mock-timeout.h index fa1114f0a7..b0ce08806d 100644 --- a/broadcastradio/1.1/vts/utils/include/broadcastradio-vts-utils/mock-timeout.h +++ b/broadcastradio/1.1/vts/utils/include/broadcastradio-vts-utils/mock-timeout.h @@ -43,6 +43,14 @@ } \ return ret; +/** + * Gmock MOCK_METHOD0 timeout-capable extension. + */ +#define MOCK_TIMEOUT_METHOD0(Method, ...) \ + MOCK_METHOD0(egmock_##Method, __VA_ARGS__); \ + EGMOCK_TIMEOUT_METHOD_DEF_(Method); \ + virtual GMOCK_RESULT_(, __VA_ARGS__) Method() { EGMOCK_TIMEOUT_METHOD_BODY_(Method); } + /** * Gmock MOCK_METHOD1 timeout-capable extension. */ From f7c2fbc1a8739764700e89dd8bfa067bdc82fb8e Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Tue, 1 Aug 2017 13:12:35 -0700 Subject: [PATCH 105/265] Add cc_defaults VtsHalTargetTestDefaults Makes it easier to control how vts tests link to system libs. Also, removes a lot of redundant lines in test make rules. Bug: 64040096 Test: compiles Merged-In: I10796e3fa8f61a307dbb7edace537a96ec83bea7 Change-Id: I10796e3fa8f61a307dbb7edace537a96ec83bea7 (cherry picked from commit 0b19836cea7ee60ac370df2bf0500ee049d38256) --- Android.bp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Android.bp b/Android.bp index 79e860993e..6c9bdd348d 100644 --- a/Android.bp +++ b/Android.bp @@ -9,3 +9,26 @@ cc_defaults { "-Werror", ], } + +cc_defaults { + name: "VtsHalTargetTestDefaults", + defaults: ["hidl_defaults"], + static_libs: [ + "VtsHalHidlTargetTestBase", + ], + group_static_libs: true, + shared_libs: [ + "libbase", + "libcutils", + "liblog", + "libhidlbase", + "libhidltransport", + "libhwbinder", + "libutils", + ], + cflags: [ + "-O0", + "-g", + ], + +} From 35c7bd2e2b634e1b66a6f96ea61e2edbfb0f5899 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Tue, 1 Aug 2017 13:14:53 -0700 Subject: [PATCH 106/265] VTS tests now static link to HAL def libs. And use VtsHalTargetTestDefaults. Bug: 64040096 Test: compiles Merged-In: I3cfb1a64f6abcf3145337a736800b72d92a0b152 Change-Id: I3cfb1a64f6abcf3145337a736800b72d92a0b152 (cherry picked from commit 6c2bd86f70f526d69c3f262250e8e09afb773a21) --- bluetooth/1.0/vts/functional/Android.bp | 18 ++--------- ir/1.0/vts/functional/Android.bp | 15 ++-------- nfc/1.0/vts/functional/Android.bp | 16 ++-------- radio/1.0/vts/functional/Android.bp | 34 ++++----------------- radio/1.1/vts/functional/Android.bp | 18 ++--------- wifi/1.0/vts/functional/Android.bp | 40 +++++++------------------ 6 files changed, 24 insertions(+), 117 deletions(-) diff --git a/bluetooth/1.0/vts/functional/Android.bp b/bluetooth/1.0/vts/functional/Android.bp index cd2be441c2..2e60588c38 100644 --- a/bluetooth/1.0/vts/functional/Android.bp +++ b/bluetooth/1.0/vts/functional/Android.bp @@ -16,24 +16,10 @@ cc_test { name: "VtsHalBluetoothV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalBluetoothV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", - "android.hardware.bluetooth@1.0", - ], static_libs: [ - "VtsHalHidlTargetTestBase", + "android.hardware.bluetooth@1.0", "libbluetooth-types", ], - cflags: [ - "-O0", - "-g", - ], } diff --git a/ir/1.0/vts/functional/Android.bp b/ir/1.0/vts/functional/Android.bp index 4aac2979b1..2a86f8e5d8 100644 --- a/ir/1.0/vts/functional/Android.bp +++ b/ir/1.0/vts/functional/Android.bp @@ -16,20 +16,9 @@ cc_test { name: "VtsHalIrV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalIrV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libutils", + static_libs: [ "android.hardware.ir@1.0", ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], } diff --git a/nfc/1.0/vts/functional/Android.bp b/nfc/1.0/vts/functional/Android.bp index d9ba7021fc..3861bd4694 100644 --- a/nfc/1.0/vts/functional/Android.bp +++ b/nfc/1.0/vts/functional/Android.bp @@ -16,21 +16,9 @@ cc_test { name: "VtsHalNfcV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalNfcV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", + static_libs: [ "android.hardware.nfc@1.0", ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], } diff --git a/radio/1.0/vts/functional/Android.bp b/radio/1.0/vts/functional/Android.bp index eb11b54b03..82a8a7292a 100644 --- a/radio/1.0/vts/functional/Android.bp +++ b/radio/1.0/vts/functional/Android.bp @@ -16,7 +16,7 @@ cc_test { name: "VtsHalRadioV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["radio_hidl_hal_cell_broadcast.cpp", "radio_hidl_hal_data.cpp", "radio_hidl_hal_icc.cpp", @@ -30,46 +30,22 @@ cc_test { "radio_response.cpp", "VtsHalRadioV1_0TargetTest.cpp", "vts_test_util.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", + static_libs: [ "android.hardware.radio@1.0", ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], } cc_test { name: "VtsHalSapV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["sap_callback.cpp", "sap_hidl_hal_api.cpp", "sap_hidl_hal_test.cpp", "VtsHalSapV1_0TargetTest.cpp", "vts_test_util.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", + static_libs: [ "android.hardware.radio@1.0", ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], } cc_library_static { @@ -82,4 +58,4 @@ cc_library_static { cc_library_headers { name: "radio.util.header@1.0", export_include_dirs: ["."], -} \ No newline at end of file +} diff --git a/radio/1.1/vts/functional/Android.bp b/radio/1.1/vts/functional/Android.bp index 9000eb2e45..e7195ee7da 100644 --- a/radio/1.1/vts/functional/Android.bp +++ b/radio/1.1/vts/functional/Android.bp @@ -16,30 +16,18 @@ cc_test { name: "VtsHalRadioV1_1TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["radio_hidl_hal_api.cpp", "radio_hidl_hal_test.cpp", "radio_indication.cpp", "radio_response.cpp", "VtsHalRadioV1_1TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", + static_libs: [ + "RadioVtsTestUtilBase", "android.hardware.radio@1.1", "android.hardware.radio@1.0", ], - static_libs: ["VtsHalHidlTargetTestBase", - "RadioVtsTestUtilBase"], header_libs: [ "radio.util.header@1.0", ], - cflags: [ - "-O0", - "-g", - ], } diff --git a/wifi/1.0/vts/functional/Android.bp b/wifi/1.0/vts/functional/Android.bp index 2d6679f779..0cebbfcaee 100644 --- a/wifi/1.0/vts/functional/Android.bp +++ b/wifi/1.0/vts/functional/Android.bp @@ -38,50 +38,30 @@ cc_library_static { cc_test { name: "VtsHalWifiV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: [ "VtsHalWifiV1_0TargetTest.cpp", "wifi_ap_iface_hidl_test.cpp", "wifi_chip_hidl_test.cpp", "wifi_p2p_iface_hidl_test.cpp", "wifi_rtt_controller_hidl_test.cpp", - "wifi_sta_iface_hidl_test.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", - "android.hardware.wifi@1.0", + "wifi_sta_iface_hidl_test.cpp", ], - static_libs: ["VtsHalWifiV1_0TargetTestUtil", "VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", + static_libs: [ + "VtsHalWifiV1_0TargetTestUtil", + "android.hardware.wifi@1.0", ], } cc_test { name: "VtsHalWifiNanV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: [ "VtsHalWifiV1_0TargetTest.cpp", - "wifi_nan_iface_hidl_test.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", + "wifi_nan_iface_hidl_test.cpp", + ], + static_libs: [ + "VtsHalWifiV1_0TargetTestUtil", "android.hardware.wifi@1.0", ], - static_libs: ["VtsHalWifiV1_0TargetTestUtil", "VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], } From 703c242322f75fa23e7b349186cfb02103a2ac05 Mon Sep 17 00:00:00 2001 From: Shawn Willden Date: Thu, 3 Aug 2017 14:10:50 -0600 Subject: [PATCH 107/265] Reduce max keymaster message size to 2K Bug: 63745895 Test: VtsHalKeymasterV3_0TargetTest Change-Id: I9b8c2e551f04bd2124462095f232bd08ff1f63c6 --- keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp b/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp index b950765118..d064bd727c 100644 --- a/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp +++ b/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp @@ -1730,7 +1730,7 @@ TEST_F(SigningOperationsTest, EcdsaNoDigestHugeData) { .Authorization(TAG_NO_AUTH_REQUIRED) .EcdsaSigningKey(224) .Digest(Digest::NONE))); - string message(64 * 1024, 'a'); + string message(2 * 1024, 'a'); SignMessage(message, AuthorizationSetBuilder().Digest(Digest::NONE)); } @@ -2564,7 +2564,7 @@ TEST_F(EncryptionOperationsTest, RsaNoPaddingTooLong) { } /* - * EncryptionOperationsTest.RsaNoPaddingTooLong + * EncryptionOperationsTest.RsaNoPaddingTooLarge * * Verifies that raw RSA encryption of too-large (numerically) messages fails in the expected way. */ From 1ef659eeda83c758e4f4bd0cc0f8143821d3b49c Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Thu, 3 Aug 2017 16:39:02 -0700 Subject: [PATCH 108/265] Update comments for VtsHalTargetTestDefaults. Bug: 64040096 Test: only comments added Change-Id: I4a38aa0ed339c65aa4ffbe5c46489f27c745d5d6 --- Android.bp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Android.bp b/Android.bp index 6c9bdd348d..7ae00b66ac 100644 --- a/Android.bp +++ b/Android.bp @@ -10,15 +10,21 @@ cc_defaults { ], } +// VTS tests must link to HAL definition libraries statically. cc_defaults { name: "VtsHalTargetTestDefaults", defaults: ["hidl_defaults"], + + // Lists all dependencies that can *not* be expected on the device. static_libs: [ "VtsHalHidlTargetTestBase", ], group_static_libs: true, + + // Lists all system dependencies that can be expected on the device. shared_libs: [ "libbase", + // All the following are dependencies of any HAL definition library. "libcutils", "liblog", "libhidlbase", From 7f7a54ee3b9430b00bec5d4f0b55776e3bd183d1 Mon Sep 17 00:00:00 2001 From: Enrico Granata Date: Thu, 3 Aug 2017 16:52:32 -0700 Subject: [PATCH 109/265] Mark diagnostic values as either being numerically equivalent to OBD2 values, or providing the equivalent OBD2 value Test: build Bug: 64024685 Change-Id: I24ef13514a94e10c599605e6970a023168774049 --- automotive/vehicle/2.1/types.hal | 240 +++++++++++++++++-------------- 1 file changed, 131 insertions(+), 109 deletions(-) diff --git a/automotive/vehicle/2.1/types.hal b/automotive/vehicle/2.1/types.hal index 49ce9c8b06..2bdb7b327d 100644 --- a/automotive/vehicle/2.1/types.hal +++ b/automotive/vehicle/2.1/types.hal @@ -255,7 +255,10 @@ enum VehicleProperty: @2.0::VehicleProperty { | VehicleArea:GLOBAL), }; -/** The status of the vehicle's fuel system. */ +/** + * The status of the vehicle's fuel system. + * These values come from the SAE J1979 standard. + */ enum Obd2FuelSystemStatus : int32_t { OPEN_INSUFFICIENT_ENGINE_TEMPERATURE = 1, CLOSED_LOOP = 2, @@ -270,7 +273,10 @@ enum Obd2IgnitionMonitorKind : int32_t { COMPRESSION = 1, }; -/** These ignition monitors are common to both SPARK and COMPRESSION. */ +/** + * Ignition monitors common to both SPARK and COMPRESSION. + * These values come from the SAE J1979 standard. + */ enum Obd2CommonIgnitionMonitors : int32_t { COMPONENTS_AVAILABLE = 0x1 << 0, COMPONENTS_INCOMPLETE = 0x1 << 1, @@ -282,7 +288,10 @@ enum Obd2CommonIgnitionMonitors : int32_t { MISFIRE_INCOMPLETE = 0x1 << 5, }; -/** Ignition monitors available for SPARK vehicles. */ +/** + * Ignition monitors available for SPARK vehicles. + * These values come from the SAE J1979 standard. + */ enum Obd2SparkIgnitionMonitors : Obd2CommonIgnitionMonitors { EGR_AVAILABLE = 0x1 << 6, EGR_INCOMPLETE = 0x1 << 7, @@ -309,7 +318,10 @@ enum Obd2SparkIgnitionMonitors : Obd2CommonIgnitionMonitors { CATALYST_INCOMPLETE = 0x1 << 21, }; -/** Ignition monitors only available for COMPRESSION vehicles. */ +/** + * Ignition monitors only available for COMPRESSION vehicles. + * These values come from the SAE J1979 standard. + */ enum Obd2CompressionIgnitionMonitors : Obd2CommonIgnitionMonitors { EGR_OR_VVT_AVAILABLE = 0x1 << 6, EGR_OR_VVT_INCOMPLETE = 0x1 << 7, @@ -330,7 +342,10 @@ enum Obd2CompressionIgnitionMonitors : Obd2CommonIgnitionMonitors { NMHC_CATALYST_INCOMPLETE = 0x1 << 17, }; -/** The status of the vehicle's secondary air system. */ +/** + * The status of the vehicle's secondary air system. + * These values come from the SAE J1979 standard. + */ enum Obd2SecondaryAirStatus : int32_t { UPSTREAM = 1, DOWNSTREAM_OF_CATALYCIC_CONVERTER = 2, @@ -338,7 +353,10 @@ enum Obd2SecondaryAirStatus : int32_t { PUMP_ON_FOR_DIAGNOSTICS = 8, }; -/** The fuel type(s) supported by a vehicle. */ +/** + * The fuel type(s) supported by a vehicle. + * These values come from the SAE J1979 standard. + */ enum Obd2FuelType : int32_t { NOT_AVAILABLE = 0, GASOLINE = 1, @@ -372,14 +390,16 @@ enum Obd2FuelType : int32_t { * Some of the properties are represented as an integer mapping to another enum. In those cases * expect a comment by the property definition describing the enum to look at for the mapping. * Any value greater than the last reserved index is available to vendors to map their extensions. + * While these values do not directly map to SAE J1979 PIDs, an equivalence is listed next + * to each one to aid implementors. */ enum DiagnosticIntegerSensorIndex : int32_t { /** refer to FuelSystemStatus for a description of this value. */ - FUEL_SYSTEM_STATUS = 0, - MALFUNCTION_INDICATOR_LIGHT_ON = 1, + FUEL_SYSTEM_STATUS = 0, /* PID 0x03 */ + MALFUNCTION_INDICATOR_LIGHT_ON = 1, /* PID 0x01 */ /** refer to IgnitionMonitorKind for a description of this value. */ - IGNITION_MONITORS_SUPPORTED = 2, + IGNITION_MONITORS_SUPPORTED = 2, /* PID 0x01 */ /** * The value of this sensor is a bitmask that specifies whether ignition-specific @@ -387,39 +407,39 @@ enum DiagnosticIntegerSensorIndex : int32_t { * bits in this value are given by, respectively, SparkIgnitionMonitors and * CompressionIgnitionMonitors depending on the value of IGNITION_MONITORS_SUPPORTED. */ - IGNITION_SPECIFIC_MONITORS = 3, - INTAKE_AIR_TEMPERATURE = 4, + IGNITION_SPECIFIC_MONITORS = 3, /* PID 0x01 */ + INTAKE_AIR_TEMPERATURE = 4, /* PID 0x0F */ /** refer to SecondaryAirStatus for a description of this value. */ - COMMANDED_SECONDARY_AIR_STATUS = 5, - NUM_OXYGEN_SENSORS_PRESENT = 6, - RUNTIME_SINCE_ENGINE_START = 7, - DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON = 8, - WARMUPS_SINCE_CODES_CLEARED = 9, - DISTANCE_TRAVELED_SINCE_CODES_CLEARED = 10, - ABSOLUTE_BAROMETRIC_PRESSURE = 11, - CONTROL_MODULE_VOLTAGE = 12, - AMBIENT_AIR_TEMPERATURE = 13, - TIME_WITH_MALFUNCTION_LIGHT_ON = 14, - TIME_SINCE_TROUBLE_CODES_CLEARED = 15, - MAX_FUEL_AIR_EQUIVALENCE_RATIO = 16, - MAX_OXYGEN_SENSOR_VOLTAGE = 17, - MAX_OXYGEN_SENSOR_CURRENT = 18, - MAX_INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 19, - MAX_AIR_FLOW_RATE_FROM_MASS_AIR_FLOW_SENSOR = 20, + COMMANDED_SECONDARY_AIR_STATUS = 5, /* PID 0x12 */ + NUM_OXYGEN_SENSORS_PRESENT = 6, /* PID 0x13 */ + RUNTIME_SINCE_ENGINE_START = 7, /* PID 0x1F */ + DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON = 8, /* PID 0x21 */ + WARMUPS_SINCE_CODES_CLEARED = 9, /* PID 0x30 */ + DISTANCE_TRAVELED_SINCE_CODES_CLEARED = 10, /* PID 0x31 */ + ABSOLUTE_BAROMETRIC_PRESSURE = 11, /* PID 0x33 */ + CONTROL_MODULE_VOLTAGE = 12, /* PID 0x42 */ + AMBIENT_AIR_TEMPERATURE = 13, /* PID 0x46 */ + TIME_WITH_MALFUNCTION_LIGHT_ON = 14, /* PID 0x4D */ + TIME_SINCE_TROUBLE_CODES_CLEARED = 15, /* PID 0x4E */ + MAX_FUEL_AIR_EQUIVALENCE_RATIO = 16, /* PID 0x4F */ + MAX_OXYGEN_SENSOR_VOLTAGE = 17, /* PID 0x4F */ + MAX_OXYGEN_SENSOR_CURRENT = 18, /* PID 0x4F */ + MAX_INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 19, /* PID 0x4F */ + MAX_AIR_FLOW_RATE_FROM_MASS_AIR_FLOW_SENSOR = 20, /* PID 0x50 */ /** refer to FuelType for a description of this value. */ - FUEL_TYPE = 21, - FUEL_RAIL_ABSOLUTE_PRESSURE = 22, - ENGINE_OIL_TEMPERATURE = 23, - DRIVER_DEMAND_PERCENT_TORQUE = 24, - ENGINE_ACTUAL_PERCENT_TORQUE = 25, - ENGINE_REFERENCE_PERCENT_TORQUE = 26, - ENGINE_PERCENT_TORQUE_DATA_IDLE = 27, - ENGINE_PERCENT_TORQUE_DATA_POINT1 = 28, - ENGINE_PERCENT_TORQUE_DATA_POINT2 = 29, - ENGINE_PERCENT_TORQUE_DATA_POINT3 = 30, - ENGINE_PERCENT_TORQUE_DATA_POINT4 = 31, + FUEL_TYPE = 21, /* PID 0x51 */ + FUEL_RAIL_ABSOLUTE_PRESSURE = 22, /* PID 0x59 */ + ENGINE_OIL_TEMPERATURE = 23, /* PID 0x5C */ + DRIVER_DEMAND_PERCENT_TORQUE = 24, /* PID 0x61 */ + ENGINE_ACTUAL_PERCENT_TORQUE = 25, /* PID 0x62 */ + ENGINE_REFERENCE_PERCENT_TORQUE = 26, /* PID 0x63 */ + ENGINE_PERCENT_TORQUE_DATA_IDLE = 27, /* PID 0x64 */ + ENGINE_PERCENT_TORQUE_DATA_POINT1 = 28, /* PID 0x64 */ + ENGINE_PERCENT_TORQUE_DATA_POINT2 = 29, /* PID 0x64 */ + ENGINE_PERCENT_TORQUE_DATA_POINT3 = 30, /* PID 0x64 */ + ENGINE_PERCENT_TORQUE_DATA_POINT4 = 31, /* PID 0x64 */ LAST_SYSTEM_INDEX = ENGINE_PERCENT_TORQUE_DATA_POINT4, }; @@ -427,79 +447,81 @@ enum DiagnosticIntegerSensorIndex : int32_t { * This enum provides the canonical mapping for sensor properties that have a floating-point value. * The ordering of the values is taken from the OBD2 specification. * Any value greater than the last reserved index is available to vendors to map their extensions. + * While these values do not directly map to SAE J1979 PIDs, an equivalence is listed next + * to each one to aid implementors. */ enum DiagnosticFloatSensorIndex : int32_t { - CALCULATED_ENGINE_LOAD = 0, - ENGINE_COOLANT_TEMPERATURE = 1, - SHORT_TERM_FUEL_TRIM_BANK1 = 2, - LONG_TERM_FUEL_TRIM_BANK1 = 3, - SHORT_TERM_FUEL_TRIM_BANK2 = 4, - LONG_TERM_FUEL_TRIM_BANK2 = 5, - FUEL_PRESSURE = 6, - INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 7, - ENGINE_RPM = 8, - VEHICLE_SPEED = 9, - TIMING_ADVANCE = 10, - MAF_AIR_FLOW_RATE = 11, - THROTTLE_POSITION = 12, - OXYGEN_SENSOR1_VOLTAGE = 13, - OXYGEN_SENSOR1_SHORT_TERM_FUEL_TRIM = 14, - OXYGEN_SENSOR1_FUEL_AIR_EQUIVALENCE_RATIO = 15, - OXYGEN_SENSOR2_VOLTAGE = 16, - OXYGEN_SENSOR2_SHORT_TERM_FUEL_TRIM = 17, - OXYGEN_SENSOR2_FUEL_AIR_EQUIVALENCE_RATIO = 18, - OXYGEN_SENSOR3_VOLTAGE = 19, - OXYGEN_SENSOR3_SHORT_TERM_FUEL_TRIM = 20, - OXYGEN_SENSOR3_FUEL_AIR_EQUIVALENCE_RATIO = 21, - OXYGEN_SENSOR4_VOLTAGE = 22, - OXYGEN_SENSOR4_SHORT_TERM_FUEL_TRIM = 23, - OXYGEN_SENSOR4_FUEL_AIR_EQUIVALENCE_RATIO = 24, - OXYGEN_SENSOR5_VOLTAGE = 25, - OXYGEN_SENSOR5_SHORT_TERM_FUEL_TRIM = 26, - OXYGEN_SENSOR5_FUEL_AIR_EQUIVALENCE_RATIO = 27, - OXYGEN_SENSOR6_VOLTAGE = 28, - OXYGEN_SENSOR6_SHORT_TERM_FUEL_TRIM = 29, - OXYGEN_SENSOR6_FUEL_AIR_EQUIVALENCE_RATIO = 30, - OXYGEN_SENSOR7_VOLTAGE = 31, - OXYGEN_SENSOR7_SHORT_TERM_FUEL_TRIM = 32, - OXYGEN_SENSOR7_FUEL_AIR_EQUIVALENCE_RATIO = 33, - OXYGEN_SENSOR8_VOLTAGE = 34, - OXYGEN_SENSOR8_SHORT_TERM_FUEL_TRIM = 35, - OXYGEN_SENSOR8_FUEL_AIR_EQUIVALENCE_RATIO = 36, - FUEL_RAIL_PRESSURE = 37, - FUEL_RAIL_GAUGE_PRESSURE = 38, - COMMANDED_EXHAUST_GAS_RECIRCULATION = 39, - EXHAUST_GAS_RECIRCULATION_ERROR = 40, - COMMANDED_EVAPORATIVE_PURGE = 41, - FUEL_TANK_LEVEL_INPUT = 42, - EVAPORATION_SYSTEM_VAPOR_PRESSURE = 43, - CATALYST_TEMPERATURE_BANK1_SENSOR1 = 44, - CATALYST_TEMPERATURE_BANK2_SENSOR1 = 45, - CATALYST_TEMPERATURE_BANK1_SENSOR2 = 46, - CATALYST_TEMPERATURE_BANK2_SENSOR2 = 47, - ABSOLUTE_LOAD_VALUE = 48, - FUEL_AIR_COMMANDED_EQUIVALENCE_RATIO = 49, - RELATIVE_THROTTLE_POSITION = 50, - ABSOLUTE_THROTTLE_POSITION_B = 51, - ABSOLUTE_THROTTLE_POSITION_C = 52, - ACCELERATOR_PEDAL_POSITION_D = 53, - ACCELERATOR_PEDAL_POSITION_E = 54, - ACCELERATOR_PEDAL_POSITION_F = 55, - COMMANDED_THROTTLE_ACTUATOR = 56, - ETHANOL_FUEL_PERCENTAGE = 57, - ABSOLUTE_EVAPORATION_SYSTEM_VAPOR_PRESSURE = 58, - SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK1 = 59, - SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK2 = 60, - SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK3 = 61, - SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK4 = 62, - LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK1 = 63, - LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK2 = 64, - LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK3 = 65, - LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK4 = 66, - RELATIVE_ACCELERATOR_PEDAL_POSITION = 67, - HYBRID_BATTERY_PACK_REMAINING_LIFE = 68, - FUEL_INJECTION_TIMING = 69, - ENGINE_FUEL_RATE = 70, + CALCULATED_ENGINE_LOAD = 0, /* PID 0x04 */ + ENGINE_COOLANT_TEMPERATURE = 1, /* PID 0x05 */ + SHORT_TERM_FUEL_TRIM_BANK1 = 2, /* PID 0x06 */ + LONG_TERM_FUEL_TRIM_BANK1 = 3, /* PID 0x07 */ + SHORT_TERM_FUEL_TRIM_BANK2 = 4, /* PID 0x08 */ + LONG_TERM_FUEL_TRIM_BANK2 = 5, /* PID 0x09 */ + FUEL_PRESSURE = 6, /* PID 0x0A */ + INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 7, /* PID 0x0B */ + ENGINE_RPM = 8, /* PID 0x0C */ + VEHICLE_SPEED = 9, /* PID 0x0D */ + TIMING_ADVANCE = 10, /* PID 0x0E */ + MAF_AIR_FLOW_RATE = 11, /* PID 0x10 */ + THROTTLE_POSITION = 12, /* PID 0x11 */ + OXYGEN_SENSOR1_VOLTAGE = 13, /* PID 0x14 */ + OXYGEN_SENSOR1_SHORT_TERM_FUEL_TRIM = 14, /* PID 0x14 */ + OXYGEN_SENSOR1_FUEL_AIR_EQUIVALENCE_RATIO = 15, /* PID 0x24 */ + OXYGEN_SENSOR2_VOLTAGE = 16, /* PID 0x15 */ + OXYGEN_SENSOR2_SHORT_TERM_FUEL_TRIM = 17, /* PID 0x15 */ + OXYGEN_SENSOR2_FUEL_AIR_EQUIVALENCE_RATIO = 18, /* PID 0x25 */ + OXYGEN_SENSOR3_VOLTAGE = 19, /* PID 0x16 */ + OXYGEN_SENSOR3_SHORT_TERM_FUEL_TRIM = 20, /* PID 0x16 */ + OXYGEN_SENSOR3_FUEL_AIR_EQUIVALENCE_RATIO = 21, /* PID 0x26 */ + OXYGEN_SENSOR4_VOLTAGE = 22, /* PID 0x17 */ + OXYGEN_SENSOR4_SHORT_TERM_FUEL_TRIM = 23, /* PID 0x17 */ + OXYGEN_SENSOR4_FUEL_AIR_EQUIVALENCE_RATIO = 24, /* PID 0x27 */ + OXYGEN_SENSOR5_VOLTAGE = 25, /* PID 0x18 */ + OXYGEN_SENSOR5_SHORT_TERM_FUEL_TRIM = 26, /* PID 0x18 */ + OXYGEN_SENSOR5_FUEL_AIR_EQUIVALENCE_RATIO = 27, /* PID 0x28 */ + OXYGEN_SENSOR6_VOLTAGE = 28, /* PID 0x19 */ + OXYGEN_SENSOR6_SHORT_TERM_FUEL_TRIM = 29, /* PID 0x19 */ + OXYGEN_SENSOR6_FUEL_AIR_EQUIVALENCE_RATIO = 30, /* PID 0x29 */ + OXYGEN_SENSOR7_VOLTAGE = 31, /* PID 0x1A */ + OXYGEN_SENSOR7_SHORT_TERM_FUEL_TRIM = 32, /* PID 0x1A */ + OXYGEN_SENSOR7_FUEL_AIR_EQUIVALENCE_RATIO = 33, /* PID 0x2A */ + OXYGEN_SENSOR8_VOLTAGE = 34, /* PID 0x1B */ + OXYGEN_SENSOR8_SHORT_TERM_FUEL_TRIM = 35, /* PID 0x1B */ + OXYGEN_SENSOR8_FUEL_AIR_EQUIVALENCE_RATIO = 36, /* PID 0x2B */ + FUEL_RAIL_PRESSURE = 37, /* PID 0x22 */ + FUEL_RAIL_GAUGE_PRESSURE = 38, /* PID 0x23 */ + COMMANDED_EXHAUST_GAS_RECIRCULATION = 39, /* PID 0x2C */ + EXHAUST_GAS_RECIRCULATION_ERROR = 40, /* PID 0x2D */ + COMMANDED_EVAPORATIVE_PURGE = 41, /* PID 0x2E */ + FUEL_TANK_LEVEL_INPUT = 42, /* PID 0x2F */ + EVAPORATION_SYSTEM_VAPOR_PRESSURE = 43, /* PID 0x32 */ + CATALYST_TEMPERATURE_BANK1_SENSOR1 = 44, /* PID 0x3C */ + CATALYST_TEMPERATURE_BANK2_SENSOR1 = 45, /* PID 0x3D */ + CATALYST_TEMPERATURE_BANK1_SENSOR2 = 46, /* PID 0x3E */ + CATALYST_TEMPERATURE_BANK2_SENSOR2 = 47, /* PID 0x3F */ + ABSOLUTE_LOAD_VALUE = 48, /* PID 0x43 */ + FUEL_AIR_COMMANDED_EQUIVALENCE_RATIO = 49, /* PID 0x44 */ + RELATIVE_THROTTLE_POSITION = 50, /* PID 0x45 */ + ABSOLUTE_THROTTLE_POSITION_B = 51, /* PID 0x47 */ + ABSOLUTE_THROTTLE_POSITION_C = 52, /* PID 0x48 */ + ACCELERATOR_PEDAL_POSITION_D = 53, /* PID 0x49 */ + ACCELERATOR_PEDAL_POSITION_E = 54, /* PID 0x4A */ + ACCELERATOR_PEDAL_POSITION_F = 55, /* PID 0x4B */ + COMMANDED_THROTTLE_ACTUATOR = 56, /* PID 0x4C */ + ETHANOL_FUEL_PERCENTAGE = 57,/* PID 0x52 */ + ABSOLUTE_EVAPORATION_SYSTEM_VAPOR_PRESSURE = 58, /* PID 0x53 */ + SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK1 = 59, /* PID 0x55 */ + SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK2 = 60, /* PID 0x57 */ + SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK3 = 61,/* PID 0x55 */ + SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK4 = 62, /* PID 0x57 */ + LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK1 = 63, /* PID 0x56 */ + LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK2 = 64, /* PID 0x58 */ + LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK3 = 65, /* PID 0x56 */ + LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK4 = 66, /* PID 0x58 */ + RELATIVE_ACCELERATOR_PEDAL_POSITION = 67, /* PID 0x5A */ + HYBRID_BATTERY_PACK_REMAINING_LIFE = 68, /* PID 0x5B */ + FUEL_INJECTION_TIMING = 69, /* PID 0x5D */ + ENGINE_FUEL_RATE = 70, /* PID 0x5E */ LAST_SYSTEM_INDEX = ENGINE_FUEL_RATE, }; From 8da14867cf27df01a753a9c5fabe00095a7f40ed Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Thu, 3 Aug 2017 17:28:21 -0700 Subject: [PATCH 110/265] Remove unused variables. Test: compiles Change-Id: Idf7631f98ad4e04f4a43e66161ba27e93d180241 --- drm/1.0/vts/functional/drm_hal_clearkey_test.cpp | 5 ----- drm/1.0/vts/functional/drm_hal_vendor_test.cpp | 2 -- 2 files changed, 7 deletions(-) diff --git a/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp b/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp index eeee3c0ec1..556451374e 100644 --- a/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp +++ b/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp @@ -1064,8 +1064,6 @@ void DrmHalClearkeyDecryptTest::aes_cbc_decrypt(uint8_t* dest, uint8_t* src, AES_set_encrypt_key(&key[0], 128, &decryptionKey); size_t offset = 0; - size_t num = 0; - size_t ecount_buf = 0; for (size_t i = 0; i < subSamples.size(); i++) { memcpy(dest + offset, src + offset, subSamples[i].numBytesOfClearData); offset += subSamples[i].numBytesOfClearData; @@ -1106,7 +1104,6 @@ TEST_F(DrmHalClearkeyDecryptTest, ClearSegmentTest) { Status status = cryptoPlugin->setMediaDrmSession(sessionId); EXPECT_EQ(Status::OK, status); - const bool kNotSecure = false; uint32_t byteCount = decrypt(Mode::UNENCRYPTED, &iv[0], subSamples, noPattern, Status::OK); EXPECT_EQ(kByteCount, byteCount); @@ -1133,7 +1130,6 @@ TEST_F(DrmHalClearkeyDecryptTest, EncryptedAesCtrSegmentTest) { Status status = cryptoPlugin->setMediaDrmSession(sessionId); EXPECT_EQ(Status::OK, status); - const bool kNotSecure = false; uint32_t byteCount = decrypt(Mode::AES_CTR, &iv[0], subSamples, noPattern, Status::OK); EXPECT_EQ(kClearBytes + kEncryptedBytes, byteCount); @@ -1154,7 +1150,6 @@ TEST_F(DrmHalClearkeyDecryptTest, EncryptedAesCtrSegmentTestNoKeys) { Status status = cryptoPlugin->setMediaDrmSession(sessionId); EXPECT_EQ(Status::OK, status); - const bool kNotSecure = false; uint32_t byteCount = decrypt(Mode::AES_CTR, &iv[0], subSamples, noPattern, Status::ERROR_DRM_NO_LICENSE); EXPECT_EQ(0u, byteCount); diff --git a/drm/1.0/vts/functional/drm_hal_vendor_test.cpp b/drm/1.0/vts/functional/drm_hal_vendor_test.cpp index 6ce465f34c..61f30141cd 100644 --- a/drm/1.0/vts/functional/drm_hal_vendor_test.cpp +++ b/drm/1.0/vts/functional/drm_hal_vendor_test.cpp @@ -1406,8 +1406,6 @@ void DrmHalVendorDecryptTest::aes_cbc_decrypt(uint8_t* dest, uint8_t* src, AES_set_encrypt_key(&key[0], 128, &decryptionKey); size_t offset = 0; - size_t num = 0; - size_t ecount_buf = 0; for (size_t i = 0; i < subSamples.size(); i++) { const SubSample& subSample = subSamples[i]; From fa3a559d86644a0a374450bb1dcfbb24f40fce37 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Thu, 3 Aug 2017 11:06:09 -0700 Subject: [PATCH 111/265] Pass vendor-specific info as map. This solves a problem of identifying, if a given application is talking to a hardware that can handle format of these strings. Bug: b/64229617 Test: VTS, instrumentation Change-Id: If1a5f9900800b8537ef158beefcbaf3c1008c3da --- broadcastradio/1.1/ITuner.hal | 8 ++-- broadcastradio/1.1/default/BroadcastRadio.cpp | 8 ++-- broadcastradio/1.1/default/Tuner.cpp | 5 ++- broadcastradio/1.1/default/Tuner.h | 2 +- broadcastradio/1.1/default/VirtualProgram.cpp | 5 +++ broadcastradio/1.1/types.hal | 42 ++++++++++++------- .../VtsHalBroadcastradioV1_1TargetTest.cpp | 4 +- 7 files changed, 45 insertions(+), 29 deletions(-) diff --git a/broadcastradio/1.1/ITuner.hal b/broadcastradio/1.1/ITuner.hal index 034f9c6d6c..b20c5f4fba 100644 --- a/broadcastradio/1.1/ITuner.hal +++ b/broadcastradio/1.1/ITuner.hal @@ -106,10 +106,8 @@ interface ITuner extends @1.0::ITuner { * This call does not trigger actual scan, but operates on the list cached * internally at the driver level. * - * @param filter vendor-specific filter for the stations to be retrieved. - * An empty string MUST result in full list. - * Client application MUST verify vendor/product name - * before setting this parameter to anything else. + * @param vendorFilter vendor-specific filter for the stations to be retrieved. + * An empty vector MUST result in full list for a given tuner. * @return result OK if the list was successfully retrieved. * INVALID_ARGUMENTS if invalid arguments are passed * NOT_READY if the scan is in progress. @@ -118,7 +116,7 @@ interface ITuner extends @1.0::ITuner { * NOT_INITIALIZED if any other error occurs. * @return programList List of stations available for user. */ - getProgramList(string filter) + getProgramList(vec vendorFilter) generates (ProgramListResult result, vec programList); /** diff --git a/broadcastradio/1.1/default/BroadcastRadio.cpp b/broadcastradio/1.1/default/BroadcastRadio.cpp index 17ec7803ae..ce7a10f5c9 100644 --- a/broadcastradio/1.1/default/BroadcastRadio.cpp +++ b/broadcastradio/1.1/default/BroadcastRadio.cpp @@ -91,17 +91,19 @@ Return BroadcastRadio::getProperties_1_1(getProperties_1_1_cb _hidl_cb) { prop10.numAudioSources = 1; prop10.supportsCapture = false; prop11.supportsBackgroundScanning = false; - prop11.supportedProgramTypes = vector({ + prop11.supportedProgramTypes = hidl_vec({ static_cast(ProgramType::AM), static_cast(ProgramType::FM), static_cast(ProgramType::AM_HD), static_cast(ProgramType::FM_HD), }); - prop11.supportedIdentifierTypes = vector({ + prop11.supportedIdentifierTypes = hidl_vec({ static_cast(IdentifierType::AMFM_FREQUENCY), static_cast(IdentifierType::RDS_PI), static_cast(IdentifierType::HD_STATION_ID_EXT), static_cast(IdentifierType::HD_SUBCHANNEL), }); - prop11.vendorInfo = "dummy"; + prop11.vendorInfo = hidl_vec({ + {"com.google.dummy", "dummy"}, + }); prop10.bands.resize(mConfig.amFmBands.size()); for (size_t i = 0; i < mConfig.amFmBands.size(); i++) { diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index aacd523ab6..6048518d98 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -337,8 +337,9 @@ Return Tuner::startBackgroundScan() { return ProgramListResult::UNAVAILABLE; } -Return Tuner::getProgramList(const hidl_string& filter, getProgramList_cb _hidl_cb) { - ALOGV("%s(%s)", __func__, filter.c_str()); +Return Tuner::getProgramList(const hidl_vec& vendorFilter, + getProgramList_cb _hidl_cb) { + ALOGV("%s(%s)", __func__, toString(vendorFilter).substr(0, 100).c_str()); lock_guard lk(mMut); if (mIsClosed) { _hidl_cb(ProgramListResult::NOT_INITIALIZED, {}); diff --git a/broadcastradio/1.1/default/Tuner.h b/broadcastradio/1.1/default/Tuner.h index f375a84a37..07d31898a7 100644 --- a/broadcastradio/1.1/default/Tuner.h +++ b/broadcastradio/1.1/default/Tuner.h @@ -45,7 +45,7 @@ struct Tuner : public ITuner { virtual Return getProgramInformation(getProgramInformation_cb _hidl_cb) override; virtual Return getProgramInformation_1_1(getProgramInformation_1_1_cb _hidl_cb) override; virtual Return startBackgroundScan() override; - virtual Return getProgramList(const hidl_string& filter, + virtual Return getProgramList(const hidl_vec& filter, getProgramList_cb _hidl_cb) override; virtual Return setAnalogForced(bool isForced) override; virtual Return isAnalogForced(isAnalogForced_cb _hidl_cb) override; diff --git a/broadcastradio/1.1/default/VirtualProgram.cpp b/broadcastradio/1.1/default/VirtualProgram.cpp index 1c2285d35a..7977391cdd 100644 --- a/broadcastradio/1.1/default/VirtualProgram.cpp +++ b/broadcastradio/1.1/default/VirtualProgram.cpp @@ -61,6 +61,11 @@ ProgramInfo VirtualProgram::getProgramInfo(HalRevision halRev) const { createDemoBitmap(MetadataKey::ART, halRev), }); + info11.vendorInfo = hidl_vec({ + {"com.google.dummy", "dummy"}, + {"com.google.dummy.VirtualProgram", std::to_string(reinterpret_cast(this))}, + }); + return info11; } diff --git a/broadcastradio/1.1/types.hal b/broadcastradio/1.1/types.hal index 4034d8b963..3e616c808b 100644 --- a/broadcastradio/1.1/types.hal +++ b/broadcastradio/1.1/types.hal @@ -56,6 +56,24 @@ enum ProgramInfoFlags : uint32_t { TRAFFIC_ANNOUNCEMENT = 1 << 3, }; +/** + * A key-value pair for vendor-specific information to be passed as-is through + * Android framework to the front-end application. + */ +struct VendorKeyValue { + /** + * Key must be prefixed with unique vendor Java-style namespace, + * eg. 'com.somecompany.parameter1'. + */ + string key; + + /** + * Value must be passed through the framework without any changes. + * Format of this string can vary across vendors. + */ + string value; +}; + struct Properties { @1.0::Properties base; @@ -89,16 +107,12 @@ struct Properties { vec supportedIdentifierTypes; /** - * Opaque vendor-specific string, to be passed to front-end without changes. - * Format of this string can vary across vendors. + * Vendor-specific information. * - * It may be used for extra features, that's not supported by a platform, - * for example: "preset-slots=6;ultra-hd-capable=false". - * - * Front-end application MUST verify vendor/product name from the - * @1.0::Properties struct before doing any interpretation of this value. + * It may be used for extra features, not supported by the platform, + * for example: com.me.preset-slots=6; com.me.ultra-hd-capable=false. */ - string vendorInfo; + vec vendorInfo; }; /** @@ -276,14 +290,10 @@ struct ProgramInfo { bitfield flags; /** - * Opaque vendor-specific string, to be passed to front-end without changes. - * Format of this string can vary across vendors. + * Vendor-specific information. * - * It may be used for extra features, that's not supported by a platform, - * for example: "paid-service=true;bitrate=320kbps". - * - * Front-end application MUST verify vendor/product name from the - * @1.0::Properties struct before doing any interpretation of this value. + * It may be used for extra features, not supported by the platform, + * for example: paid-service=true; bitrate=320kbps. */ - string vendorInfo; + vec vendorInfo; }; diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index 9143c41f0e..6feb710fa2 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -274,7 +274,7 @@ bool BroadcastRadioHalTest::getProgramList( // first try... EXPECT_TIMEOUT_CALL(*mCallback, backgroundScanComplete, ProgramListResult::OK) .Times(AnyNumber()); - auto hidlResult = mTuner->getProgramList("", getListCb); + auto hidlResult = mTuner->getProgramList({}, getListCb); EXPECT_TRUE(hidlResult.isOk()); if (!hidlResult.isOk()) return false; @@ -287,7 +287,7 @@ bool BroadcastRadioHalTest::getProgramList( EXPECT_TIMEOUT_CALL_WAIT(*mCallback, backgroundScanComplete, kFullScanTimeout); // second (last) try... - hidlResult = mTuner->getProgramList("", getListCb); + hidlResult = mTuner->getProgramList({}, getListCb); EXPECT_TRUE(hidlResult.isOk()); if (!hidlResult.isOk()) return false; EXPECT_EQ(ProgramListResult::OK, getListResult); From ec73701e4c35f7eb77ce8ac2bea177fcffb747ec Mon Sep 17 00:00:00 2001 From: Steve Paik Date: Wed, 2 Aug 2017 19:07:53 -0700 Subject: [PATCH 112/265] Implement comments from API review Bug: 64372008 Test: Fix comments Change-Id: Ia2bc0ae4c45015e7965b544f5d46f7e2a3ff0e2a --- automotive/vehicle/2.1/types.hal | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/automotive/vehicle/2.1/types.hal b/automotive/vehicle/2.1/types.hal index 53feb23cec..f408748754 100644 --- a/automotive/vehicle/2.1/types.hal +++ b/automotive/vehicle/2.1/types.hal @@ -50,16 +50,11 @@ enum VehicleProperty: @2.0::VehicleProperty { * configArray[3] = micrometers per rear right wheel tick * configArray[4] = micrometers per rear left wheel tick * - * NOTE: If a wheel is not supported, its value shall always be set to - * LONG_MAX = 9223372036854775807. + * NOTE: If a wheel is not supported, its value shall always be set to 0. * * VehiclePropValue.timestamp must be correctly filled in. * - * Vendors must specify wheels that support this sensor in - * VehiclePropConfig.configFlags. The format of this field is a bitset of - * values from Wheel enum. - * - * @change_mode VehiclePropertyChangeMode:ON_CHANGE |VehiclePropertyChangeMode:CONTINUOUS + * @change_mode VehiclePropertyChangeMode:CONTINUOUS * @access VehiclePropertyAccess:READ */ WHEEL_TICK = ( @@ -95,9 +90,8 @@ enum VehicleProperty: @2.0::VehicleProperty { /** * Automatic re-circulation on/off * - * IVehicle#set may return StatusCode::NOT_AVAILABLE and IVehicle#get is not - * guaranteed to work if HVAC unit is off. See HVAC_POWER_ON property for - * details. + * IVehicle#set and IVehicle#get must return StatusCode::NOT_AVAILABLE when HVAC unit is off. + * See HVAC_POWER_ON property for details. * * @change_mode VehiclePropertyChangeMode:ON_CHANGE * @access VehiclePropertyAccess:READ_WRITE From 608d773ef8f346105d77ca5292505949a240b699 Mon Sep 17 00:00:00 2001 From: Justin Yun Date: Fri, 4 Aug 2017 14:12:23 +0900 Subject: [PATCH 113/265] Update make file for vndk enabled. Update the Android.bp generated with hidl-gen. Test: build with and without BOARD_VNDK_VERSION=current Bug: 63866913 Change-Id: I1a9db1df49e0f13c5790da2b118ae9ec63ba34a7 --- audio/2.0/Android.bp | 3 +++ audio/common/2.0/Android.bp | 3 +++ audio/effect/2.0/Android.bp | 3 +++ automotive/evs/1.0/Android.bp | 3 +++ automotive/vehicle/2.0/Android.bp | 3 +++ automotive/vehicle/2.1/Android.bp | 3 +++ biometrics/fingerprint/2.1/Android.bp | 3 +++ broadcastradio/1.0/Android.bp | 3 +++ broadcastradio/1.1/Android.bp | 3 +++ camera/common/1.0/Android.bp | 3 +++ camera/device/1.0/Android.bp | 3 +++ camera/device/3.2/Android.bp | 3 +++ camera/metadata/3.2/Android.bp | 3 +++ camera/provider/2.4/Android.bp | 3 +++ cas/1.0/Android.bp | 3 +++ cas/native/1.0/Android.bp | 3 +++ configstore/1.1/Android.bp | 3 +++ contexthub/1.0/Android.bp | 3 +++ drm/1.0/Android.bp | 3 +++ dumpstate/1.0/Android.bp | 3 +++ gatekeeper/1.0/Android.bp | 3 +++ gnss/1.0/Android.bp | 3 +++ graphics/allocator/2.0/Android.bp | 3 +++ graphics/bufferqueue/1.0/Android.bp | 3 +++ graphics/common/1.0/Android.bp | 3 +++ graphics/composer/2.1/Android.bp | 3 +++ graphics/mapper/2.0/Android.bp | 3 +++ health/1.0/Android.bp | 3 +++ keymaster/3.0/Android.bp | 3 +++ light/2.0/Android.bp | 3 +++ media/1.0/Android.bp | 3 +++ media/omx/1.0/Android.bp | 3 +++ memtrack/1.0/Android.bp | 3 +++ neuralnetworks/1.0/Android.bp | 3 +++ oemlock/1.0/Android.bp | 3 +++ power/1.0/Android.bp | 3 +++ power/1.1/Android.bp | 3 +++ sensors/1.0/Android.bp | 3 +++ soundtrigger/2.0/Android.bp | 3 +++ tests/extension/light/2.0/Android.bp | 3 +++ thermal/1.0/Android.bp | 3 +++ tv/cec/1.0/Android.bp | 3 +++ tv/input/1.0/Android.bp | 3 +++ usb/1.0/Android.bp | 3 +++ usb/1.1/Android.bp | 3 +++ vibrator/1.0/Android.bp | 3 +++ vibrator/1.1/Android.bp | 3 +++ vr/1.0/Android.bp | 3 +++ weaver/1.0/Android.bp | 3 +++ wifi/1.1/Android.bp | 3 +++ wifi/offload/1.0/Android.bp | 3 +++ 51 files changed, 153 insertions(+) diff --git a/audio/2.0/Android.bp b/audio/2.0/Android.bp index b1419517ba..cdaaa15677 100644 --- a/audio/2.0/Android.bp +++ b/audio/2.0/Android.bp @@ -88,6 +88,9 @@ cc_library { generated_headers: ["android.hardware.audio@2.0_genc++_headers"], export_generated_headers: ["android.hardware.audio@2.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/audio/common/2.0/Android.bp b/audio/common/2.0/Android.bp index ee28eff634..0007f447eb 100644 --- a/audio/common/2.0/Android.bp +++ b/audio/common/2.0/Android.bp @@ -39,6 +39,9 @@ cc_library { generated_headers: ["android.hardware.audio.common@2.0_genc++_headers"], export_generated_headers: ["android.hardware.audio.common@2.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/audio/effect/2.0/Android.bp b/audio/effect/2.0/Android.bp index 8bfde143f5..fd667f01a0 100644 --- a/audio/effect/2.0/Android.bp +++ b/audio/effect/2.0/Android.bp @@ -137,6 +137,9 @@ cc_library { generated_headers: ["android.hardware.audio.effect@2.0_genc++_headers"], export_generated_headers: ["android.hardware.audio.effect@2.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/automotive/evs/1.0/Android.bp b/automotive/evs/1.0/Android.bp index 05bc72172b..7ae2231c34 100644 --- a/automotive/evs/1.0/Android.bp +++ b/automotive/evs/1.0/Android.bp @@ -67,6 +67,9 @@ cc_library { generated_headers: ["android.hardware.automotive.evs@1.0_genc++_headers"], export_generated_headers: ["android.hardware.automotive.evs@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/automotive/vehicle/2.0/Android.bp b/automotive/vehicle/2.0/Android.bp index 3fd56239b1..879fe0d999 100644 --- a/automotive/vehicle/2.0/Android.bp +++ b/automotive/vehicle/2.0/Android.bp @@ -53,6 +53,9 @@ cc_library { generated_headers: ["android.hardware.automotive.vehicle@2.0_genc++_headers"], export_generated_headers: ["android.hardware.automotive.vehicle@2.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/automotive/vehicle/2.1/Android.bp b/automotive/vehicle/2.1/Android.bp index 5fb188a58d..447c08e336 100644 --- a/automotive/vehicle/2.1/Android.bp +++ b/automotive/vehicle/2.1/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.automotive.vehicle@2.1_genc++_headers"], export_generated_headers: ["android.hardware.automotive.vehicle@2.1_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/biometrics/fingerprint/2.1/Android.bp b/biometrics/fingerprint/2.1/Android.bp index 04d35073a0..3898da5b0d 100644 --- a/biometrics/fingerprint/2.1/Android.bp +++ b/biometrics/fingerprint/2.1/Android.bp @@ -53,6 +53,9 @@ cc_library { generated_headers: ["android.hardware.biometrics.fingerprint@2.1_genc++_headers"], export_generated_headers: ["android.hardware.biometrics.fingerprint@2.1_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/broadcastradio/1.0/Android.bp b/broadcastradio/1.0/Android.bp index 06126d3002..5b8e2395b1 100644 --- a/broadcastradio/1.0/Android.bp +++ b/broadcastradio/1.0/Android.bp @@ -67,6 +67,9 @@ cc_library { generated_headers: ["android.hardware.broadcastradio@1.0_genc++_headers"], export_generated_headers: ["android.hardware.broadcastradio@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/broadcastradio/1.1/Android.bp b/broadcastradio/1.1/Android.bp index 4c37b36211..12e23d6968 100644 --- a/broadcastradio/1.1/Android.bp +++ b/broadcastradio/1.1/Android.bp @@ -67,6 +67,9 @@ cc_library { generated_headers: ["android.hardware.broadcastradio@1.1_genc++_headers"], export_generated_headers: ["android.hardware.broadcastradio@1.1_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/camera/common/1.0/Android.bp b/camera/common/1.0/Android.bp index 22457b0991..ade7260d8f 100644 --- a/camera/common/1.0/Android.bp +++ b/camera/common/1.0/Android.bp @@ -39,6 +39,9 @@ cc_library { generated_headers: ["android.hardware.camera.common@1.0_genc++_headers"], export_generated_headers: ["android.hardware.camera.common@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/camera/device/1.0/Android.bp b/camera/device/1.0/Android.bp index 3a6615c5d8..b8335f951d 100644 --- a/camera/device/1.0/Android.bp +++ b/camera/device/1.0/Android.bp @@ -60,6 +60,9 @@ cc_library { generated_headers: ["android.hardware.camera.device@1.0_genc++_headers"], export_generated_headers: ["android.hardware.camera.device@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/camera/device/3.2/Android.bp b/camera/device/3.2/Android.bp index 3c60570bd8..24c2151902 100644 --- a/camera/device/3.2/Android.bp +++ b/camera/device/3.2/Android.bp @@ -60,6 +60,9 @@ cc_library { generated_headers: ["android.hardware.camera.device@3.2_genc++_headers"], export_generated_headers: ["android.hardware.camera.device@3.2_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/camera/metadata/3.2/Android.bp b/camera/metadata/3.2/Android.bp index 1bec475798..3c4b5e964c 100644 --- a/camera/metadata/3.2/Android.bp +++ b/camera/metadata/3.2/Android.bp @@ -39,6 +39,9 @@ cc_library { generated_headers: ["android.hardware.camera.metadata@3.2_genc++_headers"], export_generated_headers: ["android.hardware.camera.metadata@3.2_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/camera/provider/2.4/Android.bp b/camera/provider/2.4/Android.bp index 02f4d8d144..82a3a78a96 100644 --- a/camera/provider/2.4/Android.bp +++ b/camera/provider/2.4/Android.bp @@ -49,6 +49,9 @@ cc_library { generated_headers: ["android.hardware.camera.provider@2.4_genc++_headers"], export_generated_headers: ["android.hardware.camera.provider@2.4_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/cas/1.0/Android.bp b/cas/1.0/Android.bp index f351d10c04..6d94793b7e 100644 --- a/cas/1.0/Android.bp +++ b/cas/1.0/Android.bp @@ -67,6 +67,9 @@ cc_library { generated_headers: ["android.hardware.cas@1.0_genc++_headers"], export_generated_headers: ["android.hardware.cas@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/cas/native/1.0/Android.bp b/cas/native/1.0/Android.bp index 18361566c6..e39cab1f7b 100644 --- a/cas/native/1.0/Android.bp +++ b/cas/native/1.0/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.cas.native@1.0_genc++_headers"], export_generated_headers: ["android.hardware.cas.native@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/configstore/1.1/Android.bp b/configstore/1.1/Android.bp index 157265ab7d..92fb7c1399 100644 --- a/configstore/1.1/Android.bp +++ b/configstore/1.1/Android.bp @@ -42,6 +42,9 @@ cc_library { generated_headers: ["android.hardware.configstore@1.1_genc++_headers"], export_generated_headers: ["android.hardware.configstore@1.1_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/contexthub/1.0/Android.bp b/contexthub/1.0/Android.bp index 286e9610d0..ae1bd082a6 100644 --- a/contexthub/1.0/Android.bp +++ b/contexthub/1.0/Android.bp @@ -53,6 +53,9 @@ cc_library { generated_headers: ["android.hardware.contexthub@1.0_genc++_headers"], export_generated_headers: ["android.hardware.contexthub@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/drm/1.0/Android.bp b/drm/1.0/Android.bp index a6c2021d1a..d004b82725 100644 --- a/drm/1.0/Android.bp +++ b/drm/1.0/Android.bp @@ -74,6 +74,9 @@ cc_library { generated_headers: ["android.hardware.drm@1.0_genc++_headers"], export_generated_headers: ["android.hardware.drm@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/dumpstate/1.0/Android.bp b/dumpstate/1.0/Android.bp index a2b497b03f..b135e0027d 100644 --- a/dumpstate/1.0/Android.bp +++ b/dumpstate/1.0/Android.bp @@ -42,6 +42,9 @@ cc_library { generated_headers: ["android.hardware.dumpstate@1.0_genc++_headers"], export_generated_headers: ["android.hardware.dumpstate@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/gatekeeper/1.0/Android.bp b/gatekeeper/1.0/Android.bp index 4b54561217..f12f38fd9d 100644 --- a/gatekeeper/1.0/Android.bp +++ b/gatekeeper/1.0/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.gatekeeper@1.0_genc++_headers"], export_generated_headers: ["android.hardware.gatekeeper@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/gnss/1.0/Android.bp b/gnss/1.0/Android.bp index 0b342f4410..6db98f66cb 100644 --- a/gnss/1.0/Android.bp +++ b/gnss/1.0/Android.bp @@ -179,6 +179,9 @@ cc_library { generated_headers: ["android.hardware.gnss@1.0_genc++_headers"], export_generated_headers: ["android.hardware.gnss@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/graphics/allocator/2.0/Android.bp b/graphics/allocator/2.0/Android.bp index 4b358982ac..d43bbdb85b 100644 --- a/graphics/allocator/2.0/Android.bp +++ b/graphics/allocator/2.0/Android.bp @@ -42,6 +42,9 @@ cc_library { generated_headers: ["android.hardware.graphics.allocator@2.0_genc++_headers"], export_generated_headers: ["android.hardware.graphics.allocator@2.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/graphics/bufferqueue/1.0/Android.bp b/graphics/bufferqueue/1.0/Android.bp index ff51843481..2d36fc7e71 100644 --- a/graphics/bufferqueue/1.0/Android.bp +++ b/graphics/bufferqueue/1.0/Android.bp @@ -49,6 +49,9 @@ cc_library { generated_headers: ["android.hardware.graphics.bufferqueue@1.0_genc++_headers"], export_generated_headers: ["android.hardware.graphics.bufferqueue@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/graphics/common/1.0/Android.bp b/graphics/common/1.0/Android.bp index f694ea8070..84502312b4 100644 --- a/graphics/common/1.0/Android.bp +++ b/graphics/common/1.0/Android.bp @@ -39,6 +39,9 @@ cc_library { generated_headers: ["android.hardware.graphics.common@1.0_genc++_headers"], export_generated_headers: ["android.hardware.graphics.common@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/graphics/composer/2.1/Android.bp b/graphics/composer/2.1/Android.bp index 0292f03fb3..e875708625 100644 --- a/graphics/composer/2.1/Android.bp +++ b/graphics/composer/2.1/Android.bp @@ -60,6 +60,9 @@ cc_library { generated_headers: ["android.hardware.graphics.composer@2.1_genc++_headers"], export_generated_headers: ["android.hardware.graphics.composer@2.1_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/graphics/mapper/2.0/Android.bp b/graphics/mapper/2.0/Android.bp index 36babd0ad6..ce829e7a6f 100644 --- a/graphics/mapper/2.0/Android.bp +++ b/graphics/mapper/2.0/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.graphics.mapper@2.0_genc++_headers"], export_generated_headers: ["android.hardware.graphics.mapper@2.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/health/1.0/Android.bp b/health/1.0/Android.bp index 3b5dde8fbc..d8ebc20ae0 100644 --- a/health/1.0/Android.bp +++ b/health/1.0/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.health@1.0_genc++_headers"], export_generated_headers: ["android.hardware.health@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/keymaster/3.0/Android.bp b/keymaster/3.0/Android.bp index deb622ba4f..14cfab23db 100644 --- a/keymaster/3.0/Android.bp +++ b/keymaster/3.0/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.keymaster@3.0_genc++_headers"], export_generated_headers: ["android.hardware.keymaster@3.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/light/2.0/Android.bp b/light/2.0/Android.bp index 08c249389a..7cc7f84980 100644 --- a/light/2.0/Android.bp +++ b/light/2.0/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.light@2.0_genc++_headers"], export_generated_headers: ["android.hardware.light@2.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/media/1.0/Android.bp b/media/1.0/Android.bp index 754453a426..de2187edbf 100644 --- a/media/1.0/Android.bp +++ b/media/1.0/Android.bp @@ -39,6 +39,9 @@ cc_library { generated_headers: ["android.hardware.media@1.0_genc++_headers"], export_generated_headers: ["android.hardware.media@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/media/omx/1.0/Android.bp b/media/omx/1.0/Android.bp index 67e05291a0..f8bed6edb7 100644 --- a/media/omx/1.0/Android.bp +++ b/media/omx/1.0/Android.bp @@ -81,6 +81,9 @@ cc_library { generated_headers: ["android.hardware.media.omx@1.0_genc++_headers"], export_generated_headers: ["android.hardware.media.omx@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/memtrack/1.0/Android.bp b/memtrack/1.0/Android.bp index 54995d8cb5..4df2c1d89e 100644 --- a/memtrack/1.0/Android.bp +++ b/memtrack/1.0/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.memtrack@1.0_genc++_headers"], export_generated_headers: ["android.hardware.memtrack@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/neuralnetworks/1.0/Android.bp b/neuralnetworks/1.0/Android.bp index a0269b3d8b..b5603a2ecc 100644 --- a/neuralnetworks/1.0/Android.bp +++ b/neuralnetworks/1.0/Android.bp @@ -53,6 +53,9 @@ cc_library { generated_headers: ["android.hardware.neuralnetworks@1.0_genc++_headers"], export_generated_headers: ["android.hardware.neuralnetworks@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/oemlock/1.0/Android.bp b/oemlock/1.0/Android.bp index 8e219cf78e..742061d5d6 100644 --- a/oemlock/1.0/Android.bp +++ b/oemlock/1.0/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.oemlock@1.0_genc++_headers"], export_generated_headers: ["android.hardware.oemlock@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/power/1.0/Android.bp b/power/1.0/Android.bp index f393c91d07..bc886cb71a 100644 --- a/power/1.0/Android.bp +++ b/power/1.0/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.power@1.0_genc++_headers"], export_generated_headers: ["android.hardware.power@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/power/1.1/Android.bp b/power/1.1/Android.bp index fd5ec75d8b..fb10aba15b 100644 --- a/power/1.1/Android.bp +++ b/power/1.1/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.power@1.1_genc++_headers"], export_generated_headers: ["android.hardware.power@1.1_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/sensors/1.0/Android.bp b/sensors/1.0/Android.bp index ac1cb1879e..b2cda05d71 100644 --- a/sensors/1.0/Android.bp +++ b/sensors/1.0/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.sensors@1.0_genc++_headers"], export_generated_headers: ["android.hardware.sensors@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/soundtrigger/2.0/Android.bp b/soundtrigger/2.0/Android.bp index d7e395f723..f45c4e2759 100644 --- a/soundtrigger/2.0/Android.bp +++ b/soundtrigger/2.0/Android.bp @@ -53,6 +53,9 @@ cc_library { generated_headers: ["android.hardware.soundtrigger@2.0_genc++_headers"], export_generated_headers: ["android.hardware.soundtrigger@2.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/extension/light/2.0/Android.bp b/tests/extension/light/2.0/Android.bp index c5987a77c3..52117b41e0 100644 --- a/tests/extension/light/2.0/Android.bp +++ b/tests/extension/light/2.0/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.tests.extension.light@2.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.extension.light@2.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/thermal/1.0/Android.bp b/thermal/1.0/Android.bp index 9c3240b1fc..aa971757e8 100644 --- a/thermal/1.0/Android.bp +++ b/thermal/1.0/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.thermal@1.0_genc++_headers"], export_generated_headers: ["android.hardware.thermal@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tv/cec/1.0/Android.bp b/tv/cec/1.0/Android.bp index 810dc205e5..c9da7373eb 100644 --- a/tv/cec/1.0/Android.bp +++ b/tv/cec/1.0/Android.bp @@ -53,6 +53,9 @@ cc_library { generated_headers: ["android.hardware.tv.cec@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tv.cec@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tv/input/1.0/Android.bp b/tv/input/1.0/Android.bp index b48ef58816..22ea1d847f 100644 --- a/tv/input/1.0/Android.bp +++ b/tv/input/1.0/Android.bp @@ -53,6 +53,9 @@ cc_library { generated_headers: ["android.hardware.tv.input@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tv.input@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/usb/1.0/Android.bp b/usb/1.0/Android.bp index 4157d9232d..afe1931774 100644 --- a/usb/1.0/Android.bp +++ b/usb/1.0/Android.bp @@ -53,6 +53,9 @@ cc_library { generated_headers: ["android.hardware.usb@1.0_genc++_headers"], export_generated_headers: ["android.hardware.usb@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/usb/1.1/Android.bp b/usb/1.1/Android.bp index fa4ca117ac..5466001bf7 100644 --- a/usb/1.1/Android.bp +++ b/usb/1.1/Android.bp @@ -53,6 +53,9 @@ cc_library { generated_headers: ["android.hardware.usb@1.1_genc++_headers"], export_generated_headers: ["android.hardware.usb@1.1_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/vibrator/1.0/Android.bp b/vibrator/1.0/Android.bp index 4f3263a31d..354b83ffef 100644 --- a/vibrator/1.0/Android.bp +++ b/vibrator/1.0/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.vibrator@1.0_genc++_headers"], export_generated_headers: ["android.hardware.vibrator@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/vibrator/1.1/Android.bp b/vibrator/1.1/Android.bp index e8729defac..a47f37c9a0 100644 --- a/vibrator/1.1/Android.bp +++ b/vibrator/1.1/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.vibrator@1.1_genc++_headers"], export_generated_headers: ["android.hardware.vibrator@1.1_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/vr/1.0/Android.bp b/vr/1.0/Android.bp index 2d64a71c77..cb9e2af8ac 100644 --- a/vr/1.0/Android.bp +++ b/vr/1.0/Android.bp @@ -42,6 +42,9 @@ cc_library { generated_headers: ["android.hardware.vr@1.0_genc++_headers"], export_generated_headers: ["android.hardware.vr@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/weaver/1.0/Android.bp b/weaver/1.0/Android.bp index c58468a31b..cdc59c9d06 100644 --- a/weaver/1.0/Android.bp +++ b/weaver/1.0/Android.bp @@ -46,6 +46,9 @@ cc_library { generated_headers: ["android.hardware.weaver@1.0_genc++_headers"], export_generated_headers: ["android.hardware.weaver@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/wifi/1.1/Android.bp b/wifi/1.1/Android.bp index cb7acc8ebd..aa6e9379be 100644 --- a/wifi/1.1/Android.bp +++ b/wifi/1.1/Android.bp @@ -49,6 +49,9 @@ cc_library { generated_headers: ["android.hardware.wifi@1.1_genc++_headers"], export_generated_headers: ["android.hardware.wifi@1.1_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/wifi/offload/1.0/Android.bp b/wifi/offload/1.0/Android.bp index c8a1305981..5b7fcad875 100644 --- a/wifi/offload/1.0/Android.bp +++ b/wifi/offload/1.0/Android.bp @@ -53,6 +53,9 @@ cc_library { generated_headers: ["android.hardware.wifi.offload@1.0_genc++_headers"], export_generated_headers: ["android.hardware.wifi.offload@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", From f2bd6c12a2417fd10f512b3194bb0670be2e5fa5 Mon Sep 17 00:00:00 2001 From: Justin Yun Date: Fri, 4 Aug 2017 14:40:55 +0900 Subject: [PATCH 114/265] Manually update makefile for vndk-sp hidl libs. vndk-sp is not automatically tagged by hidl-gen. For vndk-sp libs, "support_system_process: true" is manually added in "vndk" property. Bug: 63866913 Test: build and boot with BOARD_VNDK_VERSION=current Change-Id: I2b18d691411e58dc55bcdfa39ecb3659242c8437 --- graphics/allocator/2.0/Android.bp | 1 + graphics/common/1.0/Android.bp | 1 + graphics/mapper/2.0/Android.bp | 1 + renderscript/1.0/Android.bp | 1 + 4 files changed, 4 insertions(+) diff --git a/graphics/allocator/2.0/Android.bp b/graphics/allocator/2.0/Android.bp index d43bbdb85b..46faa17bc2 100644 --- a/graphics/allocator/2.0/Android.bp +++ b/graphics/allocator/2.0/Android.bp @@ -44,6 +44,7 @@ cc_library { vendor_available: true, vndk: { enabled: true, + support_system_process: true, }, shared_libs: [ "libhidlbase", diff --git a/graphics/common/1.0/Android.bp b/graphics/common/1.0/Android.bp index 84502312b4..86438c1a35 100644 --- a/graphics/common/1.0/Android.bp +++ b/graphics/common/1.0/Android.bp @@ -41,6 +41,7 @@ cc_library { vendor_available: true, vndk: { enabled: true, + support_system_process: true, }, shared_libs: [ "libhidlbase", diff --git a/graphics/mapper/2.0/Android.bp b/graphics/mapper/2.0/Android.bp index ce829e7a6f..f5913af203 100644 --- a/graphics/mapper/2.0/Android.bp +++ b/graphics/mapper/2.0/Android.bp @@ -48,6 +48,7 @@ cc_library { vendor_available: true, vndk: { enabled: true, + support_system_process: true, }, shared_libs: [ "libhidlbase", diff --git a/renderscript/1.0/Android.bp b/renderscript/1.0/Android.bp index 0a8535abab..0f626523f2 100644 --- a/renderscript/1.0/Android.bp +++ b/renderscript/1.0/Android.bp @@ -55,6 +55,7 @@ cc_library { vendor_available: true, vndk: { enabled: true, + support_system_process: true, }, shared_libs: [ "libhidlbase", From eff28dc3ba58bc734fc77fed478fc7a77fa9348e Mon Sep 17 00:00:00 2001 From: Justin Yun Date: Fri, 4 Aug 2017 15:02:42 +0900 Subject: [PATCH 115/265] Mark hidl utils as vndk As a VNDK module, Android.bp must have 'vndk' tag as well as 'vendor_available: true'. The 'vndk' tag for VNDK module is formated as below: vndk: { enabled: true, }, VNDK modules will be installed both in system/lib(64) as normal and in system/lib(64)/vndk as a vendor variant. Bug: 63866913 Test: build and boot with BOARD_VNDK_VERSION=current Change-Id: If0eb0c1bddfa5bdc7ea0ca4635d4e53b59836582 --- audio/common/2.0/default/Android.bp | 3 +++ configstore/utils/Android.bp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/audio/common/2.0/default/Android.bp b/audio/common/2.0/default/Android.bp index 0486a5c723..104bbac49d 100644 --- a/audio/common/2.0/default/Android.bp +++ b/audio/common/2.0/default/Android.bp @@ -16,6 +16,9 @@ cc_library_shared { name: "android.hardware.audio.common@2.0-util", vendor_available: true, + vndk: { + enabled: true, + }, srcs: [ "EffectMap.cpp", "HidlUtils.cpp", diff --git a/configstore/utils/Android.bp b/configstore/utils/Android.bp index a4cad66559..93e52f1d4e 100644 --- a/configstore/utils/Android.bp +++ b/configstore/utils/Android.bp @@ -17,6 +17,9 @@ cc_library_shared { name: "android.hardware.configstore-utils", vendor_available: true, + vndk: { + enabled: true, + }, defaults: ["hidl_defaults"], srcs: [ "ConfigStoreUtils.cpp" ], From 48f8e5d6be9f3495562115057c6a1e260853e635 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Fri, 4 Aug 2017 10:36:07 -0700 Subject: [PATCH 116/265] Wifi supplicant test statically links to dependencies. This test now statically links to libs not guaranteed to be on the device. Bug: 64040096 Test: compiles Change-Id: I986e61835e641e15bdad0ff9571ee8ffa59b2a46 --- wifi/Android.bp | 1 + wifi/supplicant/1.0/vts/functional/Android.bp | 37 ++++++++++++++++ wifi/supplicant/1.0/vts/functional/Android.mk | 44 ------------------- 3 files changed, 38 insertions(+), 44 deletions(-) create mode 100644 wifi/supplicant/1.0/vts/functional/Android.bp delete mode 100644 wifi/supplicant/1.0/vts/functional/Android.mk diff --git a/wifi/Android.bp b/wifi/Android.bp index b4ab98ffef..1153b0c628 100644 --- a/wifi/Android.bp +++ b/wifi/Android.bp @@ -7,4 +7,5 @@ subdirs = [ "offload/1.0", "offload/1.0/vts/functional", "supplicant/1.0", + "supplicant/1.0/vts/functional", ] diff --git a/wifi/supplicant/1.0/vts/functional/Android.bp b/wifi/supplicant/1.0/vts/functional/Android.bp new file mode 100644 index 0000000000..24b9f6f71f --- /dev/null +++ b/wifi/supplicant/1.0/vts/functional/Android.bp @@ -0,0 +1,37 @@ +// +// Copyright (C) 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. +// + +cc_test { + name: "VtsHalWifiSupplicantV1_0TargetTest", + defaults: ["VtsHalTargetTestDefaults"], + srcs: [ + "VtsHalWifiSupplicantV1_0TargetTest.cpp", + "supplicant_hidl_test.cpp", + "supplicant_hidl_test_utils.cpp", + "supplicant_p2p_iface_hidl_test.cpp", + "supplicant_sta_iface_hidl_test.cpp", + "supplicant_sta_network_hidl_test.cpp", + ], + static_libs: [ + "VtsHalWifiV1_0TargetTestUtil", + "android.hardware.wifi.supplicant@1.0", + "android.hardware.wifi@1.0", + "libcrypto", + "libgmock", + "libwifi-system", + "libwifi-system-iface", + ], +} diff --git a/wifi/supplicant/1.0/vts/functional/Android.mk b/wifi/supplicant/1.0/vts/functional/Android.mk deleted file mode 100644 index c6e39503d4..0000000000 --- a/wifi/supplicant/1.0/vts/functional/Android.mk +++ /dev/null @@ -1,44 +0,0 @@ -# -# Copyright (C) 2016 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := VtsHalWifiSupplicantV1_0TargetTest -LOCAL_CPPFLAGS := -Wall -Werror -Wextra -LOCAL_SRC_FILES := \ - VtsHalWifiSupplicantV1_0TargetTest.cpp \ - supplicant_hidl_test.cpp \ - supplicant_hidl_test_utils.cpp \ - supplicant_p2p_iface_hidl_test.cpp \ - supplicant_sta_iface_hidl_test.cpp \ - supplicant_sta_network_hidl_test.cpp -LOCAL_SHARED_LIBRARIES := \ - android.hardware.wifi.supplicant@1.0 \ - android.hardware.wifi@1.0 \ - libbase \ - libcutils \ - libhidlbase \ - libhidltransport \ - liblog \ - libutils \ - libwifi-system \ - libwifi-system-iface -LOCAL_STATIC_LIBRARIES := \ - libgmock \ - VtsHalHidlTargetTestBase \ - VtsHalWifiV1_0TargetTestUtil -include $(BUILD_NATIVE_TEST) - From 0cd9782665f142d964c0397a531ed7da25f5b25e Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Fri, 4 Aug 2017 10:55:31 -0700 Subject: [PATCH 117/265] Neural networks test static links to HAL def libs. Bug: 64040096 Test: compiles Change-Id: I87d26a93fa28d7cd93176489a0d0556b7350f1ed --- neuralnetworks/1.0/vts/functional/Android.bp | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/neuralnetworks/1.0/vts/functional/Android.bp b/neuralnetworks/1.0/vts/functional/Android.bp index 96eb4cb51f..d76b2c3320 100644 --- a/neuralnetworks/1.0/vts/functional/Android.bp +++ b/neuralnetworks/1.0/vts/functional/Android.bp @@ -17,21 +17,11 @@ cc_test { name: "VtsHalNeuralnetworksV1_0TargetTest", srcs: ["VtsHalNeuralnetworksV1_0TargetTest.cpp"], - defaults: ["hidl_defaults"], - shared_libs: [ - "libbase", - "libhidlbase", - "libhidlmemory", - "libhidltransport", - "liblog", - "libutils", + defaults: ["VtsHalTargetTestDefaults"], + static_libs: [ "android.hardware.neuralnetworks@1.0", "android.hidl.allocator@1.0", "android.hidl.memory@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", + "libhidlmemory", ], } From dd130660d3d64bad5cba87a1cd1d60d704e0763d Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Thu, 3 Aug 2017 18:08:57 -0700 Subject: [PATCH 118/265] Pass ProgramInfo over currentProgramInfoChanged and drop afSwitch_1_1. Bug: b/64229617 Test: VTS, instrumentation Change-Id: Id2d209a31d801f85e197312673eb6b7ee63ada46 --- broadcastradio/1.1/ITunerCallback.hal | 23 ++++++++----------- broadcastradio/1.1/default/Tuner.cpp | 2 +- .../VtsHalBroadcastradioV1_1TargetTest.cpp | 8 ++++--- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/broadcastradio/1.1/ITunerCallback.hal b/broadcastradio/1.1/ITunerCallback.hal index 2e593b0fad..8bf5b7f120 100644 --- a/broadcastradio/1.1/ITunerCallback.hal +++ b/broadcastradio/1.1/ITunerCallback.hal @@ -33,22 +33,15 @@ interface ITunerCallback extends @1.0::ITunerCallback { * The 1.0 callback must not be called when HAL implementation detects * 1.1 client (by casting V1_0::ITunerCallback to V1_1::ITunerCallback). * + * In case of success, currentProgramInfoChanged must be called too. + * It means the success case may (or may not) be handled by the client in + * currentProgramInfoChanged, instead of here. + * * @param result OK if tune succeeded or TIMEOUT in case of time out. * @param selector A ProgramSelector structure describing the tuned station. */ oneway tuneComplete_1_1(Result result, ProgramSelector selector); - /** - * Method called by the HAL when a frequency switch occurs. - * - * This callback supersedes V1_0::afSwitch. - * The 1.0 callback must not be called when HAL implementation detects - * 1.1 client (by casting V1_0::ITunerCallback to V1_1::ITunerCallback). - * - * @param selector A ProgramSelector structure describing the tuned station. - */ - oneway afSwitch_1_1(ProgramSelector selector); - /** * Called by the HAL when background scan feature becomes available or not. * @@ -92,10 +85,12 @@ interface ITunerCallback extends @1.0::ITunerCallback { * * This may be called together with tuneComplete_1_1 or afSwitch_1_1. * - * This callback supersedes V1_0::newMetadata and partly V1_0::tuneComplete - * and V1_0::afSwitch. + * This callback supersedes V1_0::newMetadata and V1_0::afSwitch; + * partly V1_0::tuneComplete. * 1.0 callbacks must not be called when HAL implementation detects * 1.1 client (by casting V1_0::ITunerCallback to V1_1::ITunerCallback). + * + * @param info current program information */ - oneway currentProgramInfoChanged(); + oneway currentProgramInfoChanged(ProgramInfo info); }; diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index 6048518d98..87964d3f75 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -144,7 +144,7 @@ void Tuner::tuneInternalLocked(const ProgramSelector& sel) { mCallback->tuneComplete(Result::OK, mCurrentProgramInfo.base); } else { mCallback1_1->tuneComplete_1_1(Result::OK, mCurrentProgramInfo.selector); - mCallback1_1->currentProgramInfoChanged(); + mCallback1_1->currentProgramInfoChanged(mCurrentProgramInfo); } } diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index 6feb710fa2..55abe9be7f 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -85,7 +85,6 @@ struct TunerCallbackMock : public ITunerCallback { MOCK_METHOD2(tuneComplete, Return(Result, const V1_0::ProgramInfo&)); MOCK_TIMEOUT_METHOD2(tuneComplete_1_1, Return(Result, const ProgramSelector&)); MOCK_METHOD1(afSwitch, Return(const V1_0::ProgramInfo&)); - MOCK_METHOD1(afSwitch_1_1, Return(const ProgramSelector&)); MOCK_METHOD1(antennaStateChange, Return(bool connected)); MOCK_METHOD1(trafficAnnouncement, Return(bool active)); MOCK_METHOD1(emergencyAnnouncement, Return(bool active)); @@ -93,7 +92,7 @@ struct TunerCallbackMock : public ITunerCallback { MOCK_METHOD1(backgroundScanAvailable, Return(bool)); MOCK_TIMEOUT_METHOD1(backgroundScanComplete, Return(ProgramListResult)); MOCK_METHOD0(programListChanged, Return()); - MOCK_TIMEOUT_METHOD0(currentProgramInfoChanged, Return()); + MOCK_TIMEOUT_METHOD1(currentProgramInfoChanged, Return(const ProgramInfo&)); }; class BroadcastRadioHalTest : public ::testing::VtsHalHidlTargetTestBase, @@ -346,16 +345,19 @@ TEST_P(BroadcastRadioHalTest, TuneFromProgramList) { return; } + ProgramInfo infoCb; ProgramSelector selCb; EXPECT_CALL(*mCallback, tuneComplete(_, _)).Times(0); EXPECT_TIMEOUT_CALL(*mCallback, tuneComplete_1_1, Result::OK, _) .WillOnce(DoAll(SaveArg<1>(&selCb), testing::Return(ByMove(Void())))); - EXPECT_TIMEOUT_CALL(*mCallback, currentProgramInfoChanged); + EXPECT_TIMEOUT_CALL(*mCallback, currentProgramInfoChanged, _) + .WillOnce(DoAll(SaveArg<0>(&infoCb), testing::Return(ByMove(Void())))); auto tuneResult = mTuner->tuneByProgramSelector(firstProgram.selector); ASSERT_EQ(Result::OK, tuneResult); EXPECT_TIMEOUT_CALL_WAIT(*mCallback, tuneComplete_1_1, kTuneTimeout); EXPECT_TIMEOUT_CALL_WAIT(*mCallback, currentProgramInfoChanged, kEventPropagationTimeout); EXPECT_EQ(firstProgram.selector.primaryId, selCb.primaryId); + EXPECT_EQ(infoCb.selector, selCb); bool called = false; auto getResult = mTuner->getProgramInformation_1_1([&](Result result, ProgramInfo info) { From aad486b1b053718d097f3f3b6870dd44c831250b Mon Sep 17 00:00:00 2001 From: sqian Date: Thu, 3 Aug 2017 15:14:33 -0700 Subject: [PATCH 119/265] Add me into owners of radio vts Test: no need Bug: 64220334 Change-Id: I2a9b82ee1562859827a844e729451f6d03c4e592 --- radio/1.0/vts/OWNERS | 1 + radio/1.1/vts/OWNERS | 1 + 2 files changed, 2 insertions(+) diff --git a/radio/1.0/vts/OWNERS b/radio/1.0/vts/OWNERS index 8236e9408a..2384317995 100644 --- a/radio/1.0/vts/OWNERS +++ b/radio/1.0/vts/OWNERS @@ -1,6 +1,7 @@ # Telephony team amitmahajan@google.com sanketpadawe@google.com +shuoq@google.com # VTS team yuexima@google.com diff --git a/radio/1.1/vts/OWNERS b/radio/1.1/vts/OWNERS index 8236e9408a..2384317995 100644 --- a/radio/1.1/vts/OWNERS +++ b/radio/1.1/vts/OWNERS @@ -1,6 +1,7 @@ # Telephony team amitmahajan@google.com sanketpadawe@google.com +shuoq@google.com # VTS team yuexima@google.com From da97a6dd42c1fdacc5110c8b04e95d67321697d5 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Fri, 4 Aug 2017 12:57:29 -0700 Subject: [PATCH 120/265] Change VENDOR program types to range. Bug: b/64331420 Test: VTS, instrumentation Change-Id: If91d8e6835ed3acaf429bb05b96f3d3a7985d19b --- broadcastradio/1.1/types.hal | 24 ++++++++++++------- broadcastradio/1.1/utils/Utils.cpp | 6 +---- .../VtsHalBroadcastradioV1_1TargetTest.cpp | 17 ++++--------- 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/broadcastradio/1.1/types.hal b/broadcastradio/1.1/types.hal index 3e616c808b..8b8fc6fdde 100644 --- a/broadcastradio/1.1/types.hal +++ b/broadcastradio/1.1/types.hal @@ -128,11 +128,14 @@ enum Modulation : uint32_t { /** * Type of a radio technology. * + * VENDOR program types must be opaque to the framework. + * * There are multiple VENDOR program types just to make vendor implementation * easier with multiple properitary radio technologies. They are treated the * same by the framework. * * All other values are reserved for future use. + * Values not matching any enumerated constant must be ignored. */ enum ProgramType : uint32_t { AM = 1, // analogue AM radio (with or without RDS) @@ -142,10 +145,10 @@ enum ProgramType : uint32_t { DAB, // Digital audio broadcasting DRMO, // Digital Radio Mondiale SXM, // SiriusXM Satellite Radio - VENDOR1, // Vendor-specific, not synced across devices. - VENDOR2, // Vendor-specific, not synced across devices. - VENDOR3, // Vendor-specific, not synced across devices. - VENDOR4, // Vendor-specific, not synced across devices. + + // Vendor-specific, not synced across devices. + VENDOR_START = 1000, + VENDOR_END = 1999, }; /** @@ -155,10 +158,13 @@ enum ProgramType : uint32_t { * it for secondary IDs. For example, a satellite program may set AM/FM fallback * frequency, if a station broadcasts both via satellite and AM/FM. * + * VENDOR identifier types must be opaque to the framework. + * * The value format for each (but VENDOR_PRIMARY) identifier is strictly defined * to maintain interoperability between devices made by different vendors. * * All other values are reserved for future use. + * Values not matching any enumerated constant must be ignored. */ enum IdentifierType : uint32_t { AMFM_FREQUENCY = 1, // kHz @@ -208,12 +214,12 @@ enum IdentifierType : uint32_t { * Primary identifier for vendor-specific radio technology. * The value format is determined by a vendor. * - * It must not be used in any other programType than VENDORx. + * It must not be used in any other programType than corresponding VENDOR + * type between VENDOR_START and VENDOR_END (eg. identifier type 1015 must + * not be used in any program type other than 1015). */ - VENDOR1_PRIMARY, - VENDOR2_PRIMARY, - VENDOR3_PRIMARY, - VENDOR4_PRIMARY, + VENDOR_PRIMARY_START = ProgramType:VENDOR_START, + VENDOR_PRIMARY_END = ProgramType:VENDOR_END, }; /** diff --git a/broadcastradio/1.1/utils/Utils.cpp b/broadcastradio/1.1/utils/Utils.cpp index 50a407c7b7..8ccd98e2f1 100644 --- a/broadcastradio/1.1/utils/Utils.cpp +++ b/broadcastradio/1.1/utils/Utils.cpp @@ -93,11 +93,7 @@ bool tunesTo(const ProgramSelector& a, const ProgramSelector& b) { return haveEqualIds(a, b, IdentifierType::SXM_SERVICE_ID); } return haveEqualIds(a, b, IdentifierType::SXM_CHANNEL); - case ProgramType::VENDOR1: - case ProgramType::VENDOR2: - case ProgramType::VENDOR3: - case ProgramType::VENDOR4: - default: + default: // includes all vendor types ALOGW("Unsupported program type: %s", toString(type).c_str()); return false; } diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp index 55abe9be7f..a46378ee6a 100644 --- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp +++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp @@ -69,10 +69,6 @@ static constexpr ProgramType kStandardProgramTypes[] = { ProgramType::AM, ProgramType::FM, ProgramType::AM_HD, ProgramType::FM_HD, ProgramType::DAB, ProgramType::DRMO, ProgramType::SXM}; -static constexpr IdentifierType kVendorPrimartIds[] = { - IdentifierType::VENDOR1_PRIMARY, IdentifierType::VENDOR2_PRIMARY, - IdentifierType::VENDOR3_PRIMARY, IdentifierType::VENDOR4_PRIMARY}; - static void printSkipped(std::string msg) { std::cout << "[ SKIPPED ] " << msg << std::endl; } @@ -382,15 +378,12 @@ TEST_P(BroadcastRadioHalTest, TuneFailsForPrimaryVendor) { for (auto ptype : kStandardProgramTypes) { ALOGD("Checking %s...", toString(ptype).c_str()); - for (auto idtype : kVendorPrimartIds) { - ALOGD("...with %s", toString(idtype).c_str()); - ProgramSelector sel = {}; - sel.programType = static_cast(ptype); - sel.primaryId.type = static_cast(idtype); + ProgramSelector sel = {}; + sel.programType = static_cast(ptype); + sel.primaryId.type = static_cast(IdentifierType::VENDOR_PRIMARY_START); - auto tuneResult = mTuner->tuneByProgramSelector(sel); - ASSERT_NE(Result::OK, tuneResult); - } + auto tuneResult = mTuner->tuneByProgramSelector(sel); + ASSERT_NE(Result::OK, tuneResult); } } From 1b7c33562f34bcfe6cfb098f8a8ad868c9984449 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Fri, 4 Aug 2017 17:05:51 -0700 Subject: [PATCH 121/265] Graphics tests statically link to HAL definition libs. These tests now statically links to HAL def libs which are not guaranteed to be on the device. Bug: 64040096 Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --skip-preconditions --module VtsHalGraphicsMapperV2_0Target Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --skip-preconditions --module VtsHalGraphicsComposerV2_1Target Change-Id: I83b68dafbd161f88394f67dbda14f9957ddf7232 --- .../composer/2.1/vts/functional/Android.bp | 30 ++++++------------- graphics/mapper/2.0/vts/functional/Android.bp | 22 +++----------- 2 files changed, 13 insertions(+), 39 deletions(-) diff --git a/graphics/composer/2.1/vts/functional/Android.bp b/graphics/composer/2.1/vts/functional/Android.bp index 2e87144dbb..1ba7c9a1b2 100644 --- a/graphics/composer/2.1/vts/functional/Android.bp +++ b/graphics/composer/2.1/vts/functional/Android.bp @@ -44,33 +44,21 @@ cc_library_static { cc_test { name: "VtsHalGraphicsComposerV2_1TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalGraphicsComposerV2_1TargetTest.cpp"], + + // TODO(b/64437680): Assume these libs are always available on the device. shared_libs: [ + "libfmq", + "libsync", + ], + static_libs: [ "android.hardware.graphics.allocator@2.0", "android.hardware.graphics.composer@2.1", "android.hardware.graphics.mapper@2.0", - "libbase", - "libcutils", - "libfmq", - "libhidlbase", - "libhidltransport", - "liblog", - "libnativehelper", - "libsync", - "libutils", - ], - static_libs: [ - "libhwcomposer-command-buffer", "libVtsHalGraphicsComposerTestUtils", "libVtsHalGraphicsMapperTestUtils", - "VtsHalHidlTargetTestBase", + "libhwcomposer-command-buffer", + "libnativehelper", ], - cflags: [ - "-Wall", - "-Wextra", - "-Werror", - "-O0", - "-g", - ] } diff --git a/graphics/mapper/2.0/vts/functional/Android.bp b/graphics/mapper/2.0/vts/functional/Android.bp index 1c0e4c5a32..ac6cb47a68 100644 --- a/graphics/mapper/2.0/vts/functional/Android.bp +++ b/graphics/mapper/2.0/vts/functional/Android.bp @@ -37,30 +37,16 @@ cc_library_static { cc_test { name: "VtsHalGraphicsMapperV2_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalGraphicsMapperV2_0TargetTest.cpp"], shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", "libsync", - "libutils", + ], + static_libs: [ "android.hardware.graphics.allocator@2.0", "android.hardware.graphics.mapper@2.0", "android.hardware.graphics.common@1.0", - ], - static_libs: [ "libVtsHalGraphicsMapperTestUtils", - "VtsHalHidlTargetTestBase", + "libnativehelper", ], - cflags: [ - "-Wall", - "-Wextra", - "-Werror", - "-O0", - "-g", - ] } From 070dd5d28aa9e9dcf7407b85c94812b2086208d6 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Thu, 3 Aug 2017 16:39:35 -0700 Subject: [PATCH 122/265] Renderscript test static link to HAL def libs. And use VtsHalTargetTestDefaults. Bug: 64040096 Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --skip-preconditions --module VtsHalRenderscriptV1_0Target Change-Id: Id6177663b441b5b0971143309401d73395ab51db --- renderscript/1.0/vts/functional/Android.bp | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/renderscript/1.0/vts/functional/Android.bp b/renderscript/1.0/vts/functional/Android.bp index 5256c1f9da..bf011e6c17 100644 --- a/renderscript/1.0/vts/functional/Android.bp +++ b/renderscript/1.0/vts/functional/Android.bp @@ -23,21 +23,9 @@ cc_test { "VtsScriptTests.cpp", "bitcode.cpp", ], - defaults: ["hidl_defaults"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", - "libnativewindow", + defaults: ["VtsHalTargetTestDefaults"], + static_libs: [ "android.hardware.renderscript@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", + "libnativewindow", ], } From 8d95f2e6315010d560ffe1060765e0c0c404eb0f Mon Sep 17 00:00:00 2001 From: Todd Poynor Date: Tue, 23 May 2017 20:28:15 -0700 Subject: [PATCH 123/265] thermal: IThermal V1.1, add methods to send thermal throttling events Add IThermalCallback and IThermal::registerThermalCallback() method. Frameworks code calls this method to register a callback used by the IThermal HAL implementation to send thermal events to the framework ThermalService. Bug: 30982366 Test: VtsHalThermalV1_1Target on marlin manual test on marlin using marlin 1.1 HAL with modified thermal-engine.conf and temporary debug code for notification Change-Id: Ib49ad93a9495e3af515fced4e46f20186661fe07 (cherry picked from commit cf964d79c1d41bba999e58cb476af099191a6634) --- thermal/1.1/Android.bp | 68 ++++++++++ thermal/1.1/Android.mk | 120 ++++++++++++++++++ thermal/1.1/IThermal.hal | 31 +++++ thermal/1.1/IThermalCallback.hal | 33 +++++ thermal/1.1/vts/functional/Android.bp | 35 +++++ .../VtsHalThermalV1_1TargetTest.cpp | 106 ++++++++++++++++ thermal/Android.bp | 2 + 7 files changed, 395 insertions(+) create mode 100644 thermal/1.1/Android.bp create mode 100644 thermal/1.1/Android.mk create mode 100644 thermal/1.1/IThermal.hal create mode 100644 thermal/1.1/IThermalCallback.hal create mode 100644 thermal/1.1/vts/functional/Android.bp create mode 100644 thermal/1.1/vts/functional/VtsHalThermalV1_1TargetTest.cpp diff --git a/thermal/1.1/Android.bp b/thermal/1.1/Android.bp new file mode 100644 index 0000000000..833f219ed6 --- /dev/null +++ b/thermal/1.1/Android.bp @@ -0,0 +1,68 @@ +// This file is autogenerated by hidl-gen. Do not edit manually. + +filegroup { + name: "android.hardware.thermal@1.1_hal", + srcs: [ + "IThermal.hal", + "IThermalCallback.hal", + ], +} + +genrule { + name: "android.hardware.thermal@1.1_genc++", + tools: ["hidl-gen"], + cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.thermal@1.1", + srcs: [ + ":android.hardware.thermal@1.1_hal", + ], + out: [ + "android/hardware/thermal/1.1/ThermalAll.cpp", + "android/hardware/thermal/1.1/ThermalCallbackAll.cpp", + ], +} + +genrule { + name: "android.hardware.thermal@1.1_genc++_headers", + tools: ["hidl-gen"], + cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.thermal@1.1", + srcs: [ + ":android.hardware.thermal@1.1_hal", + ], + out: [ + "android/hardware/thermal/1.1/IThermal.h", + "android/hardware/thermal/1.1/IHwThermal.h", + "android/hardware/thermal/1.1/BnHwThermal.h", + "android/hardware/thermal/1.1/BpHwThermal.h", + "android/hardware/thermal/1.1/BsThermal.h", + "android/hardware/thermal/1.1/IThermalCallback.h", + "android/hardware/thermal/1.1/IHwThermalCallback.h", + "android/hardware/thermal/1.1/BnHwThermalCallback.h", + "android/hardware/thermal/1.1/BpHwThermalCallback.h", + "android/hardware/thermal/1.1/BsThermalCallback.h", + ], +} + +cc_library_shared { + name: "android.hardware.thermal@1.1", + defaults: ["hidl-module-defaults"], + generated_sources: ["android.hardware.thermal@1.1_genc++"], + generated_headers: ["android.hardware.thermal@1.1_genc++_headers"], + export_generated_headers: ["android.hardware.thermal@1.1_genc++_headers"], + vendor_available: true, + shared_libs: [ + "libhidlbase", + "libhidltransport", + "libhwbinder", + "liblog", + "libutils", + "libcutils", + "android.hardware.thermal@1.0", + ], + export_shared_lib_headers: [ + "libhidlbase", + "libhidltransport", + "libhwbinder", + "libutils", + "android.hardware.thermal@1.0", + ], +} diff --git a/thermal/1.1/Android.mk b/thermal/1.1/Android.mk new file mode 100644 index 0000000000..082d65b815 --- /dev/null +++ b/thermal/1.1/Android.mk @@ -0,0 +1,120 @@ +# This file is autogenerated by hidl-gen. Do not edit manually. + +LOCAL_PATH := $(call my-dir) + +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.thermal-V1.1-java +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_JAVA_LIBRARIES := \ + android.hardware.thermal-V1.0-java \ + android.hidl.base-V1.0-java \ + + +# +# Build IThermal.hal +# +GEN := $(intermediates)/android/hardware/thermal/V1_1/IThermal.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermal.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IThermalCallback.hal +$(GEN): $(LOCAL_PATH)/IThermalCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.thermal@1.1::IThermal + +$(GEN): $(LOCAL_PATH)/IThermal.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IThermalCallback.hal +# +GEN := $(intermediates)/android/hardware/thermal/V1_1/IThermalCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermalCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.thermal@1.1::IThermalCallback + +$(GEN): $(LOCAL_PATH)/IThermalCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_JAVA_LIBRARY) + + +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.thermal-V1.1-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hardware.thermal-V1.0-java-static \ + android.hidl.base-V1.0-java-static \ + + +# +# Build IThermal.hal +# +GEN := $(intermediates)/android/hardware/thermal/V1_1/IThermal.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermal.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IThermalCallback.hal +$(GEN): $(LOCAL_PATH)/IThermalCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.thermal@1.1::IThermal + +$(GEN): $(LOCAL_PATH)/IThermal.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IThermalCallback.hal +# +GEN := $(intermediates)/android/hardware/thermal/V1_1/IThermalCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermalCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.thermal@1.1::IThermalCallback + +$(GEN): $(LOCAL_PATH)/IThermalCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + + +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/thermal/1.1/IThermal.hal b/thermal/1.1/IThermal.hal new file mode 100644 index 0000000000..14f35baa00 --- /dev/null +++ b/thermal/1.1/IThermal.hal @@ -0,0 +1,31 @@ +/* + * Copyright (C) 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. + */ + +package android.hardware.thermal@1.1; + +import android.hardware.thermal@1.0::IThermal; +import IThermalCallback; + +interface IThermal extends @1.0::IThermal { + /** + * Register an IThermalCallback, used by the Thermal HAL + * to send thermal events to the framework thermal service. + * + * @param callback the IThermalCallback to use for sending + * thermal events, or nullptr to set no callback + */ + registerThermalCallback(IThermalCallback callback); +}; diff --git a/thermal/1.1/IThermalCallback.hal b/thermal/1.1/IThermalCallback.hal new file mode 100644 index 0000000000..f418ec3dd4 --- /dev/null +++ b/thermal/1.1/IThermalCallback.hal @@ -0,0 +1,33 @@ +/* + * Copyright (C) 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. + */ + +package android.hardware.thermal@1.1; + +import android.hardware.thermal@1.0::Temperature; + +/** + * IThermalCallback connects vendor code to the framework binder ThermalService. + */ +interface IThermalCallback { + /** + * Send a thermal throttling start/stop event to all ThermalService + * thermal event listeners. + * @param isThrottling true if device is currently throttling + * @param temperature The temperature associated with the throttling + * start/stop event + */ + oneway notifyThrottling(bool isThrottling, Temperature temperature); +}; diff --git a/thermal/1.1/vts/functional/Android.bp b/thermal/1.1/vts/functional/Android.bp new file mode 100644 index 0000000000..cea5bf84a5 --- /dev/null +++ b/thermal/1.1/vts/functional/Android.bp @@ -0,0 +1,35 @@ +// +// Copyright (C) 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. +// + +cc_test { + name: "VtsHalThermalV1_1TargetTest", + defaults: ["hidl_defaults"], + srcs: ["VtsHalThermalV1_1TargetTest.cpp"], + shared_libs: [ + "liblog", + "libhidlbase", + "libhidltransport", + "libutils", + "android.hardware.thermal@1.0", + "android.hardware.thermal@1.1", + ], + static_libs: ["VtsHalHidlTargetTestBase"], + cflags: [ + "-O0", + "-g", + ], +} + diff --git a/thermal/1.1/vts/functional/VtsHalThermalV1_1TargetTest.cpp b/thermal/1.1/vts/functional/VtsHalThermalV1_1TargetTest.cpp new file mode 100644 index 0000000000..6c1599bdb2 --- /dev/null +++ b/thermal/1.1/vts/functional/VtsHalThermalV1_1TargetTest.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (C) 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. + */ + +#include +#include +#include + +#include +#include + +using ::android::hardware::thermal::V1_0::Temperature; +using ::android::hardware::thermal::V1_0::TemperatureType; +using ::android::hardware::thermal::V1_1::IThermal; +using ::android::hardware::thermal::V1_1::IThermalCallback; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +constexpr char kCallbackNameNotifyThrottling[] = "notifyThrottling"; +static const Temperature kThrottleTemp = { + .type = TemperatureType::CPU, + .name = "test temperature sensor", + .currentValue = 98.6, + .throttlingThreshold = 58, + .shutdownThreshold = 60, + .vrThrottlingThreshold = 59, +}; + +class ThermalCallbackArgs { + public: + bool isThrottling; + Temperature temperature; +}; + +// Callback class for receiving thermal event notifications from main class +class ThermalCallback + : public ::testing::VtsHalHidlTargetCallbackBase, + public IThermalCallback { + public: + virtual ~ThermalCallback() = default; + + Return notifyThrottling(bool isThrottling, + const Temperature& temperature) override { + ThermalCallbackArgs args; + args.isThrottling = isThrottling; + args.temperature = temperature; + NotifyFromCallback(kCallbackNameNotifyThrottling, args); + return Void(); + } +}; + +// The main test class for THERMAL HIDL HAL 1.1. +class ThermalHidlTest : public ::testing::VtsHalHidlTargetTestBase { + public: + virtual void SetUp() override { + mThermal = ::testing::VtsHalHidlTargetTestBase::getService(); + ASSERT_NE(mThermal, nullptr); + mThermalCallback = new(std::nothrow) ThermalCallback(); + ASSERT_NE(mThermalCallback, nullptr); + auto ret = mThermal->registerThermalCallback(mThermalCallback); + ASSERT_TRUE(ret.isOk()); + } + + virtual void TearDown() override { + auto ret = mThermal->registerThermalCallback(nullptr); + ASSERT_TRUE(ret.isOk()); + } + + protected: + sp mThermal; + sp mThermalCallback; +}; // class ThermalHidlTest + +// Test ThermalCallback::notifyThrottling(). +// This just calls into and back from our local ThermalCallback impl. +// Note: a real thermal throttling event from the Thermal HAL could be +// inadvertently received here. +TEST_F(ThermalHidlTest, NotifyThrottlingTest) { + auto ret = mThermalCallback->notifyThrottling(true, kThrottleTemp); + ASSERT_TRUE(ret.isOk()); + auto res = mThermalCallback->WaitForCallback(kCallbackNameNotifyThrottling); + EXPECT_TRUE(res.no_timeout); + ASSERT_TRUE(res.args); + EXPECT_EQ(true, res.args->isThrottling); + EXPECT_EQ(kThrottleTemp, res.args->temperature); +} + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + int status = RUN_ALL_TESTS(); + cout << "Test result = " << status << std::endl; + return status; +} diff --git a/thermal/Android.bp b/thermal/Android.bp index ed19a37034..a5415df348 100644 --- a/thermal/Android.bp +++ b/thermal/Android.bp @@ -3,4 +3,6 @@ subdirs = [ "1.0", "1.0/default", "1.0/vts/functional", + "1.1", + "1.1/vts/functional", ] From 7a998e53bca9ea4d7c70baf00bcae709aa4cc9d2 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Fri, 4 Aug 2017 16:38:23 -0700 Subject: [PATCH 124/265] Camera test statically links to dependencies. This test now statically links to HAL def libs which are not guaranteed to be on the device. Bug: 64040096 Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --skip-preconditions --module VtsHalCameraProviderV2_4Target Change-Id: Ib33fdfd45b10840cce363fcda291a62e56b1d4c8 --- camera/provider/2.4/vts/functional/Android.bp | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/camera/provider/2.4/vts/functional/Android.bp b/camera/provider/2.4/vts/functional/Android.bp index 439fe3dd67..84d76f1fbd 100644 --- a/camera/provider/2.4/vts/functional/Android.bp +++ b/camera/provider/2.4/vts/functional/Android.bp @@ -16,30 +16,27 @@ cc_test { name: "VtsHalCameraProviderV2_4TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalCameraProviderV2_4TargetTest.cpp"], + + // TODO(b/64437680): Assume these are always available on the device. shared_libs: [ - "liblog", - "libhidlbase", - "libhidltransport", - "libcutils", - "libutils", - "android.hardware.camera.provider@2.4", - "android.hardware.camera.device@3.2", - "android.hardware.camera.device@1.0", - "libcamera_metadata", "libbinder", + "libcamera_metadata", + "libfmq", "libgui", "libui", - "libfmq", ], + + // Statically link to libs not guaranteed to be present on the device. static_libs: [ - "VtsHalHidlTargetTestBase", - "libgrallocusage", + "android.hardware.camera.common@1.0", "android.hardware.camera.common@1.0-helper", - ], - cflags: [ - "-O0", - "-g", + "android.hardware.camera.device@1.0", + "android.hardware.camera.device@3.2", + "android.hardware.camera.provider@2.4", + "android.hardware.graphics.common@1.0", + "android.hardware.graphics.mapper@2.0", + "libgrallocusage", ], } From 75c2bd8d1cd76c2c9f8059daec07bb9383f0985e Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Mon, 7 Aug 2017 12:00:09 -0700 Subject: [PATCH 125/265] Add OWNERS for broadcast radio HAL 1.1. Test: not necessary Change-Id: I73881db46382276f56963c9d3a40cb0bdc1a2070 --- broadcastradio/1.1/default/OWNERS | 4 ++++ broadcastradio/1.1/tests/OWNERS | 8 ++++++++ broadcastradio/1.1/utils/OWNERS | 4 ++++ broadcastradio/1.1/vts/OWNERS | 8 ++++++++ 4 files changed, 24 insertions(+) create mode 100644 broadcastradio/1.1/default/OWNERS create mode 100644 broadcastradio/1.1/tests/OWNERS create mode 100644 broadcastradio/1.1/utils/OWNERS create mode 100644 broadcastradio/1.1/vts/OWNERS diff --git a/broadcastradio/1.1/default/OWNERS b/broadcastradio/1.1/default/OWNERS new file mode 100644 index 0000000000..0c27b71865 --- /dev/null +++ b/broadcastradio/1.1/default/OWNERS @@ -0,0 +1,4 @@ +# Automotive team +egranata@google.com +keunyoung@google.com +twasilczyk@google.com diff --git a/broadcastradio/1.1/tests/OWNERS b/broadcastradio/1.1/tests/OWNERS new file mode 100644 index 0000000000..aa5ce82e16 --- /dev/null +++ b/broadcastradio/1.1/tests/OWNERS @@ -0,0 +1,8 @@ +# Automotive team +egranata@google.com +keunyoung@google.com +twasilczyk@google.com + +# VTS team +ryanjcampbell@google.com +yim@google.com diff --git a/broadcastradio/1.1/utils/OWNERS b/broadcastradio/1.1/utils/OWNERS new file mode 100644 index 0000000000..0c27b71865 --- /dev/null +++ b/broadcastradio/1.1/utils/OWNERS @@ -0,0 +1,4 @@ +# Automotive team +egranata@google.com +keunyoung@google.com +twasilczyk@google.com diff --git a/broadcastradio/1.1/vts/OWNERS b/broadcastradio/1.1/vts/OWNERS new file mode 100644 index 0000000000..aa5ce82e16 --- /dev/null +++ b/broadcastradio/1.1/vts/OWNERS @@ -0,0 +1,8 @@ +# Automotive team +egranata@google.com +keunyoung@google.com +twasilczyk@google.com + +# VTS team +ryanjcampbell@google.com +yim@google.com From 5396b25cba4bc7b42e741d3e0c29ccba5a5fc140 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Fri, 4 Aug 2017 14:42:31 -0700 Subject: [PATCH 126/265] Media omx tests static link to dependencies. These tests now statically link to libs not guaranteed to be on the device, which include HAL definition libs. Also, remove global include paths. Bug: 64040096 Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --skip-preconditions --module VtsHalMediaOmxV1_0Host Change-Id: Iea1dc549704f61b1416357d72dc1bf26864978d4 --- media/omx/1.0/vts/functional/audio/Android.bp | 62 +++-------------- .../omx/1.0/vts/functional/common/Android.bp | 36 ++++++++-- .../1.0/vts/functional/component/Android.bp | 27 +------- .../omx/1.0/vts/functional/master/Android.bp | 24 +------ media/omx/1.0/vts/functional/video/Android.bp | 68 ++++--------------- 5 files changed, 51 insertions(+), 166 deletions(-) diff --git a/media/omx/1.0/vts/functional/audio/Android.bp b/media/omx/1.0/vts/functional/audio/Android.bp index 66fd20be2c..f517fa1d90 100644 --- a/media/omx/1.0/vts/functional/audio/Android.bp +++ b/media/omx/1.0/vts/functional/audio/Android.bp @@ -16,65 +16,19 @@ cc_test { name: "VtsHalMediaOmxV1_0TargetAudioEncTest", - defaults: ["hidl_defaults"], - srcs: ["VtsHalMediaOmxV1_0TargetAudioEncTest.cpp", - "media_audio_hidl_test_common.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidlmemory", - "libhidltransport", - "libhwbinder", - "libnativehelper", - "libutils", - "libstagefright_foundation", - "android.hidl.allocator@1.0", - "android.hidl.memory@1.0", - "android.hardware.media.omx@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase", - "VtsHalMediaOmxV1_0CommonUtil"], - cflags: [ - "-O0", - "-g", - ], - include_dirs: [ - "frameworks/native/include/media/openmax/", - "hardware/interfaces/media/omx/1.0/vts/functional/common", + defaults: ["VtsHalMediaOmxV1_0Defaults"], + srcs: [ + "VtsHalMediaOmxV1_0TargetAudioEncTest.cpp", + "media_audio_hidl_test_common.cpp" ], } cc_test { name: "VtsHalMediaOmxV1_0TargetAudioDecTest", - defaults: ["hidl_defaults"], - srcs: ["VtsHalMediaOmxV1_0TargetAudioDecTest.cpp", - "media_audio_hidl_test_common.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidlmemory", - "libhidltransport", - "libhwbinder", - "libnativehelper", - "libutils", - "libstagefright_foundation", - "android.hidl.allocator@1.0", - "android.hidl.memory@1.0", - "android.hardware.media.omx@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase", - "VtsHalMediaOmxV1_0CommonUtil"], - cflags: [ - "-O0", - "-g", - ], - include_dirs: [ - "frameworks/native/include/media/openmax/", - "hardware/interfaces/media/omx/1.0/vts/functional/common", + defaults: ["VtsHalMediaOmxV1_0Defaults"], + srcs: [ + "VtsHalMediaOmxV1_0TargetAudioDecTest.cpp", + "media_audio_hidl_test_common.cpp" ], } diff --git a/media/omx/1.0/vts/functional/common/Android.bp b/media/omx/1.0/vts/functional/common/Android.bp index 93251fe89b..af55e3a456 100755 --- a/media/omx/1.0/vts/functional/common/Android.bp +++ b/media/omx/1.0/vts/functional/common/Android.bp @@ -16,18 +16,40 @@ cc_library_static { name: "VtsHalMediaOmxV1_0CommonUtil", - defaults: ["hidl_defaults"], srcs: ["media_hidl_test_common.cpp"], - shared_libs: [ - "liblog", + + header_libs: ["media_plugin_headers"], + export_header_lib_headers: ["media_plugin_headers"], + export_include_dirs: ["."], + + static_libs: [ + "VtsHalHidlTargetTestBase", "libhidlmemory", "android.hidl.allocator@1.0", "android.hidl.memory@1.0", "android.hardware.media.omx@1.0", ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ "-O0", "-g", ], - include_dirs: [ - "frameworks/native/include/media/openmax/", +} + +cc_defaults { + name: "VtsHalMediaOmxV1_0Defaults", + defaults: ["VtsHalTargetTestDefaults"], + + // Link to these statically as they are not guaranteed to be on the device. + static_libs: [ + "VtsHalMediaOmxV1_0CommonUtil", + "android.hardware.graphics.bufferqueue@1.0", + "android.hardware.graphics.common@1.0", + "android.hardware.media.omx@1.0", + "android.hardware.media@1.0", + "android.hidl.allocator@1.0", + "android.hidl.memory@1.0", + "libhidlmemory", + "libnativehelper", + ], + + // TODO(b/64437680): Assume these libs are always available on the device. + shared_libs: [ + "libstagefright_foundation", ], } diff --git a/media/omx/1.0/vts/functional/component/Android.bp b/media/omx/1.0/vts/functional/component/Android.bp index fd3210fb91..f76b6e94fa 100644 --- a/media/omx/1.0/vts/functional/component/Android.bp +++ b/media/omx/1.0/vts/functional/component/Android.bp @@ -16,32 +16,7 @@ cc_test { name: "VtsHalMediaOmxV1_0TargetComponentTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalMediaOmxV1_0Defaults"], srcs: ["VtsHalMediaOmxV1_0TargetComponentTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidlmemory", - "libhidltransport", - "libhwbinder", - "libnativehelper", - "libutils", - "libstagefright_foundation", - "android.hidl.allocator@1.0", - "android.hidl.memory@1.0", - "android.hardware.media.omx@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase", - "VtsHalMediaOmxV1_0CommonUtil"], - cflags: [ - "-O0", - "-g", - ], - include_dirs: [ - "frameworks/native/include/media/openmax/", - "hardware/interfaces/media/omx/1.0/vts/functional/common", - ], } diff --git a/media/omx/1.0/vts/functional/master/Android.bp b/media/omx/1.0/vts/functional/master/Android.bp index e24b79b8a9..4a45e6923c 100644 --- a/media/omx/1.0/vts/functional/master/Android.bp +++ b/media/omx/1.0/vts/functional/master/Android.bp @@ -16,29 +16,7 @@ cc_test { name: "VtsHalMediaOmxV1_0TargetMasterTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalMediaOmxV1_0Defaults"], srcs: ["VtsHalMediaOmxV1_0TargetMasterTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libhwbinder", - "libnativehelper", - "libutils", - "android.hidl.allocator@1.0", - "android.hidl.memory@1.0", - "android.hardware.media.omx@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], - include_dirs: [ - "frameworks/native/include/media/openmax/", - "hardware/interfaces/media/omx/1.0/vts/functional/common", - ], } diff --git a/media/omx/1.0/vts/functional/video/Android.bp b/media/omx/1.0/vts/functional/video/Android.bp index 4e94f3b35b..e251a15ba4 100644 --- a/media/omx/1.0/vts/functional/video/Android.bp +++ b/media/omx/1.0/vts/functional/video/Android.bp @@ -16,70 +16,26 @@ cc_test { name: "VtsHalMediaOmxV1_0TargetVideoDecTest", - defaults: ["hidl_defaults"], - srcs: ["VtsHalMediaOmxV1_0TargetVideoDecTest.cpp", - "media_video_hidl_test_common.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidlmemory", - "libhidltransport", - "libhwbinder", - "libnativehelper", - "libutils", - "libstagefright_foundation", - "android.hidl.allocator@1.0", - "android.hidl.memory@1.0", - "android.hardware.media.omx@1.0", + defaults: ["VtsHalMediaOmxV1_0Defaults"], + srcs: [ + "VtsHalMediaOmxV1_0TargetVideoDecTest.cpp", + "media_video_hidl_test_common.cpp" + ], + static_libs: [ "android.hardware.graphics.allocator@2.0", "android.hardware.graphics.mapper@2.0", - "android.hardware.graphics.common@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase", - "VtsHalMediaOmxV1_0CommonUtil"], - cflags: [ - "-O0", - "-g", - ], - include_dirs: [ - "frameworks/native/include/media/openmax/", - "hardware/interfaces/media/omx/1.0/vts/functional/common", ], } cc_test { name: "VtsHalMediaOmxV1_0TargetVideoEncTest", - defaults: ["hidl_defaults"], - srcs: ["VtsHalMediaOmxV1_0TargetVideoEncTest.cpp", - "media_video_hidl_test_common.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidlmemory", - "libhidltransport", - "libhwbinder", - "libnativehelper", + defaults: ["VtsHalMediaOmxV1_0Defaults"], + srcs: [ + "VtsHalMediaOmxV1_0TargetVideoEncTest.cpp", + "media_video_hidl_test_common.cpp" + ], + static_libs: [ "libnativewindow", - "libutils", - "libstagefright_foundation", - "android.hidl.allocator@1.0", - "android.hidl.memory@1.0", - "android.hardware.media.omx@1.0", - "android.hardware.graphics.bufferqueue@1.0", "android.hardware.graphics.mapper@2.0", ], - static_libs: ["VtsHalHidlTargetTestBase", - "VtsHalMediaOmxV1_0CommonUtil"], - cflags: [ - "-O0", - "-g", - ], - include_dirs: [ - "frameworks/native/include/media/openmax/", - "hardware/interfaces/media/omx/1.0/vts/functional/common", - ], } From 111848cbd04da2b34cec2ffc1ab3452f8431b2db Mon Sep 17 00:00:00 2001 From: Edwin Wong Date: Tue, 8 Aug 2017 15:31:30 -0700 Subject: [PATCH 127/265] Add test for additional ClearKey UUID. Test for both ClearKey plugin UUIDs in DrmHalClearkeyFactoryTest. Test: VTS - VtsHalDrmV1_0TargetTest bug: 64386897 Change-Id: Id7f140518910a87efdf9eaa19ce16113e206264f --- drm/1.0/vts/functional/drm_hal_clearkey_test.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp b/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp index 556451374e..3966eac15b 100644 --- a/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp +++ b/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp @@ -76,9 +76,12 @@ using std::vector; #define ASSERT_OK(ret) ASSERT_TRUE(ret.isOk()) #define EXPECT_OK(ret) EXPECT_TRUE(ret.isOk()) -static const uint8_t kClearKeyUUID[16] = { - 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, - 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B}; +static const uint8_t kCommonPsshBoxUUID[16] = {0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, + 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B}; + +// To be used in mpd to specify drm scheme for players +static const uint8_t kClearKeyUUID[16] = {0xE2, 0x71, 0x9D, 0x58, 0xA9, 0x85, 0xB3, 0xC9, + 0x78, 0x1A, 0xB0, 0x30, 0xAF, 0x78, 0xD3, 0x0E}; static const uint8_t kInvalidUUID[16] = { 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, @@ -111,6 +114,9 @@ class DrmHalClearkeyFactoryTest : public ::testing::VtsHalHidlTargetTestBase { * Ensure the factory supports the clearkey scheme UUID */ TEST_F(DrmHalClearkeyFactoryTest, ClearKeyPluginSupported) { + EXPECT_TRUE(drmFactory->isCryptoSchemeSupported(kCommonPsshBoxUUID)); + EXPECT_TRUE(cryptoFactory->isCryptoSchemeSupported(kCommonPsshBoxUUID)); + EXPECT_TRUE(drmFactory->isCryptoSchemeSupported(kClearKeyUUID)); EXPECT_TRUE(cryptoFactory->isCryptoSchemeSupported(kClearKeyUUID)); } From 03253b48c94da6dd5e2d194aee2c2d927a50ae24 Mon Sep 17 00:00:00 2001 From: Jeff Vander Stoep Date: Thu, 6 Jul 2017 22:29:12 -0700 Subject: [PATCH 128/265] configstore: sandbox with seccomp filter Configstore HAL is accessible to third party apps and thus requires a tight sandbox that reflects the limited system access this HAL needs. We use two primary mechanisms to sandbox configstore, selinux and seccomp, with the goal of restricting its access to userspace and the kernel. The addition of a seccomp filter is primarily aimed at reducing the kernel's attack surface that is reachable by configstore HAL. Seccomp filters are architecture dependent, so filters need to be added for each architecture. This change adds a seccomp filter for arm64 and issues a non-fatal runtime warning for other architectures which still require a seccomp filter. Bug: 36453956 Test: boot Marlin and Angler. Verify that configstore is not aborting due to seccomp violations. Test: "cat proc//status | grep seccomp " returns: seccomp: 2 Which indicates that configstore is using seccomp-bpf. Change-Id: Iab014ff357b7329085a5e18a92f51838d2c72371 (cherry picked from commit ed95043d6433c5900984f24dbb101bba78109775) --- configstore/1.1/default/Android.mk | 12 +++++ .../configstore@1.1-arm64.policy | 40 +++++++++++++++++ configstore/1.1/default/service.cpp | 4 ++ minijail/Android.mk | 14 ++++++ minijail/HardwareMinijail.cpp | 45 +++++++++++++++++++ .../include/hwminijail/HardwareMinijail.h | 30 +++++++++++++ 6 files changed, 145 insertions(+) create mode 100644 configstore/1.1/default/seccomp_policy/configstore@1.1-arm64.policy create mode 100644 minijail/Android.mk create mode 100644 minijail/HardwareMinijail.cpp create mode 100644 minijail/include/hwminijail/HardwareMinijail.h diff --git a/configstore/1.1/default/Android.mk b/configstore/1.1/default/Android.mk index ac3d8b039d..58b67c1525 100644 --- a/configstore/1.1/default/Android.mk +++ b/configstore/1.1/default/Android.mk @@ -3,6 +3,7 @@ LOCAL_PATH := $(call my-dir) ################################################################################ include $(CLEAR_VARS) LOCAL_MODULE := android.hardware.configstore@1.1-service +LOCAL_REQUIRED_MODULES_arm64 := configstore@1.1.policy LOCAL_PROPRIETARY_MODULE := true LOCAL_MODULE_CLASS := EXECUTABLES LOCAL_MODULE_RELATIVE_PATH := hw @@ -17,7 +18,18 @@ LOCAL_SHARED_LIBRARIES := \ libhidlbase \ libhidltransport \ libbase \ + libhwminijail \ liblog \ libutils \ include $(BUILD_EXECUTABLE) + +# seccomp filter for configstore +ifeq ($(TARGET_ARCH), $(filter $(TARGET_ARCH), arm64)) +include $(CLEAR_VARS) +LOCAL_MODULE := configstore@1.1.policy +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/etc/seccomp_policy +LOCAL_SRC_FILES := seccomp_policy/configstore@1.1-$(TARGET_ARCH).policy +include $(BUILD_PREBUILT) +endif diff --git a/configstore/1.1/default/seccomp_policy/configstore@1.1-arm64.policy b/configstore/1.1/default/seccomp_policy/configstore@1.1-arm64.policy new file mode 100644 index 0000000000..8c901eb8de --- /dev/null +++ b/configstore/1.1/default/seccomp_policy/configstore@1.1-arm64.policy @@ -0,0 +1,40 @@ +# Copyright (C) 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. + +futex: 1 +# ioctl: arg1 == BINDER_WRITE_READ +ioctl: arg1 == 0xc0306201 +ioctl: 1 +# prctl: arg0 == PR_SET_NAME || arg0 == PR_SET_VMA || arg0 == PR_SET_TIMERSLACK +prctl: arg0 == 15 || arg0 == 0x53564d41 || arg0 == 29 +openat: 1 +mmap: 1 +mprotect: 1 +close: 1 +getuid: 1 +read: 1 +faccessat: 1 +write: 1 +fstat: 1 +clone: 1 +munmap: 1 +lseek: 1 +sigaltstack: 1 +writev: 1 +setpriority: 1 +restart_syscall: 1 +exit: 1 +exit_group: 1 +rt_sigreturn: 1 +getrlimit: 1 diff --git a/configstore/1.1/default/service.cpp b/configstore/1.1/default/service.cpp index 52db025107..535e0cdd96 100644 --- a/configstore/1.1/default/service.cpp +++ b/configstore/1.1/default/service.cpp @@ -18,6 +18,7 @@ #include #include +#include #include "SurfaceFlingerConfigs.h" @@ -25,6 +26,7 @@ using android::hardware::configureRpcThreadpool; using android::hardware::joinRpcThreadpool; using android::hardware::configstore::V1_1::ISurfaceFlingerConfigs; using android::hardware::configstore::V1_1::implementation::SurfaceFlingerConfigs; +using android::hardware::SetupMinijail; using android::sp; using android::status_t; using android::OK; @@ -32,6 +34,8 @@ using android::OK; int main() { configureRpcThreadpool(10, true); + SetupMinijail("/vendor/etc/seccomp_policy/configstore@1.1.policy"); + sp surfaceFlingerConfigs = new SurfaceFlingerConfigs; status_t status = surfaceFlingerConfigs->registerAsService(); LOG_ALWAYS_FATAL_IF(status != OK, "Could not register ISurfaceFlingerConfigs"); diff --git a/minijail/Android.mk b/minijail/Android.mk new file mode 100644 index 0000000000..272bb0ef1f --- /dev/null +++ b/minijail/Android.mk @@ -0,0 +1,14 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE := libhwminijail +LOCAL_PROPRIETARY_MODULE := true +LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include +LOCAL_C_INCLUDES := $(LOCAL_PATH)/include +LOCAL_SRC_FILES := HardwareMinijail.cpp + +LOCAL_SHARED_LIBRARIES := \ + libbase \ + libminijail_vendor + +include $(BUILD_SHARED_LIBRARY) diff --git a/minijail/HardwareMinijail.cpp b/minijail/HardwareMinijail.cpp new file mode 100644 index 0000000000..e6b11440c6 --- /dev/null +++ b/minijail/HardwareMinijail.cpp @@ -0,0 +1,45 @@ +// +// Copyright (C) 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. +// + +#include +#include + +#include + +namespace android { +namespace hardware { + +void SetupMinijail(const std::string& seccomp_policy_path) { + if (access(seccomp_policy_path.c_str(), R_OK) == -1) { + LOG(WARNING) << "Could not find seccomp policy file at: " << seccomp_policy_path; + return; + } + + struct minijail* jail = minijail_new(); + if (jail == NULL) { + LOG(FATAL) << "Failed to create minijail."; + } + + minijail_no_new_privs(jail); + minijail_log_seccomp_filter_failures(jail); + minijail_use_seccomp_filter(jail); + minijail_parse_seccomp_filters(jail, seccomp_policy_path.c_str()); + minijail_enter(jail); + minijail_destroy(jail); +} + +} // namespace hardware +} // namespace android diff --git a/minijail/include/hwminijail/HardwareMinijail.h b/minijail/include/hwminijail/HardwareMinijail.h new file mode 100644 index 0000000000..8fcf007bfb --- /dev/null +++ b/minijail/include/hwminijail/HardwareMinijail.h @@ -0,0 +1,30 @@ +// +// Copyright (C) 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. +// + +#ifndef ANDROID_HARDWARE_CONFIGSTORE_MINIJAIL_H +#define ANDROID_HARDWARE_CONFIGSTORE_MINIJAIL_H + +#include + +namespace android { +namespace hardware { + +void SetupMinijail(const std::string& seccomp_policy_path); + +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_CONFIGSTORE_UTILS_H From 0c2ce357b11bc18e0c1ff775968ea3179ae38a8b Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Thu, 3 Aug 2017 16:37:47 -0700 Subject: [PATCH 129/265] VTS tests now static link to HAL def libs. #2 And use VtsHalTargetTestDefaults. Bug: 64040096 Test: crop out all non-affected tests from vts-hal-hidl.xml and run vts-tradefed run commandAndExit vts-hal-hidl --skip-all-system-status-check --skip-preconditions 2 failures, same as without this change: GatekeeperHidlTest.DeleteAllUsersTest GatekeeperHidlTest.DeleteUserTest Change-Id: I8f6995e9536a9aefe283ee3effec9f5a7f03b620 --- .../fingerprint/2.1/vts/functional/Android.bp | 17 ++-------------- boot/1.0/vts/functional/Android.bp | 17 ++-------------- broadcastradio/1.0/vts/functional/Android.bp | 18 ++--------------- broadcastradio/1.1/vts/functional/Android.bp | 19 ++---------------- configstore/1.0/vts/functional/Android.bp | 15 ++------------ configstore/1.1/vts/functional/Android.bp | 14 +++---------- contexthub/1.0/vts/functional/Android.bp | 15 ++------------ dumpstate/1.0/vts/functional/Android.bp | 15 ++------------ gatekeeper/1.0/vts/functional/Android.bp | 18 ++--------------- gnss/1.0/vts/functional/Android.bp | 20 +++---------------- health/1.0/vts/functional/Android.bp | 14 ++----------- light/2.0/vts/functional/Android.bp | 15 ++------------ memtrack/1.0/vts/functional/Android.bp | 17 ++-------------- oemlock/1.0/vts/functional/Android.bp | 18 ++--------------- power/1.0/vts/functional/Android.bp | 18 ++--------------- power/1.1/vts/functional/Android.bp | 15 +++----------- sensors/1.0/vts/functional/Android.bp | 15 ++------------ soundtrigger/2.0/vts/functional/Android.bp | 18 ++--------------- thermal/1.0/vts/functional/Android.bp | 18 ++--------------- tv/input/1.0/vts/functional/Android.bp | 18 ++--------------- usb/1.0/vts/functional/Android.bp | 18 ++--------------- usb/1.1/vts/functional/Android.bp | 16 ++------------- vibrator/1.0/vts/functional/Android.bp | 15 ++------------ vibrator/1.1/vts/functional/Android.bp | 14 +++---------- vr/1.0/vts/functional/Android.bp | 14 ++----------- weaver/1.0/vts/functional/Android.bp | 18 ++--------------- wifi/1.1/vts/functional/Android.bp | 17 +++------------- wifi/offload/1.0/vts/functional/Android.bp | 18 ++--------------- 28 files changed, 61 insertions(+), 403 deletions(-) diff --git a/biometrics/fingerprint/2.1/vts/functional/Android.bp b/biometrics/fingerprint/2.1/vts/functional/Android.bp index 27b71577ab..bee3657eca 100644 --- a/biometrics/fingerprint/2.1/vts/functional/Android.bp +++ b/biometrics/fingerprint/2.1/vts/functional/Android.bp @@ -16,21 +16,8 @@ cc_test { name: "VtsHalBiometricsFingerprintV2_1TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalBiometricsFingerprintV2_1TargetTest.cpp"], - shared_libs: [ - "libbase", - "libhidltransport", - "libhardware", - "libhidlbase", - "liblog", - "libutils", - "android.hardware.biometrics.fingerprint@2.1", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] + static_libs: ["android.hardware.biometrics.fingerprint@2.1"], } diff --git a/boot/1.0/vts/functional/Android.bp b/boot/1.0/vts/functional/Android.bp index 5b14f54dd7..2ef89f3aab 100644 --- a/boot/1.0/vts/functional/Android.bp +++ b/boot/1.0/vts/functional/Android.bp @@ -16,20 +16,7 @@ cc_test { name: "VtsHalBootV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalBootV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libnativehelper", - "libutils", - "android.hardware.boot@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] + static_libs: ["android.hardware.boot@1.0"], } diff --git a/broadcastradio/1.0/vts/functional/Android.bp b/broadcastradio/1.0/vts/functional/Android.bp index cf52f497aa..f31a2dcf8c 100644 --- a/broadcastradio/1.0/vts/functional/Android.bp +++ b/broadcastradio/1.0/vts/functional/Android.bp @@ -16,21 +16,7 @@ cc_test { name: "VtsHalBroadcastradioV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalBroadcastradioV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", - "android.hardware.broadcastradio@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], + static_libs: ["android.hardware.broadcastradio@1.0"], } diff --git a/broadcastradio/1.1/vts/functional/Android.bp b/broadcastradio/1.1/vts/functional/Android.bp index 6e5c84cde1..4b93cbcf1f 100644 --- a/broadcastradio/1.1/vts/functional/Android.bp +++ b/broadcastradio/1.1/vts/functional/Android.bp @@ -16,28 +16,13 @@ cc_test { name: "VtsHalBroadcastradioV1_1TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalBroadcastradioV1_1TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", + static_libs: [ "android.hardware.broadcastradio@1.0", "android.hardware.broadcastradio@1.1", - ], - static_libs: [ - "VtsHalHidlTargetTestBase", "android.hardware.broadcastradio@1.1-utils-lib", "android.hardware.broadcastradio@1.1-vts-utils-lib", "libgmock", ], - cflags: [ - "-Wextra", - "-O0", - "-g", - ], } diff --git a/configstore/1.0/vts/functional/Android.bp b/configstore/1.0/vts/functional/Android.bp index 17755389d2..1b8a591398 100644 --- a/configstore/1.0/vts/functional/Android.bp +++ b/configstore/1.0/vts/functional/Android.bp @@ -16,19 +16,8 @@ cc_test { name: "VtsHalConfigstoreV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalConfigstoreV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "libhidlbase", - "liblog", - "libutils", - "android.hardware.configstore@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] + static_libs: ["android.hardware.configstore@1.0"], } diff --git a/configstore/1.1/vts/functional/Android.bp b/configstore/1.1/vts/functional/Android.bp index 5cfa4839d9..59beb09caa 100644 --- a/configstore/1.1/vts/functional/Android.bp +++ b/configstore/1.1/vts/functional/Android.bp @@ -16,19 +16,11 @@ cc_test { name: "VtsHalConfigstoreV1_1TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalConfigstoreV1_1TargetTest.cpp"], - shared_libs: [ - "libbase", - "libhidlbase", - "liblog", - "libutils", + static_libs: [ + "android.hardware.configstore@1.0", "android.hardware.configstore@1.1", ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] } diff --git a/contexthub/1.0/vts/functional/Android.bp b/contexthub/1.0/vts/functional/Android.bp index c35386d1c3..7c6e8c73b5 100644 --- a/contexthub/1.0/vts/functional/Android.bp +++ b/contexthub/1.0/vts/functional/Android.bp @@ -16,19 +16,8 @@ cc_test { name: "VtsHalContexthubV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalContexthubV1_0TargetTest.cpp"], - shared_libs: [ - "liblog", - "libhidlbase", - "libhidltransport", - "libutils", - "android.hardware.contexthub@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] + static_libs: ["android.hardware.contexthub@1.0"], } diff --git a/dumpstate/1.0/vts/functional/Android.bp b/dumpstate/1.0/vts/functional/Android.bp index a1c735b1e4..1ab530fec4 100644 --- a/dumpstate/1.0/vts/functional/Android.bp +++ b/dumpstate/1.0/vts/functional/Android.bp @@ -15,18 +15,7 @@ cc_test { name: "VtsHalDumpstateV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalDumpstateV1_0TargetTest.cpp"], - shared_libs: [ - "android.hardware.dumpstate@1.0", - "libcutils", - "libhidlbase", - "liblog", - "libutils", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] + static_libs: ["android.hardware.dumpstate@1.0"], } diff --git a/gatekeeper/1.0/vts/functional/Android.bp b/gatekeeper/1.0/vts/functional/Android.bp index 70cb615835..aa1da7bb40 100644 --- a/gatekeeper/1.0/vts/functional/Android.bp +++ b/gatekeeper/1.0/vts/functional/Android.bp @@ -16,21 +16,7 @@ cc_test { name: "VtsHalGatekeeperV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalGatekeeperV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", - "android.hardware.gatekeeper@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] + static_libs: ["android.hardware.gatekeeper@1.0"], } diff --git a/gnss/1.0/vts/functional/Android.bp b/gnss/1.0/vts/functional/Android.bp index 6d9605962f..d7713dbc23 100644 --- a/gnss/1.0/vts/functional/Android.bp +++ b/gnss/1.0/vts/functional/Android.bp @@ -16,21 +16,7 @@ cc_test { name: "VtsHalGnssV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalGnssV1_0TargetTest.cpp"], - shared_libs: [ - "android.hardware.gnss@1.0", - "libbase", - "libcutils", - "libhidlbase", - "libhidltransport", - "liblog", - "libnativehelper", - "libutils", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], -} \ No newline at end of file + static_libs: ["android.hardware.gnss@1.0"], +} diff --git a/health/1.0/vts/functional/Android.bp b/health/1.0/vts/functional/Android.bp index 1a4c8c830d..8742651ba6 100644 --- a/health/1.0/vts/functional/Android.bp +++ b/health/1.0/vts/functional/Android.bp @@ -16,17 +16,7 @@ cc_test { name: "VtsHalHealthV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalHealthV1_0TargetTest.cpp"], - shared_libs: [ - "libhidlbase", - "liblog", - "libutils", - "android.hardware.health@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] + static_libs: ["android.hardware.health@1.0"], } diff --git a/light/2.0/vts/functional/Android.bp b/light/2.0/vts/functional/Android.bp index 0558ff2755..e0ec4cf1c2 100644 --- a/light/2.0/vts/functional/Android.bp +++ b/light/2.0/vts/functional/Android.bp @@ -16,19 +16,8 @@ cc_test { name: "VtsHalLightV2_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalLightV2_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "libhidlbase", - "liblog", - "libutils", - "android.hardware.light@2.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] + static_libs: ["android.hardware.light@2.0"], } diff --git a/memtrack/1.0/vts/functional/Android.bp b/memtrack/1.0/vts/functional/Android.bp index 71e61114f7..2d833e7623 100644 --- a/memtrack/1.0/vts/functional/Android.bp +++ b/memtrack/1.0/vts/functional/Android.bp @@ -16,20 +16,7 @@ cc_test { name: "VtsHalMemtrackV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalMemtrackV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhardware", - "libhidlbase", - "libutils", - "android.hardware.memtrack@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] + static_libs: ["android.hardware.memtrack@1.0"], } diff --git a/oemlock/1.0/vts/functional/Android.bp b/oemlock/1.0/vts/functional/Android.bp index a13b3dc71d..20737a1808 100644 --- a/oemlock/1.0/vts/functional/Android.bp +++ b/oemlock/1.0/vts/functional/Android.bp @@ -16,21 +16,7 @@ cc_test { name: "VtsHalOemLockV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalOemLockV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", - "android.hardware.oemlock@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], + static_libs: ["android.hardware.oemlock@1.0"], } diff --git a/power/1.0/vts/functional/Android.bp b/power/1.0/vts/functional/Android.bp index 5ab1eb4c94..45f74fc795 100644 --- a/power/1.0/vts/functional/Android.bp +++ b/power/1.0/vts/functional/Android.bp @@ -16,21 +16,7 @@ cc_test { name: "VtsHalPowerV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalPowerV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", - "android.hardware.power@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] + static_libs: ["android.hardware.power@1.0"], } diff --git a/power/1.1/vts/functional/Android.bp b/power/1.1/vts/functional/Android.bp index f886bd2c08..604cd36eef 100644 --- a/power/1.1/vts/functional/Android.bp +++ b/power/1.1/vts/functional/Android.bp @@ -16,19 +16,10 @@ cc_test { name: "VtsHalPowerV1_1TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalPowerV1_1TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libhidlbase", - "libhidltransport", - "libutils", + static_libs: [ + "android.hardware.power@1.0", "android.hardware.power@1.1", ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] } diff --git a/sensors/1.0/vts/functional/Android.bp b/sensors/1.0/vts/functional/Android.bp index af149ba049..a49307da1d 100644 --- a/sensors/1.0/vts/functional/Android.bp +++ b/sensors/1.0/vts/functional/Android.bp @@ -16,19 +16,8 @@ cc_test { name: "VtsHalSensorsV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalSensorsV1_0TargetTest.cpp"], - shared_libs: [ - "android.hardware.sensors@1.0", - "libcutils", - "libhidlbase", - "liblog", - "libutils", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], + static_libs: ["android.hardware.sensors@1.0"], } diff --git a/soundtrigger/2.0/vts/functional/Android.bp b/soundtrigger/2.0/vts/functional/Android.bp index 8f0cc4eb14..be6b3a802d 100644 --- a/soundtrigger/2.0/vts/functional/Android.bp +++ b/soundtrigger/2.0/vts/functional/Android.bp @@ -16,21 +16,7 @@ cc_test { name: "VtsHalSoundtriggerV2_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalSoundtriggerV2_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", - "android.hardware.soundtrigger@2.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], + static_libs: ["android.hardware.soundtrigger@2.0"], } diff --git a/thermal/1.0/vts/functional/Android.bp b/thermal/1.0/vts/functional/Android.bp index 9046882166..f661f1e1d3 100644 --- a/thermal/1.0/vts/functional/Android.bp +++ b/thermal/1.0/vts/functional/Android.bp @@ -16,22 +16,8 @@ cc_test { name: "VtsHalThermalV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalThermalV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", - "android.hardware.thermal@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], + static_libs: ["android.hardware.thermal@1.0"], } diff --git a/tv/input/1.0/vts/functional/Android.bp b/tv/input/1.0/vts/functional/Android.bp index c86242978a..978830c41d 100644 --- a/tv/input/1.0/vts/functional/Android.bp +++ b/tv/input/1.0/vts/functional/Android.bp @@ -16,22 +16,8 @@ cc_test { name: "VtsHalTvInputV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalTvInputV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", - "android.hardware.tv.input@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] + static_libs: ["android.hardware.tv.input@1.0"], } diff --git a/usb/1.0/vts/functional/Android.bp b/usb/1.0/vts/functional/Android.bp index 7438bc74fa..96d3c0efab 100644 --- a/usb/1.0/vts/functional/Android.bp +++ b/usb/1.0/vts/functional/Android.bp @@ -16,21 +16,7 @@ cc_test { name: "VtsHalUsbV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalUsbV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", - "android.hardware.usb@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], + static_libs: ["android.hardware.usb@1.0"], } diff --git a/usb/1.1/vts/functional/Android.bp b/usb/1.1/vts/functional/Android.bp index 820f794bfc..4bb3203695 100644 --- a/usb/1.1/vts/functional/Android.bp +++ b/usb/1.1/vts/functional/Android.bp @@ -16,23 +16,11 @@ cc_test { name: "VtsHalUsbV1_1TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalUsbV1_1TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", + static_libs: [ "android.hardware.usb@1.0", "android.hardware.usb@1.1", ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], } diff --git a/vibrator/1.0/vts/functional/Android.bp b/vibrator/1.0/vts/functional/Android.bp index 9e25def1a6..016d627bf2 100644 --- a/vibrator/1.0/vts/functional/Android.bp +++ b/vibrator/1.0/vts/functional/Android.bp @@ -16,19 +16,8 @@ cc_test { name: "VtsHalVibratorV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalVibratorV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "libhidlbase", - "liblog", - "libutils", - "android.hardware.vibrator@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], + static_libs: ["android.hardware.vibrator@1.0"], } diff --git a/vibrator/1.1/vts/functional/Android.bp b/vibrator/1.1/vts/functional/Android.bp index 5baa8ed74a..4f6454b6c1 100644 --- a/vibrator/1.1/vts/functional/Android.bp +++ b/vibrator/1.1/vts/functional/Android.bp @@ -16,19 +16,11 @@ cc_test { name: "VtsHalVibratorV1_1TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalVibratorV1_1TargetTest.cpp"], - shared_libs: [ - "libbase", - "libhidlbase", - "liblog", - "libutils", + static_libs: [ + "android.hardware.vibrator@1.0", "android.hardware.vibrator@1.1", ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], } diff --git a/vr/1.0/vts/functional/Android.bp b/vr/1.0/vts/functional/Android.bp index 5d5a99a1cc..40291377da 100644 --- a/vr/1.0/vts/functional/Android.bp +++ b/vr/1.0/vts/functional/Android.bp @@ -16,17 +16,7 @@ cc_test { name: "VtsHalVrV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalVrV1_0TargetTest.cpp"], - shared_libs: [ - "liblog", - "libhidlbase", - "libutils", - "android.hardware.vr@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] + static_libs: ["android.hardware.vr@1.0"], } diff --git a/weaver/1.0/vts/functional/Android.bp b/weaver/1.0/vts/functional/Android.bp index 9b0ff6df31..0089d89053 100644 --- a/weaver/1.0/vts/functional/Android.bp +++ b/weaver/1.0/vts/functional/Android.bp @@ -16,21 +16,7 @@ cc_test { name: "VtsHalWeaverV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalWeaverV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", - "android.hardware.weaver@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], + static_libs: ["android.hardware.weaver@1.0"], } diff --git a/wifi/1.1/vts/functional/Android.bp b/wifi/1.1/vts/functional/Android.bp index 6b0baf7851..1b0c12d68b 100644 --- a/wifi/1.1/vts/functional/Android.bp +++ b/wifi/1.1/vts/functional/Android.bp @@ -16,24 +16,13 @@ cc_test { name: "VtsHalWifiV1_1TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: [ "VtsHalWifiV1_1TargetTest.cpp", "wifi_chip_hidl_test.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", + static_libs: [ + "VtsHalWifiV1_0TargetTestUtil", "android.hardware.wifi@1.0", "android.hardware.wifi@1.1", ], - static_libs: ["VtsHalWifiV1_0TargetTestUtil", "VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], } diff --git a/wifi/offload/1.0/vts/functional/Android.bp b/wifi/offload/1.0/vts/functional/Android.bp index f907a89559..140e45e2d3 100644 --- a/wifi/offload/1.0/vts/functional/Android.bp +++ b/wifi/offload/1.0/vts/functional/Android.bp @@ -16,21 +16,7 @@ cc_test { name: "VtsHalWifiOffloadV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalWifiOffloadV1_0TargetTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", - "android.hardware.wifi.offload@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], + static_libs: ["android.hardware.wifi.offload@1.0"], } From 0631f8ea9a1480ceeab7e6c99b3983db0edaeb07 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Fri, 4 Aug 2017 13:01:48 -0700 Subject: [PATCH 130/265] Keymaster test statically links to dependencies. This test now statically links to libs not guaranteed to be on the device. Bug: 64040096 Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --skip-preconditions --module VtsHalKeymasterV3_0Target Change-Id: I6a7b8c116153f18f61a71e5b5bef98343a4de43b --- keymaster/3.0/vts/functional/Android.bp | 32 ++++++++++++++++++++ keymaster/3.0/vts/functional/Android.mk | 39 ------------------------- keymaster/Android.bp | 1 + 3 files changed, 33 insertions(+), 39 deletions(-) create mode 100644 keymaster/3.0/vts/functional/Android.bp delete mode 100644 keymaster/3.0/vts/functional/Android.mk diff --git a/keymaster/3.0/vts/functional/Android.bp b/keymaster/3.0/vts/functional/Android.bp new file mode 100644 index 0000000000..7d96704f2e --- /dev/null +++ b/keymaster/3.0/vts/functional/Android.bp @@ -0,0 +1,32 @@ +// +// Copyright (C) 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. +// + +cc_test { + name: "VtsHalKeymasterV3_0TargetTest", + defaults: ["VtsHalTargetTestDefaults"], + srcs: [ + "authorization_set.cpp", + "attestation_record.cpp", + "key_param_output.cpp", + "keymaster_hidl_hal_test.cpp", + "keystore_tags_utils.cpp", + ], + static_libs: [ + "android.hardware.keymaster@3.0", + "libcrypto", + "libsoftkeymasterdevice", + ], +} diff --git a/keymaster/3.0/vts/functional/Android.mk b/keymaster/3.0/vts/functional/Android.mk deleted file mode 100644 index 40986640d4..0000000000 --- a/keymaster/3.0/vts/functional/Android.mk +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (C) 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. - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := VtsHalKeymasterV3_0TargetTest -LOCAL_SRC_FILES := \ - authorization_set.cpp \ - attestation_record.cpp \ - key_param_output.cpp \ - keymaster_hidl_hal_test.cpp \ - keystore_tags_utils.cpp \ - -LOCAL_SHARED_LIBRARIES := \ - android.hardware.keymaster@3.0 \ - libcrypto \ - libhidlbase \ - liblog \ - libsoftkeymasterdevice \ - libutils \ - -LOCAL_STATIC_LIBRARIES := \ - VtsHalHidlTargetTestBase \ - -LOCAL_CFLAGS := -Wall -Werror - -include $(BUILD_NATIVE_TEST) diff --git a/keymaster/Android.bp b/keymaster/Android.bp index 09b8cb28d3..90a01955f3 100644 --- a/keymaster/Android.bp +++ b/keymaster/Android.bp @@ -1,4 +1,5 @@ // This is an autogenerated file, do not edit. subdirs = [ "3.0", + "3.0/vts/functional", ] From 8ac1971678999c46338d751fdaec16c2e4bd78cb Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Thu, 10 Aug 2017 15:15:06 -0700 Subject: [PATCH 131/265] Updating all makefiles. Bug: 64487114 Test: none Merged-In: I8608c8f636c35f21e4246a805a9eff6d14124e0a Change-Id: I2fa89b6661c39859ec4fb62c4bb0a05a35e645f0 --- automotive/vehicle/2.0/Android.mk | 974 +------- automotive/vehicle/2.1/Android.mk | 361 +-- biometrics/fingerprint/2.1/Android.mk | 233 +- bluetooth/1.0/Android.mk | 81 - boot/1.0/Android.mk | 77 - camera/common/1.0/Android.mk | 185 +- camera/metadata/3.2/Android.mk | 1230 +--------- configstore/1.0/Android.mk | 153 -- configstore/1.1/Android.mk | 38 +- contexthub/1.0/Android.mk | 328 +-- gatekeeper/1.0/Android.mk | 77 +- gnss/1.0/Android.mk | 524 +---- graphics/common/1.0/Android.mk | 147 +- health/1.0/Android.mk | 134 +- ir/1.0/Android.mk | 58 - light/2.0/Android.mk | 134 +- memtrack/1.0/Android.mk | 115 +- nfc/1.0/Android.mk | 100 - oemlock/1.0/Android.mk | 77 +- power/1.0/Android.mk | 134 +- power/1.1/Android.mk | 78 +- radio/1.0/Android.mk | 3055 ------------------------- radio/1.1/Android.mk | 386 ---- radio/deprecated/1.0/Android.mk | 80 - tests/baz/1.0/Android.mk | 98 - tests/expression/1.0/Android.mk | 58 - tests/extension/light/2.0/Android.mk | 97 +- tests/hash/1.0/Android.mk | 37 - tests/inheritance/1.0/Android.mk | 104 - tests/libhwbinder/1.0/Android.mk | 56 - tests/multithread/1.0/Android.mk | 37 - tetheroffload/control/1.0/Android.mk | 136 -- thermal/1.0/Android.mk | 172 +- thermal/1.1/Android.bp | 5 +- thermal/1.1/Android.mk | 59 +- tv/cec/1.0/Android.mk | 290 +-- usb/1.0/Android.mk | 195 +- usb/1.1/Android.mk | 97 +- vibrator/1.0/Android.mk | 96 +- vibrator/1.1/Android.mk | 59 +- vr/1.0/Android.mk | 37 +- weaver/1.0/Android.mk | 115 +- wifi/1.0/Android.mk | 1881 --------------- wifi/1.1/Android.mk | 57 +- wifi/supplicant/1.0/Android.mk | 381 --- 45 files changed, 58 insertions(+), 12768 deletions(-) diff --git a/automotive/vehicle/2.0/Android.mk b/automotive/vehicle/2.0/Android.mk index eb05f35eca..5dc3b9e93e 100644 --- a/automotive/vehicle/2.0/Android.mk +++ b/automotive/vehicle/2.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (StatusCode) @@ -974,977 +976,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.automotive.vehicle-V2.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (StatusCode) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/StatusCode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.StatusCode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SubscribeFlags) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/SubscribeFlags.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.SubscribeFlags - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SubscribeOptions) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/SubscribeOptions.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.SubscribeOptions - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleApPowerBootupReason) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleApPowerBootupReason.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleApPowerBootupReason - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleApPowerSetState) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleApPowerSetState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleApPowerSetState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleApPowerState) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleApPowerState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleApPowerState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleApPowerStateConfigFlag) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleApPowerStateConfigFlag.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleApPowerStateConfigFlag - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleApPowerStateIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleApPowerStateIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleApPowerStateIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleApPowerStateShutdownParam) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleApPowerStateShutdownParam.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleApPowerStateShutdownParam - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleArea) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleArea.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleArea - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAreaConfig) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAreaConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAreaConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAreaDoor) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAreaDoor.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAreaDoor - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAreaMirror) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAreaMirror.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAreaMirror - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAreaSeat) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAreaSeat.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAreaSeat - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAreaWindow) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAreaWindow.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAreaWindow - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAreaZone) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAreaZone.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAreaZone - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAudioContextFlag) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioContextFlag.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAudioContextFlag - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAudioExtFocusFlag) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioExtFocusFlag.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAudioExtFocusFlag - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAudioFocusIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioFocusIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAudioFocusIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAudioFocusRequest) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioFocusRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAudioFocusRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAudioFocusState) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioFocusState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAudioFocusState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAudioHwVariantConfigFlag) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioHwVariantConfigFlag.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAudioHwVariantConfigFlag - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAudioRoutingPolicyIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioRoutingPolicyIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAudioRoutingPolicyIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAudioStream) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioStream.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAudioStream - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAudioStreamFlag) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioStreamFlag.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAudioStreamFlag - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAudioVolumeCapabilityFlag) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioVolumeCapabilityFlag.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAudioVolumeCapabilityFlag - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAudioVolumeIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioVolumeIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAudioVolumeIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAudioVolumeLimitIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioVolumeLimitIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAudioVolumeLimitIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleAudioVolumeState) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioVolumeState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleAudioVolumeState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleDisplay) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleDisplay.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleDisplay - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleDrivingStatus) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleDrivingStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleDrivingStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleGear) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleGear.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleGear - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleHvacFanDirection) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleHvacFanDirection.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleHvacFanDirection - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleHwKeyInputAction) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleHwKeyInputAction.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleHwKeyInputAction - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleIgnitionState) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleIgnitionState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleIgnitionState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleInstrumentClusterType) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleInstrumentClusterType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleInstrumentClusterType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehiclePropConfig) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehiclePropConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehiclePropConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehiclePropValue) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehiclePropValue.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehiclePropValue - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleProperty) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleProperty.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleProperty - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehiclePropertyAccess) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehiclePropertyAccess.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehiclePropertyAccess - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehiclePropertyChangeMode) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehiclePropertyChangeMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehiclePropertyChangeMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehiclePropertyGroup) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehiclePropertyGroup.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehiclePropertyGroup - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehiclePropertyOperation) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehiclePropertyOperation.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehiclePropertyOperation - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehiclePropertyType) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehiclePropertyType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehiclePropertyType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleRadioConstants) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleRadioConstants.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleRadioConstants - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleTurnSignal) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleTurnSignal.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleTurnSignal - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleUnit) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleUnit.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.VehicleUnit - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Wheel) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Wheel.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::types.Wheel - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IVehicle.hal -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/IVehicle.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVehicle.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IVehicleCallback.hal -$(GEN): $(LOCAL_PATH)/IVehicleCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::IVehicle - -$(GEN): $(LOCAL_PATH)/IVehicle.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IVehicleCallback.hal -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/IVehicleCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVehicleCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.0::IVehicleCallback - -$(GEN): $(LOCAL_PATH)/IVehicleCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/automotive/vehicle/2.1/Android.mk b/automotive/vehicle/2.1/Android.mk index 3001da05c4..6078fb4e92 100644 --- a/automotive/vehicle/2.1/Android.mk +++ b/automotive/vehicle/2.1/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.automotive.vehicle-V2.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (DiagnosticFloatSensorIndex) @@ -361,364 +363,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.automotive.vehicle-V2.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.automotive.vehicle-V2.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (DiagnosticFloatSensorIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/DiagnosticFloatSensorIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.DiagnosticFloatSensorIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DiagnosticIntegerSensorIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/DiagnosticIntegerSensorIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.DiagnosticIntegerSensorIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2CommonIgnitionMonitors) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2CommonIgnitionMonitors.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2CommonIgnitionMonitors - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2CompressionIgnitionMonitors) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2CompressionIgnitionMonitors.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2CompressionIgnitionMonitors - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2FuelSystemStatus) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2FuelSystemStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2FuelSystemStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2FuelType) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2FuelType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2FuelType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2IgnitionMonitorKind) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2IgnitionMonitorKind.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2IgnitionMonitorKind - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2SecondaryAirStatus) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2SecondaryAirStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2SecondaryAirStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2SparkIgnitionMonitors) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2SparkIgnitionMonitors.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2SparkIgnitionMonitors - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleProperty) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VehicleProperty.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VehicleProperty - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsAvailabilityStateIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsAvailabilityStateIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsAvailabilityStateIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsBaseMessageIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsBaseMessageIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsBaseMessageIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsMessageType) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsMessageType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsMessageWithLayerAndPublisherIdIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageWithLayerAndPublisherIdIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsMessageWithLayerAndPublisherIdIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsMessageWithLayerIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageWithLayerIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsMessageWithLayerIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsOfferingMessageIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsOfferingMessageIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsOfferingMessageIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsSubscriptionsStateIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsSubscriptionsStateIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsSubscriptionsStateIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IVehicle.hal -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/IVehicle.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVehicle.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::IVehicle - -$(GEN): $(LOCAL_PATH)/IVehicle.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/biometrics/fingerprint/2.1/Android.mk b/biometrics/fingerprint/2.1/Android.mk index 2f3237162c..304f6a90d9 100644 --- a/biometrics/fingerprint/2.1/Android.mk +++ b/biometrics/fingerprint/2.1/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (FingerprintAcquired) @@ -233,236 +235,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.biometrics.fingerprint-V2.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (FingerprintAcquired) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintAcquired.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintAcquired - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (FingerprintAcquiredInfo) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintAcquiredInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintAcquiredInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (FingerprintAuthenticated) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintAuthenticated.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintAuthenticated - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (FingerprintEnroll) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintEnroll.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintEnroll - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (FingerprintError) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintError.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintError - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (FingerprintFingerId) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintFingerId.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintFingerId - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (FingerprintIterator) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintIterator.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintIterator - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (FingerprintMsgType) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintMsgType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintMsgType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RequestStatus) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/RequestStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.RequestStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IBiometricsFingerprint.hal -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBiometricsFingerprint.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IBiometricsFingerprintClientCallback.hal -$(GEN): $(LOCAL_PATH)/IBiometricsFingerprintClientCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::IBiometricsFingerprint - -$(GEN): $(LOCAL_PATH)/IBiometricsFingerprint.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IBiometricsFingerprintClientCallback.hal -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBiometricsFingerprintClientCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::IBiometricsFingerprintClientCallback - -$(GEN): $(LOCAL_PATH)/IBiometricsFingerprintClientCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/bluetooth/1.0/Android.mk b/bluetooth/1.0/Android.mk index 5dade87f51..5937e0f3a2 100644 --- a/bluetooth/1.0/Android.mk +++ b/bluetooth/1.0/Android.mk @@ -83,86 +83,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.bluetooth-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (Status) -# -GEN := $(intermediates)/android/hardware/bluetooth/V1_0/Status.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.bluetooth@1.0::types.Status - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IBluetoothHci.hal -# -GEN := $(intermediates)/android/hardware/bluetooth/V1_0/IBluetoothHci.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBluetoothHci.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IBluetoothHciCallbacks.hal -$(GEN): $(LOCAL_PATH)/IBluetoothHciCallbacks.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.bluetooth@1.0::IBluetoothHci - -$(GEN): $(LOCAL_PATH)/IBluetoothHci.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IBluetoothHciCallbacks.hal -# -GEN := $(intermediates)/android/hardware/bluetooth/V1_0/IBluetoothHciCallbacks.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBluetoothHciCallbacks.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.bluetooth@1.0::IBluetoothHciCallbacks - -$(GEN): $(LOCAL_PATH)/IBluetoothHciCallbacks.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/boot/1.0/Android.mk b/boot/1.0/Android.mk index 5ef55f31d8..253742b9e5 100644 --- a/boot/1.0/Android.mk +++ b/boot/1.0/Android.mk @@ -79,82 +79,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.boot-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (BoolResult) -# -GEN := $(intermediates)/android/hardware/boot/V1_0/BoolResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.boot@1.0::types.BoolResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CommandResult) -# -GEN := $(intermediates)/android/hardware/boot/V1_0/CommandResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.boot@1.0::types.CommandResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IBootControl.hal -# -GEN := $(intermediates)/android/hardware/boot/V1_0/IBootControl.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBootControl.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.boot@1.0::IBootControl - -$(GEN): $(LOCAL_PATH)/IBootControl.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/camera/common/1.0/Android.mk b/camera/common/1.0/Android.mk index 47bfb31b1b..c2e7075628 100644 --- a/camera/common/1.0/Android.mk +++ b/camera/common/1.0/Android.mk @@ -11,6 +11,8 @@ LOCAL_MODULE_CLASS := JAVA_LIBRARIES intermediates := $(call local-generated-sources-dir, COMMON) HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (CameraDeviceStatus) @@ -185,188 +187,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.camera.common-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -# -# Build types.hal (CameraDeviceStatus) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/CameraDeviceStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.CameraDeviceStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataType) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/CameraMetadataType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.CameraMetadataType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraResourceCost) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/CameraResourceCost.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.CameraResourceCost - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Status) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/Status.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.Status - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TagBoundaryId) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/TagBoundaryId.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.TagBoundaryId - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TorchMode) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/TorchMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.TorchMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TorchModeStatus) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/TorchModeStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.TorchModeStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VendorTag) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/VendorTag.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.VendorTag - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VendorTagSection) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/VendorTagSection.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.VendorTagSection - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/camera/metadata/3.2/Android.mk b/camera/metadata/3.2/Android.mk index 935c37cd1e..f9508b5fc0 100644 --- a/camera/metadata/3.2/Android.mk +++ b/camera/metadata/3.2/Android.mk @@ -11,6 +11,8 @@ LOCAL_MODULE_CLASS := JAVA_LIBRARIES intermediates := $(call local-generated-sources-dir, COMMON) HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (CameraMetadataEnumAndroidBlackLevelLock) @@ -1230,1233 +1232,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.camera.metadata-V3.2-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -# -# Build types.hal (CameraMetadataEnumAndroidBlackLevelLock) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidBlackLevelLock.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidBlackLevelLock - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidColorCorrectionAberrationMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidColorCorrectionAberrationMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidColorCorrectionAberrationMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidColorCorrectionMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidColorCorrectionMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidColorCorrectionMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAeAntibandingMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeAntibandingMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeAntibandingMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAeLock) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeLock.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeLock - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAeLockAvailable) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeLockAvailable.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeLockAvailable - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAeMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAePrecaptureTrigger) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAePrecaptureTrigger.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAePrecaptureTrigger - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAeState) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAfMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAfMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAfMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAfState) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAfState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAfState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAfTrigger) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAfTrigger.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAfTrigger - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAwbLock) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAwbLock.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAwbLock - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAwbLockAvailable) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAwbLockAvailable.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAwbLockAvailable - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAwbMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAwbMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAwbMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAwbState) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAwbState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAwbState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlCaptureIntent) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlCaptureIntent.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlCaptureIntent - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlEffectMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlEffectMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlEffectMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlEnableZsl) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlEnableZsl.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlEnableZsl - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlSceneMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlSceneMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlSceneMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlVideoStabilizationMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlVideoStabilizationMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlVideoStabilizationMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidDemosaicMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidDemosaicMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidDemosaicMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidDepthAvailableDepthStreamConfigurations) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidDepthAvailableDepthStreamConfigurations.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidDepthAvailableDepthStreamConfigurations - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidDepthDepthIsExclusive) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidDepthDepthIsExclusive.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidDepthDepthIsExclusive - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidEdgeMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidEdgeMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidEdgeMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidFlashInfoAvailable) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidFlashInfoAvailable.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidFlashInfoAvailable - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidFlashMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidFlashMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidFlashMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidFlashState) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidFlashState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidFlashState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidHotPixelMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidHotPixelMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidHotPixelMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidInfoSupportedHardwareLevel) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidInfoSupportedHardwareLevel.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidInfoSupportedHardwareLevel - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidLedAvailableLeds) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLedAvailableLeds.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLedAvailableLeds - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidLedTransmit) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLedTransmit.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLedTransmit - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidLensFacing) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLensFacing.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLensFacing - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidLensInfoFocusDistanceCalibration) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLensInfoFocusDistanceCalibration.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLensInfoFocusDistanceCalibration - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidLensOpticalStabilizationMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLensOpticalStabilizationMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLensOpticalStabilizationMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidLensState) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLensState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLensState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidNoiseReductionMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidNoiseReductionMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidNoiseReductionMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidQuirksPartialResult) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidQuirksPartialResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidQuirksPartialResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidRequestAvailableCapabilities) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidRequestAvailableCapabilities.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidRequestAvailableCapabilities - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidRequestMetadataMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidRequestMetadataMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidRequestMetadataMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidRequestType) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidRequestType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidRequestType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidScalerAvailableFormats) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidScalerAvailableFormats.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidScalerAvailableFormats - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidScalerAvailableStreamConfigurations) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidScalerAvailableStreamConfigurations.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidScalerAvailableStreamConfigurations - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidScalerCroppingType) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidScalerCroppingType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidScalerCroppingType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidSensorInfoColorFilterArrangement) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorInfoColorFilterArrangement.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorInfoColorFilterArrangement - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidSensorInfoLensShadingApplied) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorInfoLensShadingApplied.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorInfoLensShadingApplied - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidSensorInfoTimestampSource) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorInfoTimestampSource.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorInfoTimestampSource - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidSensorReferenceIlluminant1) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorReferenceIlluminant1.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorReferenceIlluminant1 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidSensorTestPatternMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorTestPatternMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorTestPatternMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidShadingMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidShadingMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidShadingMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidStatisticsFaceDetectMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsFaceDetectMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsFaceDetectMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidStatisticsHistogramMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsHistogramMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsHistogramMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidStatisticsHotPixelMapMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsHotPixelMapMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsHotPixelMapMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidStatisticsLensShadingMapMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsLensShadingMapMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsLensShadingMapMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidStatisticsSceneFlicker) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsSceneFlicker.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsSceneFlicker - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidStatisticsSharpnessMapMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsSharpnessMapMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsSharpnessMapMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidSyncFrameNumber) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSyncFrameNumber.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSyncFrameNumber - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidSyncMaxLatency) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSyncMaxLatency.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSyncMaxLatency - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidTonemapMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidTonemapMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidTonemapMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidTonemapPresetCurve) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidTonemapPresetCurve.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidTonemapPresetCurve - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataSection) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataSection.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataSection - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataSectionStart) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataSectionStart.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataSectionStart - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataTag) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataTag.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataTag - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/configstore/1.0/Android.mk b/configstore/1.0/Android.mk index 59eff955f9..e050a92407 100644 --- a/configstore/1.0/Android.mk +++ b/configstore/1.0/Android.mk @@ -155,158 +155,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.configstore-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (OptionalBool) -# -GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalBool.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.0::types.OptionalBool - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OptionalInt32) -# -GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalInt32.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.0::types.OptionalInt32 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OptionalInt64) -# -GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalInt64.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.0::types.OptionalInt64 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OptionalString) -# -GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalString.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.0::types.OptionalString - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OptionalUInt32) -# -GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalUInt32.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.0::types.OptionalUInt32 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OptionalUInt64) -# -GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalUInt64.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.0::types.OptionalUInt64 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISurfaceFlingerConfigs.hal -# -GEN := $(intermediates)/android/hardware/configstore/V1_0/ISurfaceFlingerConfigs.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.0::ISurfaceFlingerConfigs - -$(GEN): $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/configstore/1.1/Android.mk b/configstore/1.1/Android.mk index a5fa6c4796..b3f7053cd9 100644 --- a/configstore/1.1/Android.mk +++ b/configstore/1.1/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.configstore-V1.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build ISurfaceFlingerConfigs.hal @@ -38,41 +40,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.configstore-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.configstore-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build ISurfaceFlingerConfigs.hal -# -GEN := $(intermediates)/android/hardware/configstore/V1_1/ISurfaceFlingerConfigs.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.1::ISurfaceFlingerConfigs - -$(GEN): $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/contexthub/1.0/Android.mk b/contexthub/1.0/Android.mk index d161e3b092..47bfd8fca9 100644 --- a/contexthub/1.0/Android.mk +++ b/contexthub/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (AsyncEventType) @@ -328,331 +330,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.contexthub-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (AsyncEventType) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/AsyncEventType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.AsyncEventType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ContextHub) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/ContextHub.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.ContextHub - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ContextHubMsg) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/ContextHubMsg.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.ContextHubMsg - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HostEndPoint) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/HostEndPoint.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.HostEndPoint - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HubAppInfo) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/HubAppInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.HubAppInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HubMemoryFlag) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/HubMemoryFlag.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.HubMemoryFlag - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HubMemoryType) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/HubMemoryType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.HubMemoryType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (MemRange) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/MemRange.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.MemRange - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanoAppBinary) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/NanoAppBinary.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.NanoAppBinary - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanoAppFlags) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/NanoAppFlags.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.NanoAppFlags - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PhysicalSensor) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/PhysicalSensor.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.PhysicalSensor - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Result) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/Result.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.Result - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SensorType) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/SensorType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.SensorType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TransactionResult) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/TransactionResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.TransactionResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IContexthub.hal -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/IContexthub.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IContexthub.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IContexthubCallback.hal -$(GEN): $(LOCAL_PATH)/IContexthubCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::IContexthub - -$(GEN): $(LOCAL_PATH)/IContexthub.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IContexthubCallback.hal -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/IContexthubCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IContexthubCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::IContexthubCallback - -$(GEN): $(LOCAL_PATH)/IContexthubCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/gatekeeper/1.0/Android.mk b/gatekeeper/1.0/Android.mk index 576f729a23..debc0d961b 100644 --- a/gatekeeper/1.0/Android.mk +++ b/gatekeeper/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (GatekeeperResponse) @@ -77,80 +79,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.gatekeeper-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (GatekeeperResponse) -# -GEN := $(intermediates)/android/hardware/gatekeeper/V1_0/GatekeeperResponse.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gatekeeper@1.0::types.GatekeeperResponse - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GatekeeperStatusCode) -# -GEN := $(intermediates)/android/hardware/gatekeeper/V1_0/GatekeeperStatusCode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gatekeeper@1.0::types.GatekeeperStatusCode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGatekeeper.hal -# -GEN := $(intermediates)/android/hardware/gatekeeper/V1_0/IGatekeeper.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGatekeeper.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gatekeeper@1.0::IGatekeeper - -$(GEN): $(LOCAL_PATH)/IGatekeeper.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/gnss/1.0/Android.mk b/gnss/1.0/Android.mk index bb1b765d8c..1cb3945bf0 100644 --- a/gnss/1.0/Android.mk +++ b/gnss/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (GnssConstellationType) @@ -524,528 +526,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.gnss-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (GnssConstellationType) -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/GnssConstellationType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::types.GnssConstellationType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GnssLocation) -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/GnssLocation.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::types.GnssLocation - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GnssLocationFlags) -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/GnssLocationFlags.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::types.GnssLocationFlags - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GnssMax) -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/GnssMax.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::types.GnssMax - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IAGnss.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IAGnss.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IAGnss.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IAGnssCallback.hal -$(GEN): $(LOCAL_PATH)/IAGnssCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IAGnss - -$(GEN): $(LOCAL_PATH)/IAGnss.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IAGnssCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IAGnssCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IAGnssCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IAGnssCallback - -$(GEN): $(LOCAL_PATH)/IAGnssCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IAGnssRil.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IAGnssRil.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IAGnssRil.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IAGnssRilCallback.hal -$(GEN): $(LOCAL_PATH)/IAGnssRilCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IAGnssRil - -$(GEN): $(LOCAL_PATH)/IAGnssRil.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IAGnssRilCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IAGnssRilCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IAGnssRilCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IAGnssRilCallback - -$(GEN): $(LOCAL_PATH)/IAGnssRilCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnss.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnss.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnss.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IAGnss.hal -$(GEN): $(LOCAL_PATH)/IAGnss.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IAGnssRil.hal -$(GEN): $(LOCAL_PATH)/IAGnssRil.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssBatching.hal -$(GEN): $(LOCAL_PATH)/IGnssBatching.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssCallback.hal -$(GEN): $(LOCAL_PATH)/IGnssCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssConfiguration.hal -$(GEN): $(LOCAL_PATH)/IGnssConfiguration.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssDebug.hal -$(GEN): $(LOCAL_PATH)/IGnssDebug.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssGeofencing.hal -$(GEN): $(LOCAL_PATH)/IGnssGeofencing.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssMeasurement.hal -$(GEN): $(LOCAL_PATH)/IGnssMeasurement.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssNavigationMessage.hal -$(GEN): $(LOCAL_PATH)/IGnssNavigationMessage.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssNi.hal -$(GEN): $(LOCAL_PATH)/IGnssNi.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssXtra.hal -$(GEN): $(LOCAL_PATH)/IGnssXtra.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnss - -$(GEN): $(LOCAL_PATH)/IGnss.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssBatching.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssBatching.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssBatching.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssBatchingCallback.hal -$(GEN): $(LOCAL_PATH)/IGnssBatchingCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssBatching - -$(GEN): $(LOCAL_PATH)/IGnssBatching.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssBatchingCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssBatchingCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssBatchingCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssBatchingCallback - -$(GEN): $(LOCAL_PATH)/IGnssBatchingCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssCallback - -$(GEN): $(LOCAL_PATH)/IGnssCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssConfiguration.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssConfiguration.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssConfiguration.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssConfiguration - -$(GEN): $(LOCAL_PATH)/IGnssConfiguration.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssDebug.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssDebug.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssDebug.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssDebug - -$(GEN): $(LOCAL_PATH)/IGnssDebug.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssGeofenceCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssGeofenceCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssGeofenceCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssGeofenceCallback - -$(GEN): $(LOCAL_PATH)/IGnssGeofenceCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssGeofencing.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssGeofencing.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssGeofencing.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssGeofenceCallback.hal -$(GEN): $(LOCAL_PATH)/IGnssGeofenceCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssGeofencing - -$(GEN): $(LOCAL_PATH)/IGnssGeofencing.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssMeasurement.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssMeasurement.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssMeasurement.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssMeasurementCallback.hal -$(GEN): $(LOCAL_PATH)/IGnssMeasurementCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssMeasurement - -$(GEN): $(LOCAL_PATH)/IGnssMeasurement.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssMeasurementCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssMeasurementCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssMeasurementCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssMeasurementCallback - -$(GEN): $(LOCAL_PATH)/IGnssMeasurementCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssNavigationMessage.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssNavigationMessage.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssNavigationMessage.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssNavigationMessageCallback.hal -$(GEN): $(LOCAL_PATH)/IGnssNavigationMessageCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssNavigationMessage - -$(GEN): $(LOCAL_PATH)/IGnssNavigationMessage.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssNavigationMessageCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssNavigationMessageCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssNavigationMessageCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssNavigationMessageCallback - -$(GEN): $(LOCAL_PATH)/IGnssNavigationMessageCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssNi.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssNi.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssNi.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssNiCallback.hal -$(GEN): $(LOCAL_PATH)/IGnssNiCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssNi - -$(GEN): $(LOCAL_PATH)/IGnssNi.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssNiCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssNiCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssNiCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssNiCallback - -$(GEN): $(LOCAL_PATH)/IGnssNiCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssXtra.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssXtra.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssXtra.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssXtraCallback.hal -$(GEN): $(LOCAL_PATH)/IGnssXtraCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssXtra - -$(GEN): $(LOCAL_PATH)/IGnssXtra.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssXtraCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssXtraCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssXtraCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssXtraCallback - -$(GEN): $(LOCAL_PATH)/IGnssXtraCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/graphics/common/1.0/Android.mk b/graphics/common/1.0/Android.mk index 569a5f444a..3fd948e47f 100644 --- a/graphics/common/1.0/Android.mk +++ b/graphics/common/1.0/Android.mk @@ -11,6 +11,8 @@ LOCAL_MODULE_CLASS := JAVA_LIBRARIES intermediates := $(call local-generated-sources-dir, COMMON) HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (BufferUsage) @@ -147,151 +149,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.graphics.common-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -# -# Build types.hal (BufferUsage) -# -GEN := $(intermediates)/android/hardware/graphics/common/V1_0/BufferUsage.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.graphics.common@1.0::types.BufferUsage - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ColorMode) -# -GEN := $(intermediates)/android/hardware/graphics/common/V1_0/ColorMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.graphics.common@1.0::types.ColorMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ColorTransform) -# -GEN := $(intermediates)/android/hardware/graphics/common/V1_0/ColorTransform.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.graphics.common@1.0::types.ColorTransform - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Dataspace) -# -GEN := $(intermediates)/android/hardware/graphics/common/V1_0/Dataspace.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.graphics.common@1.0::types.Dataspace - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Hdr) -# -GEN := $(intermediates)/android/hardware/graphics/common/V1_0/Hdr.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.graphics.common@1.0::types.Hdr - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PixelFormat) -# -GEN := $(intermediates)/android/hardware/graphics/common/V1_0/PixelFormat.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.graphics.common@1.0::types.PixelFormat - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Transform) -# -GEN := $(intermediates)/android/hardware/graphics/common/V1_0/Transform.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.graphics.common@1.0::types.Transform - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/health/1.0/Android.mk b/health/1.0/Android.mk index b03b868691..3b47239500 100644 --- a/health/1.0/Android.mk +++ b/health/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (BatteryHealth) @@ -134,138 +136,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.health-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (BatteryHealth) -# -GEN := $(intermediates)/android/hardware/health/V1_0/BatteryHealth.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.health@1.0::types.BatteryHealth - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (BatteryStatus) -# -GEN := $(intermediates)/android/hardware/health/V1_0/BatteryStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.health@1.0::types.BatteryStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HealthConfig) -# -GEN := $(intermediates)/android/hardware/health/V1_0/HealthConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.health@1.0::types.HealthConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HealthInfo) -# -GEN := $(intermediates)/android/hardware/health/V1_0/HealthInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.health@1.0::types.HealthInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Result) -# -GEN := $(intermediates)/android/hardware/health/V1_0/Result.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.health@1.0::types.Result - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IHealth.hal -# -GEN := $(intermediates)/android/hardware/health/V1_0/IHealth.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IHealth.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.health@1.0::IHealth - -$(GEN): $(LOCAL_PATH)/IHealth.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/ir/1.0/Android.mk b/ir/1.0/Android.mk index 96812df854..eca46f5a94 100644 --- a/ir/1.0/Android.mk +++ b/ir/1.0/Android.mk @@ -60,63 +60,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.ir-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (ConsumerIrFreqRange) -# -GEN := $(intermediates)/android/hardware/ir/V1_0/ConsumerIrFreqRange.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.ir@1.0::types.ConsumerIrFreqRange - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IConsumerIr.hal -# -GEN := $(intermediates)/android/hardware/ir/V1_0/IConsumerIr.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IConsumerIr.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.ir@1.0::IConsumerIr - -$(GEN): $(LOCAL_PATH)/IConsumerIr.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/light/2.0/Android.mk b/light/2.0/Android.mk index 24d7ab1394..93211e19c8 100644 --- a/light/2.0/Android.mk +++ b/light/2.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Brightness) @@ -134,137 +136,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.light-V2.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (Brightness) -# -GEN := $(intermediates)/android/hardware/light/V2_0/Brightness.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.light@2.0::types.Brightness - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Flash) -# -GEN := $(intermediates)/android/hardware/light/V2_0/Flash.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.light@2.0::types.Flash - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (LightState) -# -GEN := $(intermediates)/android/hardware/light/V2_0/LightState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.light@2.0::types.LightState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Status) -# -GEN := $(intermediates)/android/hardware/light/V2_0/Status.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.light@2.0::types.Status - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Type) -# -GEN := $(intermediates)/android/hardware/light/V2_0/Type.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.light@2.0::types.Type - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ILight.hal -# -GEN := $(intermediates)/android/hardware/light/V2_0/ILight.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ILight.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.light@2.0::ILight - -$(GEN): $(LOCAL_PATH)/ILight.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/memtrack/1.0/Android.mk b/memtrack/1.0/Android.mk index 8583b0ab6a..dfde3850b2 100644 --- a/memtrack/1.0/Android.mk +++ b/memtrack/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (MemtrackFlag) @@ -115,118 +117,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.memtrack-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (MemtrackFlag) -# -GEN := $(intermediates)/android/hardware/memtrack/V1_0/MemtrackFlag.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.memtrack@1.0::types.MemtrackFlag - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (MemtrackRecord) -# -GEN := $(intermediates)/android/hardware/memtrack/V1_0/MemtrackRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.memtrack@1.0::types.MemtrackRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (MemtrackStatus) -# -GEN := $(intermediates)/android/hardware/memtrack/V1_0/MemtrackStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.memtrack@1.0::types.MemtrackStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (MemtrackType) -# -GEN := $(intermediates)/android/hardware/memtrack/V1_0/MemtrackType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.memtrack@1.0::types.MemtrackType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IMemtrack.hal -# -GEN := $(intermediates)/android/hardware/memtrack/V1_0/IMemtrack.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IMemtrack.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.memtrack@1.0::IMemtrack - -$(GEN): $(LOCAL_PATH)/IMemtrack.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/nfc/1.0/Android.mk b/nfc/1.0/Android.mk index 85ce5508ae..bff25632c2 100644 --- a/nfc/1.0/Android.mk +++ b/nfc/1.0/Android.mk @@ -102,106 +102,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.nfc-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (NfcEvent) -# -GEN := $(intermediates)/android/hardware/nfc/V1_0/NfcEvent.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.nfc@1.0::types.NfcEvent - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NfcStatus) -# -GEN := $(intermediates)/android/hardware/nfc/V1_0/NfcStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.nfc@1.0::types.NfcStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build INfc.hal -# -GEN := $(intermediates)/android/hardware/nfc/V1_0/INfc.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/INfc.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/INfcClientCallback.hal -$(GEN): $(LOCAL_PATH)/INfcClientCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.nfc@1.0::INfc - -$(GEN): $(LOCAL_PATH)/INfc.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build INfcClientCallback.hal -# -GEN := $(intermediates)/android/hardware/nfc/V1_0/INfcClientCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/INfcClientCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.nfc@1.0::INfcClientCallback - -$(GEN): $(LOCAL_PATH)/INfcClientCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/oemlock/1.0/Android.mk b/oemlock/1.0/Android.mk index d9864414ae..91cc8f8cbc 100644 --- a/oemlock/1.0/Android.mk +++ b/oemlock/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (OemLockSecureStatus) @@ -77,80 +79,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.oemlock-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (OemLockSecureStatus) -# -GEN := $(intermediates)/android/hardware/oemlock/V1_0/OemLockSecureStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.oemlock@1.0::types.OemLockSecureStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OemLockStatus) -# -GEN := $(intermediates)/android/hardware/oemlock/V1_0/OemLockStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.oemlock@1.0::types.OemLockStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IOemLock.hal -# -GEN := $(intermediates)/android/hardware/oemlock/V1_0/IOemLock.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOemLock.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.oemlock@1.0::IOemLock - -$(GEN): $(LOCAL_PATH)/IOemLock.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/power/1.0/Android.mk b/power/1.0/Android.mk index 8a89a45269..414d0c338e 100644 --- a/power/1.0/Android.mk +++ b/power/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Feature) @@ -134,137 +136,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.power-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (Feature) -# -GEN := $(intermediates)/android/hardware/power/V1_0/Feature.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.0::types.Feature - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PowerHint) -# -GEN := $(intermediates)/android/hardware/power/V1_0/PowerHint.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.0::types.PowerHint - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PowerStatePlatformSleepState) -# -GEN := $(intermediates)/android/hardware/power/V1_0/PowerStatePlatformSleepState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.0::types.PowerStatePlatformSleepState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PowerStateVoter) -# -GEN := $(intermediates)/android/hardware/power/V1_0/PowerStateVoter.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.0::types.PowerStateVoter - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Status) -# -GEN := $(intermediates)/android/hardware/power/V1_0/Status.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.0::types.Status - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IPower.hal -# -GEN := $(intermediates)/android/hardware/power/V1_0/IPower.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IPower.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.0::IPower - -$(GEN): $(LOCAL_PATH)/IPower.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/power/1.1/Android.mk b/power/1.1/Android.mk index 16cfcbd4f2..5044cfa61e 100644 --- a/power/1.1/Android.mk +++ b/power/1.1/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.power-V1.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (PowerStateSubsystem) @@ -78,81 +80,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.power-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.power-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (PowerStateSubsystem) -# -GEN := $(intermediates)/android/hardware/power/V1_1/PowerStateSubsystem.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.1::types.PowerStateSubsystem - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PowerStateSubsystemSleepState) -# -GEN := $(intermediates)/android/hardware/power/V1_1/PowerStateSubsystemSleepState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.1::types.PowerStateSubsystemSleepState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IPower.hal -# -GEN := $(intermediates)/android/hardware/power/V1_1/IPower.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IPower.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.1::IPower - -$(GEN): $(LOCAL_PATH)/IPower.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/radio/1.0/Android.mk b/radio/1.0/Android.mk index d5ba4cf263..4225120e38 100644 --- a/radio/1.0/Android.mk +++ b/radio/1.0/Android.mk @@ -3057,3060 +3057,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.radio-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (ActivityStatsInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ActivityStatsInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.ActivityStatsInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ApnAuthType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ApnAuthType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.ApnAuthType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ApnTypes) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ApnTypes.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.ApnTypes - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (AppState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/AppState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.AppState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (AppStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/AppStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.AppStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (AppType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/AppType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.AppType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Call) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/Call.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.Call - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CallForwardInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CallForwardInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CallForwardInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CallForwardInfoStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CallForwardInfoStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CallForwardInfoStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CallPresentation) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CallPresentation.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CallPresentation - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CallState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CallState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CallState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CardState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CardState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CardState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CardStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CardStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CardStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Carrier) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/Carrier.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.Carrier - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CarrierMatchType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CarrierMatchType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CarrierMatchType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CarrierRestrictions) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CarrierRestrictions.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CarrierRestrictions - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaBroadcastSmsConfigInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaBroadcastSmsConfigInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaBroadcastSmsConfigInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaCallWaiting) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaCallWaiting.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaCallWaiting - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaCallWaitingNumberPlan) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaCallWaitingNumberPlan.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaCallWaitingNumberPlan - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaCallWaitingNumberPresentation) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaCallWaitingNumberPresentation.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaCallWaitingNumberPresentation - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaCallWaitingNumberType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaCallWaitingNumberType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaCallWaitingNumberType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaDisplayInfoRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaDisplayInfoRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaDisplayInfoRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaInfoRecName) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaInfoRecName.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaInfoRecName - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaInformationRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaInformationRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaInformationRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaInformationRecords) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaInformationRecords.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaInformationRecords - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaLineControlInfoRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaLineControlInfoRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaLineControlInfoRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaNumberInfoRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaNumberInfoRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaNumberInfoRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaOtaProvisionStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaOtaProvisionStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaOtaProvisionStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaRedirectingNumberInfoRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaRedirectingNumberInfoRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaRedirectingNumberInfoRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaRedirectingReason) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaRedirectingReason.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaRedirectingReason - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaRoamingType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaRoamingType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaRoamingType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSignalInfoRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSignalInfoRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSignalInfoRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSignalStrength) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSignalStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSignalStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsAck) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsAck.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsAck - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsAddress) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsAddress.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsAddress - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsDigitMode) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsDigitMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsDigitMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsErrorClass) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsErrorClass.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsErrorClass - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsMessage) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsMessage.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsMessage - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsNumberMode) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsNumberMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsNumberMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsNumberPlan) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsNumberPlan.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsNumberPlan - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsNumberType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsNumberType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsNumberType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsSubaddress) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsSubaddress.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsSubaddress - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsSubaddressType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsSubaddressType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsSubaddressType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsWriteArgs) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsWriteArgs.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsWriteArgs - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsWriteArgsStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsWriteArgsStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsWriteArgsStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSubscriptionSource) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSubscriptionSource.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSubscriptionSource - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaT53AudioControlInfoRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaT53AudioControlInfoRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaT53AudioControlInfoRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaT53ClirInfoRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaT53ClirInfoRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaT53ClirInfoRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellIdentity) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentity.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellIdentity - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellIdentityCdma) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityCdma.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellIdentityCdma - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellIdentityGsm) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityGsm.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellIdentityGsm - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellIdentityLte) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityLte.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellIdentityLte - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellIdentityTdscdma) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityTdscdma.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellIdentityTdscdma - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellIdentityWcdma) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityWcdma.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellIdentityWcdma - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellInfoCdma) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoCdma.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellInfoCdma - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellInfoGsm) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoGsm.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellInfoGsm - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellInfoLte) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoLte.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellInfoLte - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellInfoTdscdma) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoTdscdma.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellInfoTdscdma - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellInfoType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellInfoType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellInfoWcdma) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoWcdma.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellInfoWcdma - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CfData) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CfData.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CfData - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ClipStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ClipStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.ClipStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Clir) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/Clir.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.Clir - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DataCallFailCause) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/DataCallFailCause.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.DataCallFailCause - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DataProfileId) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/DataProfileId.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.DataProfileId - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DataProfileInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/DataProfileInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.DataProfileInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DataProfileInfoType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/DataProfileInfoType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.DataProfileInfoType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DataRegStateResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/DataRegStateResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.DataRegStateResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DeviceStateType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/DeviceStateType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.DeviceStateType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Dial) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/Dial.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.Dial - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (EvdoSignalStrength) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/EvdoSignalStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.EvdoSignalStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GsmBroadcastSmsConfigInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/GsmBroadcastSmsConfigInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.GsmBroadcastSmsConfigInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GsmSignalStrength) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/GsmSignalStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.GsmSignalStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GsmSmsMessage) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/GsmSmsMessage.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.GsmSmsMessage - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HardwareConfig) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.HardwareConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HardwareConfigModem) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfigModem.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.HardwareConfigModem - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HardwareConfigSim) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfigSim.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.HardwareConfigSim - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HardwareConfigState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfigState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.HardwareConfigState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HardwareConfigType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfigType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.HardwareConfigType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (IccIo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/IccIo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.IccIo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (IccIoResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/IccIoResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.IccIoResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ImsSmsMessage) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ImsSmsMessage.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.ImsSmsMessage - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (IndicationFilter) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/IndicationFilter.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.IndicationFilter - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (LastCallFailCause) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/LastCallFailCause.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.LastCallFailCause - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (LastCallFailCauseInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/LastCallFailCauseInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.LastCallFailCauseInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (LceDataInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/LceDataInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.LceDataInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (LceStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/LceStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.LceStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (LceStatusInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/LceStatusInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.LceStatusInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (LteSignalStrength) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/LteSignalStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.LteSignalStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (MvnoType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/MvnoType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.MvnoType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NeighboringCell) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/NeighboringCell.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.NeighboringCell - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NvItem) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/NvItem.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.NvItem - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NvWriteItem) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/NvWriteItem.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.NvWriteItem - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OperatorInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/OperatorInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.OperatorInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OperatorStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/OperatorStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.OperatorStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (P2Constant) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/P2Constant.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.P2Constant - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PcoDataInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/PcoDataInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.PcoDataInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PersoSubstate) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/PersoSubstate.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.PersoSubstate - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PhoneRestrictedState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/PhoneRestrictedState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.PhoneRestrictedState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PinState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/PinState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.PinState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PreferredNetworkType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/PreferredNetworkType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.PreferredNetworkType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioAccessFamily) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioAccessFamily.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioAccessFamily - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioBandMode) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioBandMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioBandMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioCapability) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioCapability.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioCapability - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioCapabilityPhase) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioCapabilityPhase.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioCapabilityPhase - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioCapabilityStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioCapabilityStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioCapabilityStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioCdmaSmsConst) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioCdmaSmsConst.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioCdmaSmsConst - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioConst) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioConst.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioConst - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioError) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioError.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioError - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioIndicationType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioIndicationType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioIndicationType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioResponseInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioResponseInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioResponseInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioResponseType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioResponseType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioResponseType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioTechnology) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioTechnology.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioTechnology - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioTechnologyFamily) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioTechnologyFamily.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioTechnologyFamily - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RegState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RegState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RegState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ResetNvType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ResetNvType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.ResetNvType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RestrictedState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RestrictedState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RestrictedState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SapApduType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SapApduType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SapApduType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SapConnectRsp) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SapConnectRsp.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SapConnectRsp - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SapDisconnectType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SapDisconnectType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SapDisconnectType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SapResultCode) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SapResultCode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SapResultCode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SapStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SapStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SapStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SapTransferProtocol) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SapTransferProtocol.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SapTransferProtocol - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SelectUiccSub) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SelectUiccSub.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SelectUiccSub - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SendSmsResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SendSmsResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SendSmsResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SetupDataCallResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SetupDataCallResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SetupDataCallResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SignalStrength) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SignalStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SignalStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SimApdu) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SimApdu.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SimApdu - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SimRefreshResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SimRefreshResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SimRefreshResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SimRefreshType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SimRefreshType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SimRefreshType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SmsAcknowledgeFailCause) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SmsAcknowledgeFailCause.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SmsAcknowledgeFailCause - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SmsWriteArgs) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SmsWriteArgs.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SmsWriteArgs - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SmsWriteArgsStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SmsWriteArgsStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SmsWriteArgsStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SrvccState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SrvccState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SrvccState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SsInfoData) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SsInfoData.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SsInfoData - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SsRequestType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SsRequestType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SsRequestType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SsServiceType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SsServiceType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SsServiceType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SsTeleserviceType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SsTeleserviceType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SsTeleserviceType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StkCcUnsolSsResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/StkCcUnsolSsResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.StkCcUnsolSsResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SubscriptionType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SubscriptionType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SubscriptionType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SuppServiceClass) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SuppServiceClass.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SuppServiceClass - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SuppSvcNotification) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SuppSvcNotification.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SuppSvcNotification - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TdScdmaSignalStrength) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/TdScdmaSignalStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.TdScdmaSignalStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TimeStampType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/TimeStampType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.TimeStampType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TtyMode) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/TtyMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.TtyMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (UiccSubActStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/UiccSubActStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.UiccSubActStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (UssdModeType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/UssdModeType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.UssdModeType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (UusDcs) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/UusDcs.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.UusDcs - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (UusInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/UusInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.UusInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (UusType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/UusType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.UusType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VoiceRegStateResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/VoiceRegStateResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.VoiceRegStateResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WcdmaSignalStrength) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/WcdmaSignalStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.WcdmaSignalStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IRadio.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_0/IRadio.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadio.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IRadioIndication.hal -$(GEN): $(LOCAL_PATH)/IRadioIndication.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IRadioResponse.hal -$(GEN): $(LOCAL_PATH)/IRadioResponse.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::IRadio - -$(GEN): $(LOCAL_PATH)/IRadio.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IRadioIndication.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_0/IRadioIndication.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadioIndication.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::IRadioIndication - -$(GEN): $(LOCAL_PATH)/IRadioIndication.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IRadioResponse.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_0/IRadioResponse.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadioResponse.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::IRadioResponse - -$(GEN): $(LOCAL_PATH)/IRadioResponse.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISap.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ISap.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISap.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISapCallback.hal -$(GEN): $(LOCAL_PATH)/ISapCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::ISap - -$(GEN): $(LOCAL_PATH)/ISap.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISapCallback.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ISapCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISapCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::ISapCallback - -$(GEN): $(LOCAL_PATH)/ISapCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/radio/1.1/Android.mk b/radio/1.1/Android.mk index 74ce516309..0535bb1e54 100644 --- a/radio/1.1/Android.mk +++ b/radio/1.1/Android.mk @@ -388,391 +388,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.radio-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.radio-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (CardPowerState) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/CardPowerState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.CardPowerState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (EutranBands) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/EutranBands.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.EutranBands - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GeranBands) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/GeranBands.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.GeranBands - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ImsiEncryptionInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/ImsiEncryptionInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.ImsiEncryptionInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (KeepaliveRequest) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.KeepaliveRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (KeepaliveStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.KeepaliveStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (KeepaliveStatusCode) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveStatusCode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.KeepaliveStatusCode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (KeepaliveType) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.KeepaliveType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NetworkScanRequest) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/NetworkScanRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.NetworkScanRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NetworkScanResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/NetworkScanResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.NetworkScanResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioAccessNetworks) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/RadioAccessNetworks.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.RadioAccessNetworks - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioAccessSpecifier) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/RadioAccessSpecifier.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.RadioAccessSpecifier - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ScanStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/ScanStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.ScanStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ScanType) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/ScanType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.ScanType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (UtranBands) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/UtranBands.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.UtranBands - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IRadio.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_1/IRadio.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadio.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::IRadio - -$(GEN): $(LOCAL_PATH)/IRadio.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IRadioIndication.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_1/IRadioIndication.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadioIndication.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::IRadioIndication - -$(GEN): $(LOCAL_PATH)/IRadioIndication.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IRadioResponse.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_1/IRadioResponse.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadioResponse.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::IRadioResponse - -$(GEN): $(LOCAL_PATH)/IRadioResponse.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISap.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_1/ISap.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISap.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::ISap - -$(GEN): $(LOCAL_PATH)/ISap.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/radio/deprecated/1.0/Android.mk b/radio/deprecated/1.0/Android.mk index e7516c85d2..2a410b2e95 100644 --- a/radio/deprecated/1.0/Android.mk +++ b/radio/deprecated/1.0/Android.mk @@ -82,85 +82,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.radio.deprecated-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.radio-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build IOemHook.hal -# -GEN := $(intermediates)/android/hardware/radio/deprecated/V1_0/IOemHook.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOemHook.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IOemHookIndication.hal -$(GEN): $(LOCAL_PATH)/IOemHookIndication.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IOemHookResponse.hal -$(GEN): $(LOCAL_PATH)/IOemHookResponse.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio.deprecated@1.0::IOemHook - -$(GEN): $(LOCAL_PATH)/IOemHook.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IOemHookIndication.hal -# -GEN := $(intermediates)/android/hardware/radio/deprecated/V1_0/IOemHookIndication.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOemHookIndication.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio.deprecated@1.0::IOemHookIndication - -$(GEN): $(LOCAL_PATH)/IOemHookIndication.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IOemHookResponse.hal -# -GEN := $(intermediates)/android/hardware/radio/deprecated/V1_0/IOemHookResponse.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOemHookResponse.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio.deprecated@1.0::IOemHookResponse - -$(GEN): $(LOCAL_PATH)/IOemHookResponse.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/baz/1.0/Android.mk b/tests/baz/1.0/Android.mk index 52d6b0ce63..603e552d85 100644 --- a/tests/baz/1.0/Android.mk +++ b/tests/baz/1.0/Android.mk @@ -100,103 +100,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tests.baz-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build IBase.hal -# -GEN := $(intermediates)/android/hardware/tests/baz/V1_0/IBase.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBase.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.baz@1.0::IBase - -$(GEN): $(LOCAL_PATH)/IBase.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IBaz.hal -# -GEN := $(intermediates)/android/hardware/tests/baz/V1_0/IBaz.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBaz.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IBase.hal -$(GEN): $(LOCAL_PATH)/IBase.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IBazCallback.hal -$(GEN): $(LOCAL_PATH)/IBazCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.baz@1.0::IBaz - -$(GEN): $(LOCAL_PATH)/IBaz.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IBazCallback.hal -# -GEN := $(intermediates)/android/hardware/tests/baz/V1_0/IBazCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBazCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.baz@1.0::IBazCallback - -$(GEN): $(LOCAL_PATH)/IBazCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IQuux.hal -# -GEN := $(intermediates)/android/hardware/tests/baz/V1_0/IQuux.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IQuux.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.baz@1.0::IQuux - -$(GEN): $(LOCAL_PATH)/IQuux.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/expression/1.0/Android.mk b/tests/expression/1.0/Android.mk index 499ec3faf8..7f716fd517 100644 --- a/tests/expression/1.0/Android.mk +++ b/tests/expression/1.0/Android.mk @@ -60,63 +60,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tests.expression-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build IExpression.hal -# -GEN := $(intermediates)/android/hardware/tests/expression/V1_0/IExpression.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IExpression.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.expression@1.0::IExpression - -$(GEN): $(LOCAL_PATH)/IExpression.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IExpressionExt.hal -# -GEN := $(intermediates)/android/hardware/tests/expression/V1_0/IExpressionExt.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IExpressionExt.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IExpression.hal -$(GEN): $(LOCAL_PATH)/IExpression.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.expression@1.0::IExpressionExt - -$(GEN): $(LOCAL_PATH)/IExpressionExt.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/extension/light/2.0/Android.mk b/tests/extension/light/2.0/Android.mk index f1e10e47ee..485230b11a 100644 --- a/tests/extension/light/2.0/Android.mk +++ b/tests/extension/light/2.0/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.light-V2.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Default) @@ -97,100 +99,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tests.extension.light-V2.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.light-V2.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (Default) -# -GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/Default.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.extension.light@2.0::types.Default - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ExtBrightness) -# -GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/ExtBrightness.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.extension.light@2.0::types.ExtBrightness - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ExtLightState) -# -GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/ExtLightState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.extension.light@2.0::types.ExtLightState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IExtLight.hal -# -GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/IExtLight.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IExtLight.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.extension.light@2.0::IExtLight - -$(GEN): $(LOCAL_PATH)/IExtLight.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/hash/1.0/Android.mk b/tests/hash/1.0/Android.mk index cd813cb74f..94a594e709 100644 --- a/tests/hash/1.0/Android.mk +++ b/tests/hash/1.0/Android.mk @@ -39,42 +39,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tests.hash-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build IHash.hal -# -GEN := $(intermediates)/android/hardware/tests/hash/V1_0/IHash.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IHash.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.hash@1.0::IHash - -$(GEN): $(LOCAL_PATH)/IHash.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/inheritance/1.0/Android.mk b/tests/inheritance/1.0/Android.mk index 5b6ccefbcb..f01b9782ff 100644 --- a/tests/inheritance/1.0/Android.mk +++ b/tests/inheritance/1.0/Android.mk @@ -106,109 +106,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tests.inheritance-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build IChild.hal -# -GEN := $(intermediates)/android/hardware/tests/inheritance/V1_0/IChild.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IChild.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IParent.hal -$(GEN): $(LOCAL_PATH)/IParent.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.inheritance@1.0::IChild - -$(GEN): $(LOCAL_PATH)/IChild.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IFetcher.hal -# -GEN := $(intermediates)/android/hardware/tests/inheritance/V1_0/IFetcher.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IFetcher.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IChild.hal -$(GEN): $(LOCAL_PATH)/IChild.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGrandparent.hal -$(GEN): $(LOCAL_PATH)/IGrandparent.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IParent.hal -$(GEN): $(LOCAL_PATH)/IParent.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.inheritance@1.0::IFetcher - -$(GEN): $(LOCAL_PATH)/IFetcher.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGrandparent.hal -# -GEN := $(intermediates)/android/hardware/tests/inheritance/V1_0/IGrandparent.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGrandparent.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.inheritance@1.0::IGrandparent - -$(GEN): $(LOCAL_PATH)/IGrandparent.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IParent.hal -# -GEN := $(intermediates)/android/hardware/tests/inheritance/V1_0/IParent.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IParent.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGrandparent.hal -$(GEN): $(LOCAL_PATH)/IGrandparent.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.inheritance@1.0::IParent - -$(GEN): $(LOCAL_PATH)/IParent.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/libhwbinder/1.0/Android.mk b/tests/libhwbinder/1.0/Android.mk index c821f861e6..1ac7681b5a 100644 --- a/tests/libhwbinder/1.0/Android.mk +++ b/tests/libhwbinder/1.0/Android.mk @@ -58,61 +58,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tests.libhwbinder-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build IBenchmark.hal -# -GEN := $(intermediates)/android/hardware/tests/libhwbinder/V1_0/IBenchmark.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBenchmark.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.libhwbinder@1.0::IBenchmark - -$(GEN): $(LOCAL_PATH)/IBenchmark.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IScheduleTest.hal -# -GEN := $(intermediates)/android/hardware/tests/libhwbinder/V1_0/IScheduleTest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IScheduleTest.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.libhwbinder@1.0::IScheduleTest - -$(GEN): $(LOCAL_PATH)/IScheduleTest.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/multithread/1.0/Android.mk b/tests/multithread/1.0/Android.mk index 08fd8fb6f8..a2d2b100e6 100644 --- a/tests/multithread/1.0/Android.mk +++ b/tests/multithread/1.0/Android.mk @@ -39,42 +39,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tests.multithread-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build IMultithread.hal -# -GEN := $(intermediates)/android/hardware/tests/multithread/V1_0/IMultithread.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IMultithread.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.multithread@1.0::IMultithread - -$(GEN): $(LOCAL_PATH)/IMultithread.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tetheroffload/control/1.0/Android.mk b/tetheroffload/control/1.0/Android.mk index 4185a6671b..7e642bec24 100644 --- a/tetheroffload/control/1.0/Android.mk +++ b/tetheroffload/control/1.0/Android.mk @@ -138,141 +138,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tetheroffload.control-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (IPv4AddrPortPair) -# -GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/IPv4AddrPortPair.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tetheroffload.control@1.0::types.IPv4AddrPortPair - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NatTimeoutUpdate) -# -GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/NatTimeoutUpdate.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tetheroffload.control@1.0::types.NatTimeoutUpdate - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NetworkProtocol) -# -GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/NetworkProtocol.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tetheroffload.control@1.0::types.NetworkProtocol - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OffloadCallbackEvent) -# -GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/OffloadCallbackEvent.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tetheroffload.control@1.0::types.OffloadCallbackEvent - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IOffloadControl.hal -# -GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/IOffloadControl.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOffloadControl.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ITetheringOffloadCallback.hal -$(GEN): $(LOCAL_PATH)/ITetheringOffloadCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tetheroffload.control@1.0::IOffloadControl - -$(GEN): $(LOCAL_PATH)/IOffloadControl.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ITetheringOffloadCallback.hal -# -GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ITetheringOffloadCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tetheroffload.control@1.0::ITetheringOffloadCallback - -$(GEN): $(LOCAL_PATH)/ITetheringOffloadCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/thermal/1.0/Android.mk b/thermal/1.0/Android.mk index 5a0a9a0a86..0b8206ea27 100644 --- a/thermal/1.0/Android.mk +++ b/thermal/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (CoolingDevice) @@ -172,176 +174,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.thermal-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (CoolingDevice) -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/CoolingDevice.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::types.CoolingDevice - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CoolingType) -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/CoolingType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::types.CoolingType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CpuUsage) -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/CpuUsage.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::types.CpuUsage - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Temperature) -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/Temperature.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::types.Temperature - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TemperatureType) -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/TemperatureType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::types.TemperatureType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ThermalStatus) -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/ThermalStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::types.ThermalStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ThermalStatusCode) -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/ThermalStatusCode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::types.ThermalStatusCode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IThermal.hal -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/IThermal.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermal.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::IThermal - -$(GEN): $(LOCAL_PATH)/IThermal.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/thermal/1.1/Android.bp b/thermal/1.1/Android.bp index 833f219ed6..0985d947b6 100644 --- a/thermal/1.1/Android.bp +++ b/thermal/1.1/Android.bp @@ -42,13 +42,16 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.thermal@1.1", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.thermal@1.1_genc++"], generated_headers: ["android.hardware.thermal@1.1_genc++_headers"], export_generated_headers: ["android.hardware.thermal@1.1_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/thermal/1.1/Android.mk b/thermal/1.1/Android.mk index 082d65b815..059ac8bde7 100644 --- a/thermal/1.1/Android.mk +++ b/thermal/1.1/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.thermal-V1.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build IThermal.hal @@ -59,62 +61,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.thermal-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.thermal-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build IThermal.hal -# -GEN := $(intermediates)/android/hardware/thermal/V1_1/IThermal.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermal.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IThermalCallback.hal -$(GEN): $(LOCAL_PATH)/IThermalCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.1::IThermal - -$(GEN): $(LOCAL_PATH)/IThermal.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IThermalCallback.hal -# -GEN := $(intermediates)/android/hardware/thermal/V1_1/IThermalCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermalCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.1::IThermalCallback - -$(GEN): $(LOCAL_PATH)/IThermalCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tv/cec/1.0/Android.mk b/tv/cec/1.0/Android.mk index 1e3853d08e..7cccf90cd0 100644 --- a/tv/cec/1.0/Android.mk +++ b/tv/cec/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (AbortReason) @@ -290,293 +292,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tv.cec-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (AbortReason) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/AbortReason.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.AbortReason - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CecDeviceType) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/CecDeviceType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.CecDeviceType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CecLogicalAddress) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/CecLogicalAddress.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.CecLogicalAddress - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CecMessage) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/CecMessage.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.CecMessage - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CecMessageType) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/CecMessageType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.CecMessageType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HdmiPortInfo) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/HdmiPortInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.HdmiPortInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HdmiPortType) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/HdmiPortType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.HdmiPortType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HotplugEvent) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/HotplugEvent.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.HotplugEvent - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (MaxLength) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/MaxLength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.MaxLength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OptionKey) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/OptionKey.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.OptionKey - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Result) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/Result.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.Result - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SendMessageResult) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/SendMessageResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.SendMessageResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IHdmiCec.hal -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/IHdmiCec.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IHdmiCec.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IHdmiCecCallback.hal -$(GEN): $(LOCAL_PATH)/IHdmiCecCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::IHdmiCec - -$(GEN): $(LOCAL_PATH)/IHdmiCec.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IHdmiCecCallback.hal -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/IHdmiCecCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IHdmiCecCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::IHdmiCecCallback - -$(GEN): $(LOCAL_PATH)/IHdmiCecCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/usb/1.0/Android.mk b/usb/1.0/Android.mk index 62f69354bc..32d03a3142 100644 --- a/usb/1.0/Android.mk +++ b/usb/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (PortDataRole) @@ -195,199 +197,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.usb-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (PortDataRole) -# -GEN := $(intermediates)/android/hardware/usb/V1_0/PortDataRole.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::types.PortDataRole - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PortMode) -# -GEN := $(intermediates)/android/hardware/usb/V1_0/PortMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::types.PortMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PortPowerRole) -# -GEN := $(intermediates)/android/hardware/usb/V1_0/PortPowerRole.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::types.PortPowerRole - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PortRole) -# -GEN := $(intermediates)/android/hardware/usb/V1_0/PortRole.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::types.PortRole - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PortRoleType) -# -GEN := $(intermediates)/android/hardware/usb/V1_0/PortRoleType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::types.PortRoleType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PortStatus) -# -GEN := $(intermediates)/android/hardware/usb/V1_0/PortStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::types.PortStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Status) -# -GEN := $(intermediates)/android/hardware/usb/V1_0/Status.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::types.Status - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IUsb.hal -# -GEN := $(intermediates)/android/hardware/usb/V1_0/IUsb.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsb.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IUsbCallback.hal -$(GEN): $(LOCAL_PATH)/IUsbCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::IUsb - -$(GEN): $(LOCAL_PATH)/IUsb.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IUsbCallback.hal -# -GEN := $(intermediates)/android/hardware/usb/V1_0/IUsbCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsbCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::IUsbCallback - -$(GEN): $(LOCAL_PATH)/IUsbCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/usb/1.1/Android.mk b/usb/1.1/Android.mk index 12d306b922..57147f18e5 100644 --- a/usb/1.1/Android.mk +++ b/usb/1.1/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.usb-V1.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (PortMode_1_1) @@ -97,101 +99,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.usb-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.usb-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (PortMode_1_1) -# -GEN := $(intermediates)/android/hardware/usb/V1_1/PortMode_1_1.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.1::types.PortMode_1_1 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PortStatus_1_1) -# -GEN := $(intermediates)/android/hardware/usb/V1_1/PortStatus_1_1.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.1::types.PortStatus_1_1 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IUsb.hal -# -GEN := $(intermediates)/android/hardware/usb/V1_1/IUsb.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsb.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.1::IUsb - -$(GEN): $(LOCAL_PATH)/IUsb.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IUsbCallback.hal -# -GEN := $(intermediates)/android/hardware/usb/V1_1/IUsbCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsbCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.1::IUsbCallback - -$(GEN): $(LOCAL_PATH)/IUsbCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/vibrator/1.0/Android.mk b/vibrator/1.0/Android.mk index c54b655a39..4e03392f32 100644 --- a/vibrator/1.0/Android.mk +++ b/vibrator/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Effect) @@ -96,100 +98,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.vibrator-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (Effect) -# -GEN := $(intermediates)/android/hardware/vibrator/V1_0/Effect.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.vibrator@1.0::types.Effect - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (EffectStrength) -# -GEN := $(intermediates)/android/hardware/vibrator/V1_0/EffectStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.vibrator@1.0::types.EffectStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Status) -# -GEN := $(intermediates)/android/hardware/vibrator/V1_0/Status.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.vibrator@1.0::types.Status - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IVibrator.hal -# -GEN := $(intermediates)/android/hardware/vibrator/V1_0/IVibrator.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVibrator.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.vibrator@1.0::IVibrator - -$(GEN): $(LOCAL_PATH)/IVibrator.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/vibrator/1.1/Android.mk b/vibrator/1.1/Android.mk index 2344e9141d..d08f8376d9 100644 --- a/vibrator/1.1/Android.mk +++ b/vibrator/1.1/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.vibrator-V1.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Effect_1_1) @@ -59,63 +61,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.vibrator-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.vibrator-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (Effect_1_1) -# -GEN := $(intermediates)/android/hardware/vibrator/V1_1/Effect_1_1.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.vibrator@1.1::types.Effect_1_1 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IVibrator.hal -# -GEN := $(intermediates)/android/hardware/vibrator/V1_1/IVibrator.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVibrator.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.vibrator@1.1::IVibrator - -$(GEN): $(LOCAL_PATH)/IVibrator.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/vr/1.0/Android.mk b/vr/1.0/Android.mk index fc5c675d12..1115963032 100644 --- a/vr/1.0/Android.mk +++ b/vr/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build IVr.hal @@ -37,40 +39,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.vr-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build IVr.hal -# -GEN := $(intermediates)/android/hardware/vr/V1_0/IVr.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVr.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.vr@1.0::IVr - -$(GEN): $(LOCAL_PATH)/IVr.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/weaver/1.0/Android.mk b/weaver/1.0/Android.mk index 7f35b4e2fd..ab33a158db 100644 --- a/weaver/1.0/Android.mk +++ b/weaver/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (WeaverConfig) @@ -115,118 +117,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.weaver-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (WeaverConfig) -# -GEN := $(intermediates)/android/hardware/weaver/V1_0/WeaverConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.weaver@1.0::types.WeaverConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WeaverReadResponse) -# -GEN := $(intermediates)/android/hardware/weaver/V1_0/WeaverReadResponse.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.weaver@1.0::types.WeaverReadResponse - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WeaverReadStatus) -# -GEN := $(intermediates)/android/hardware/weaver/V1_0/WeaverReadStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.weaver@1.0::types.WeaverReadStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WeaverStatus) -# -GEN := $(intermediates)/android/hardware/weaver/V1_0/WeaverStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.weaver@1.0::types.WeaverStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWeaver.hal -# -GEN := $(intermediates)/android/hardware/weaver/V1_0/IWeaver.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWeaver.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.weaver@1.0::IWeaver - -$(GEN): $(LOCAL_PATH)/IWeaver.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/wifi/1.0/Android.mk b/wifi/1.0/Android.mk index bceb635203..b89724ca73 100644 --- a/wifi/1.0/Android.mk +++ b/wifi/1.0/Android.mk @@ -1883,1887 +1883,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.wifi-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (IfaceType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IfaceType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.IfaceType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanBandIndex) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanBandIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanBandIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanBandSpecificConfig) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanBandSpecificConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanBandSpecificConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanCapabilities) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanCapabilities.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanCapabilities - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanCipherSuiteType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanCipherSuiteType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanCipherSuiteType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanClusterEventInd) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanClusterEventInd.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanClusterEventInd - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanClusterEventType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanClusterEventType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanClusterEventType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanConfigRequest) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanConfigRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanConfigRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanDataPathChannelCfg) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathChannelCfg.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanDataPathChannelCfg - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanDataPathConfirmInd) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathConfirmInd.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanDataPathConfirmInd - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanDataPathRequestInd) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathRequestInd.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanDataPathRequestInd - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanDataPathSecurityConfig) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathSecurityConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanDataPathSecurityConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanDataPathSecurityType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathSecurityType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanDataPathSecurityType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanDebugConfig) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDebugConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanDebugConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanDiscoveryCommonConfig) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDiscoveryCommonConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanDiscoveryCommonConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanEnableRequest) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanEnableRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanEnableRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanFollowupReceivedInd) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanFollowupReceivedInd.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanFollowupReceivedInd - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanInitiateDataPathRequest) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanInitiateDataPathRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanInitiateDataPathRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanMatchAlg) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanMatchAlg.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanMatchAlg - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanMatchInd) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanMatchInd.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanMatchInd - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanParamSizeLimits) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanParamSizeLimits.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanParamSizeLimits - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanPublishRequest) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanPublishRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanPublishRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanPublishType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanPublishType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanPublishType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanRangingIndication) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanRangingIndication.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanRangingIndication - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanRespondToDataPathIndicationRequest) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanRespondToDataPathIndicationRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanRespondToDataPathIndicationRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanSrfType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanSrfType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanSrfType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanStatusType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanStatusType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanStatusType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanSubscribeRequest) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanSubscribeRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanSubscribeRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanSubscribeType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanSubscribeType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanSubscribeType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanTransmitFollowupRequest) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanTransmitFollowupRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanTransmitFollowupRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanTxType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanTxType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanTxType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttBw) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttBw.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttBw - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttCapabilities) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttCapabilities.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttCapabilities - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttConfig) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttLciInformation) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttLciInformation.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttLciInformation - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttLcrInformation) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttLcrInformation.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttLcrInformation - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttMotionPattern) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttMotionPattern.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttMotionPattern - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttPeerType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttPeerType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttPeerType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttPreamble) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttPreamble.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttPreamble - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttResponder) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttResponder.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttResponder - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttResult) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttStatus) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaApfPacketFilterCapabilities) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaApfPacketFilterCapabilities.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaApfPacketFilterCapabilities - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaBackgroundScanBucketEventReportSchemeMask) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaBackgroundScanBucketEventReportSchemeMask.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaBackgroundScanBucketEventReportSchemeMask - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaBackgroundScanBucketParameters) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaBackgroundScanBucketParameters.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaBackgroundScanBucketParameters - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaBackgroundScanCapabilities) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaBackgroundScanCapabilities.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaBackgroundScanCapabilities - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaBackgroundScanParameters) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaBackgroundScanParameters.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaBackgroundScanParameters - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaLinkLayerIfacePacketStats) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaLinkLayerIfacePacketStats.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaLinkLayerIfacePacketStats - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaLinkLayerIfaceStats) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaLinkLayerIfaceStats.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaLinkLayerIfaceStats - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaLinkLayerRadioStats) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaLinkLayerRadioStats.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaLinkLayerRadioStats - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaLinkLayerStats) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaLinkLayerStats.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaLinkLayerStats - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaRoamingCapabilities) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaRoamingCapabilities.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaRoamingCapabilities - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaRoamingConfig) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaRoamingConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaRoamingConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaRoamingState) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaRoamingState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaRoamingState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaScanData) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaScanData.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaScanData - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaScanDataFlagMask) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaScanDataFlagMask.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaScanDataFlagMask - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaScanLimits) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaScanLimits.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaScanLimits - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaScanResult) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaScanResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaScanResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiBand) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiBand.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiBand - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiChannelInfo) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiChannelInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiChannelInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiChannelWidthInMhz) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiChannelWidthInMhz.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiChannelWidthInMhz - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugHostWakeReasonRxIcmpPacketDetails) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugHostWakeReasonRxIcmpPacketDetails.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxIcmpPacketDetails - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugHostWakeReasonRxMulticastPacketDetails) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugHostWakeReasonRxMulticastPacketDetails.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxMulticastPacketDetails - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugHostWakeReasonRxPacketDetails) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugHostWakeReasonRxPacketDetails.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxPacketDetails - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugHostWakeReasonStats) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugHostWakeReasonStats.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonStats - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugPacketFateFrameInfo) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugPacketFateFrameInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugPacketFateFrameInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugPacketFateFrameType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugPacketFateFrameType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugPacketFateFrameType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugRingBufferFlags) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingBufferFlags.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugRingBufferFlags - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugRingBufferStatus) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingBufferStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugRingBufferStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugRingBufferVerboseLevel) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingBufferVerboseLevel.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugRingBufferVerboseLevel - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugRxPacketFate) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRxPacketFate.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugRxPacketFate - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugRxPacketFateReport) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRxPacketFateReport.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugRxPacketFateReport - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugTxPacketFate) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugTxPacketFate.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugTxPacketFate - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugTxPacketFateReport) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugTxPacketFateReport.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugTxPacketFateReport - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiInformationElement) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiInformationElement.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiInformationElement - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiNanStatus) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiNanStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiNanStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiRateInfo) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiRateInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiRateInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiRateNss) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiRateNss.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiRateNss - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiRatePreamble) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiRatePreamble.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiRatePreamble - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiStatus) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiStatusCode) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiStatusCode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiStatusCode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifi.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifi.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifi.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiChip.hal -$(GEN): $(LOCAL_PATH)/IWifiChip.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiEventCallback.hal -$(GEN): $(LOCAL_PATH)/IWifiEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifi - -$(GEN): $(LOCAL_PATH)/IWifi.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiApIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiApIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiApIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal -$(GEN): $(LOCAL_PATH)/IWifiIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiApIface - -$(GEN): $(LOCAL_PATH)/IWifiApIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiChip.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiChip.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiChip.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiApIface.hal -$(GEN): $(LOCAL_PATH)/IWifiApIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiChipEventCallback.hal -$(GEN): $(LOCAL_PATH)/IWifiChipEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal -$(GEN): $(LOCAL_PATH)/IWifiIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiNanIface.hal -$(GEN): $(LOCAL_PATH)/IWifiNanIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiP2pIface.hal -$(GEN): $(LOCAL_PATH)/IWifiP2pIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiRttController.hal -$(GEN): $(LOCAL_PATH)/IWifiRttController.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiStaIface.hal -$(GEN): $(LOCAL_PATH)/IWifiStaIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiChip - -$(GEN): $(LOCAL_PATH)/IWifiChip.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiChipEventCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiChipEventCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiChipEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiChipEventCallback - -$(GEN): $(LOCAL_PATH)/IWifiChipEventCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiEventCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiEventCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiEventCallback - -$(GEN): $(LOCAL_PATH)/IWifiEventCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiIface - -$(GEN): $(LOCAL_PATH)/IWifiIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiNanIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiNanIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiNanIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal -$(GEN): $(LOCAL_PATH)/IWifiIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiNanIfaceEventCallback.hal -$(GEN): $(LOCAL_PATH)/IWifiNanIfaceEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiNanIface - -$(GEN): $(LOCAL_PATH)/IWifiNanIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiNanIfaceEventCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiNanIfaceEventCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiNanIfaceEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiNanIfaceEventCallback - -$(GEN): $(LOCAL_PATH)/IWifiNanIfaceEventCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiP2pIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiP2pIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiP2pIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal -$(GEN): $(LOCAL_PATH)/IWifiIface.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiP2pIface - -$(GEN): $(LOCAL_PATH)/IWifiP2pIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiRttController.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiRttController.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiRttController.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal -$(GEN): $(LOCAL_PATH)/IWifiIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiRttControllerEventCallback.hal -$(GEN): $(LOCAL_PATH)/IWifiRttControllerEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiRttController - -$(GEN): $(LOCAL_PATH)/IWifiRttController.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiRttControllerEventCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiRttControllerEventCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiRttControllerEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiRttControllerEventCallback - -$(GEN): $(LOCAL_PATH)/IWifiRttControllerEventCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiStaIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiStaIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiStaIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal -$(GEN): $(LOCAL_PATH)/IWifiIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiStaIfaceEventCallback.hal -$(GEN): $(LOCAL_PATH)/IWifiStaIfaceEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiStaIface - -$(GEN): $(LOCAL_PATH)/IWifiStaIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiStaIfaceEventCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiStaIfaceEventCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiStaIfaceEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiStaIfaceEventCallback - -$(GEN): $(LOCAL_PATH)/IWifiStaIfaceEventCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/wifi/1.1/Android.mk b/wifi/1.1/Android.mk index fbc79ca159..5f4bc6a471 100644 --- a/wifi/1.1/Android.mk +++ b/wifi/1.1/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.wifi-V1.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build IWifi.hal @@ -57,60 +59,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.wifi-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.wifi-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build IWifi.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_1/IWifi.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifi.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.1::IWifi - -$(GEN): $(LOCAL_PATH)/IWifi.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiChip.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_1/IWifiChip.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiChip.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.1::IWifiChip - -$(GEN): $(LOCAL_PATH)/IWifiChip.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/wifi/supplicant/1.0/Android.mk b/wifi/supplicant/1.0/Android.mk index 770ed884fb..14a1270ef3 100644 --- a/wifi/supplicant/1.0/Android.mk +++ b/wifi/supplicant/1.0/Android.mk @@ -383,386 +383,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.wifi.supplicant-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (IfaceType) -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/IfaceType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::types.IfaceType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (P2pGroupCapabilityMask) -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/P2pGroupCapabilityMask.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::types.P2pGroupCapabilityMask - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SupplicantStatus) -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/SupplicantStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::types.SupplicantStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SupplicantStatusCode) -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/SupplicantStatusCode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::types.SupplicantStatusCode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WpsConfigMethods) -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/WpsConfigMethods.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::types.WpsConfigMethods - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicant.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicant.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicant.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantCallback.hal -$(GEN): $(LOCAL_PATH)/ISupplicantCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantIface.hal -$(GEN): $(LOCAL_PATH)/ISupplicantIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicant - -$(GEN): $(LOCAL_PATH)/ISupplicant.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantCallback - -$(GEN): $(LOCAL_PATH)/ISupplicantCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantNetwork.hal -$(GEN): $(LOCAL_PATH)/ISupplicantNetwork.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantIface - -$(GEN): $(LOCAL_PATH)/ISupplicantIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantNetwork.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantNetwork.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantNetwork.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantNetwork - -$(GEN): $(LOCAL_PATH)/ISupplicantNetwork.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantP2pIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantP2pIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantIface.hal -$(GEN): $(LOCAL_PATH)/ISupplicantIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantP2pIfaceCallback.hal -$(GEN): $(LOCAL_PATH)/ISupplicantP2pIfaceCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantP2pIface - -$(GEN): $(LOCAL_PATH)/ISupplicantP2pIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantP2pIfaceCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantP2pIfaceCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantP2pIfaceCallback - -$(GEN): $(LOCAL_PATH)/ISupplicantP2pIfaceCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantP2pNetwork.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantP2pNetwork.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantP2pNetwork.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantNetwork.hal -$(GEN): $(LOCAL_PATH)/ISupplicantNetwork.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantP2pNetworkCallback.hal -$(GEN): $(LOCAL_PATH)/ISupplicantP2pNetworkCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantP2pNetwork - -$(GEN): $(LOCAL_PATH)/ISupplicantP2pNetwork.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantP2pNetworkCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantP2pNetworkCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantP2pNetworkCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantP2pNetworkCallback - -$(GEN): $(LOCAL_PATH)/ISupplicantP2pNetworkCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantStaIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantStaIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantStaIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantIface.hal -$(GEN): $(LOCAL_PATH)/ISupplicantIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantStaIfaceCallback.hal -$(GEN): $(LOCAL_PATH)/ISupplicantStaIfaceCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantStaIface - -$(GEN): $(LOCAL_PATH)/ISupplicantStaIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantStaIfaceCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantStaIfaceCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantStaIfaceCallback - -$(GEN): $(LOCAL_PATH)/ISupplicantStaIfaceCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantStaNetwork.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantStaNetwork.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantNetwork.hal -$(GEN): $(LOCAL_PATH)/ISupplicantNetwork.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantStaNetworkCallback.hal -$(GEN): $(LOCAL_PATH)/ISupplicantStaNetworkCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantStaNetwork - -$(GEN): $(LOCAL_PATH)/ISupplicantStaNetwork.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantStaNetworkCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantStaNetworkCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantStaNetworkCallback - -$(GEN): $(LOCAL_PATH)/ISupplicantStaNetworkCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) From 701a5bdda51a8b2feddbb5e82a3ac3bbc6ce3fdd Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Thu, 10 Aug 2017 12:32:45 -0700 Subject: [PATCH 132/265] Widen dummy band range to cover all regions. Bug: b/64115131 Test: VTS, instrumentation Change-Id: I34e9aac440a003226200243c835e6116ba7eae90 --- broadcastradio/1.1/default/BroadcastRadio.cpp | 30 +++++++++++++------ broadcastradio/1.1/default/BroadcastRadio.h | 2 +- broadcastradio/1.1/default/Tuner.cpp | 2 +- broadcastradio/1.1/utils/Utils.cpp | 29 ++++++++++-------- .../include/broadcastradio-utils/Utils.h | 3 ++ 5 files changed, 42 insertions(+), 24 deletions(-) diff --git a/broadcastradio/1.1/default/BroadcastRadio.cpp b/broadcastradio/1.1/default/BroadcastRadio.cpp index ce7a10f5c9..38b4b99007 100644 --- a/broadcastradio/1.1/default/BroadcastRadio.cpp +++ b/broadcastradio/1.1/default/BroadcastRadio.cpp @@ -44,17 +44,29 @@ static const map gModuleConfigs{ {Class::AM_FM, ModuleConfig({ "Digital radio mock", { // amFmBands + AmFmBandConfig({ + Band::AM, + 153, // lowerLimit + 26100, // upperLimit + {5, 9, 10}, // spacings + }), + AmFmBandConfig({ + Band::FM, + 65800, // lowerLimit + 108000, // upperLimit + {10, 100, 200}, // spacings + }), AmFmBandConfig({ Band::AM_HD, - 540, // lowerLimit - 1610, // upperLimit - 10, // spacing + 153, // lowerLimit + 26100, // upperLimit + {5, 9, 10}, // spacings }), AmFmBandConfig({ Band::FM_HD, 87900, // lowerLimit 107900, // upperLimit - 200, // spacing + {200}, // spacings }), }, })}, @@ -114,14 +126,14 @@ Return BroadcastRadio::getProperties_1_1(getProperties_1_1_cb _hidl_cb) { dst.antennaConnected = true; dst.lowerLimit = src.lowerLimit; dst.upperLimit = src.upperLimit; - dst.spacings = vector({src.spacing}); + dst.spacings = src.spacings; - if (src.type == Band::AM) { + if (utils::isAm(src.type)) { dst.ext.am.stereo = true; - } else if (src.type == Band::FM) { - dst.ext.fm.deemphasis = Deemphasis::D75; + } else if (utils::isFm(src.type)) { + dst.ext.fm.deemphasis = static_cast(Deemphasis::D50 | Deemphasis::D75); dst.ext.fm.stereo = true; - dst.ext.fm.rds = Rds::US; + dst.ext.fm.rds = static_cast(Rds::WORLD | Rds::US); dst.ext.fm.ta = true; dst.ext.fm.af = true; dst.ext.fm.ea = true; diff --git a/broadcastradio/1.1/default/BroadcastRadio.h b/broadcastradio/1.1/default/BroadcastRadio.h index 71e3be8aec..a96a2ab933 100644 --- a/broadcastradio/1.1/default/BroadcastRadio.h +++ b/broadcastradio/1.1/default/BroadcastRadio.h @@ -31,7 +31,7 @@ struct AmFmBandConfig { V1_0::Band type; uint32_t lowerLimit; // kHz uint32_t upperLimit; // kHz - uint32_t spacing; // kHz + std::vector spacings; // kHz }; struct ModuleConfig { diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp index 87964d3f75..9a34cb128c 100644 --- a/broadcastradio/1.1/default/Tuner.cpp +++ b/broadcastradio/1.1/default/Tuner.cpp @@ -83,7 +83,7 @@ Return Tuner::setConfiguration(const BandConfig& config) { mAmfmConfig.antennaConnected = true; mCurrentProgram = utils::make_selector(mAmfmConfig.type, mAmfmConfig.lowerLimit); - if (mAmfmConfig.type == Band::FM_HD || mAmfmConfig.type == Band::FM) { + if (utils::isFm(mAmfmConfig.type)) { mVirtualRadio = std::ref(getFmRadio()); } else { mVirtualRadio = std::ref(getAmRadio()); diff --git a/broadcastradio/1.1/utils/Utils.cpp b/broadcastradio/1.1/utils/Utils.cpp index 50a407c7b7..e880ca05c9 100644 --- a/broadcastradio/1.1/utils/Utils.cpp +++ b/broadcastradio/1.1/utils/Utils.cpp @@ -119,6 +119,14 @@ bool isAmFm(const ProgramType type) { } } +bool isAm(const Band band) { + return band == Band::AM || band == Band::AM_HD; +} + +bool isFm(const Band band) { + return band == Band::FM || band == Band::FM_HD; +} + bool hasId(const ProgramSelector& sel, const IdentifierType type) { auto itype = static_cast(type); if (sel.primaryId.type == itype) return true; @@ -153,17 +161,12 @@ ProgramSelector make_selector(Band band, uint32_t channel, uint32_t subChannel) // we can't use ProgramType::AM_HD or FM_HD, because we don't know HD station ID ProgramType type; - switch (band) { - case Band::AM: - case Band::AM_HD: - type = ProgramType::AM; - break; - case Band::FM: - case Band::FM_HD: - type = ProgramType::FM; - break; - default: - LOG_ALWAYS_FATAL("Unsupported band: %s", toString(band).c_str()); + if (isAm(band)) { + type = ProgramType::AM; + } else if (isFm(band)) { + type = ProgramType::FM; + } else { + LOG_ALWAYS_FATAL("Unsupported band: %s", toString(band).c_str()); } sel.programType = static_cast(type); @@ -219,9 +222,9 @@ bool operator==(const BandConfig& l, const BandConfig& r) { if (l.lowerLimit != r.lowerLimit) return false; if (l.upperLimit != r.upperLimit) return false; if (l.spacings != r.spacings) return false; - if (l.type == Band::AM || l.type == Band::AM_HD) { + if (V1_1::utils::isAm(l.type)) { return l.ext.am == r.ext.am; - } else if (l.type == Band::FM || l.type == Band::FM_HD) { + } else if (V1_1::utils::isFm(l.type)) { return l.ext.fm == r.ext.fm; } else { ALOGW("Unsupported band config type: %s", toString(l.type).c_str()); diff --git a/broadcastradio/1.1/utils/include/broadcastradio-utils/Utils.h b/broadcastradio/1.1/utils/include/broadcastradio-utils/Utils.h index 4d69c0a6aa..24c60ee460 100644 --- a/broadcastradio/1.1/utils/include/broadcastradio-utils/Utils.h +++ b/broadcastradio/1.1/utils/include/broadcastradio-utils/Utils.h @@ -48,6 +48,9 @@ bool tunesTo(const ProgramSelector& pointer, const ProgramSelector& channel); ProgramType getType(const ProgramSelector& sel); bool isAmFm(const ProgramType type); +bool isAm(const V1_0::Band band); +bool isFm(const V1_0::Band band); + bool hasId(const ProgramSelector& sel, const IdentifierType type); /** From 394b343ae5a5348f7b2992ff341c7204d8d38cb5 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Mon, 7 Aug 2017 18:00:28 -0700 Subject: [PATCH 133/265] Update broadcastradio HAL 1.0 VTS tests. This is a cherry-pick of the following VTS changes from O MR1 to O: - ag/2462390: Fix Broadcast radio 1.0 VTS to not fail on other radio types than AM/FM. - ag/2477726: Make tuned field description more precise and fix VTS tests to obey it. - ag/2549733: Implement out-of-band metadata images (a test for in-band). Additionally, it fixes config callback handling in OpenTunerTwice test. Bug: b/64324703 Test: VTS Change-Id: I590b9b4d927fb0cd41f92e919343b5b94ad0e246 --- .../VtsHalBroadcastradioV1_0TargetTest.cpp | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp b/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp index fa0f030d09..fd048db35d 100644 --- a/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp +++ b/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp @@ -229,7 +229,18 @@ class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase, bool getProperties(); bool openTuner(); bool checkAntenna(); - BandConfig& getBand(unsigned idx); + + /** + * Retrieves AM/FM band configuration from module properties. + * + * The configuration may not exist: if radio type is other than AM/FM + * or provided index is out of bounds. + * In such case, empty configuration is returned. + * + * @param idx Band index to retrieve. + * @return Band configuration reference. + */ + const BandConfig& getBand(unsigned idx); static const nsecs_t kConnectCallbacktimeoutNs = seconds_to_nanoseconds(1); static const nsecs_t kConfigCallbacktimeoutNs = seconds_to_nanoseconds(10); @@ -349,7 +360,7 @@ bool BroadcastRadioHidlTest::checkAntenna() return ((halResult == Result::OK) && (halConfig.antennaConnected == true)); } -BandConfig& BroadcastRadioHidlTest::getBand(unsigned idx) { +const BandConfig& BroadcastRadioHidlTest::getBand(unsigned idx) { static BandConfig dummyBandConfig = {}; if (radioClass == Class::AM_FM) { EXPECT_GT(mHalProperties.bands.size(), idx); @@ -419,8 +430,12 @@ TEST_P(BroadcastRadioHidlTest, OpenTunerTwice) { auto openCb = [&](Result result, const sp&) { halResult = result; }; auto hidlReturn = mRadio->openTuner(getBand(0), true, mTunerCallback, openCb); EXPECT_TRUE(hidlReturn.isOk()); - if (halResult == Result::INVALID_STATE) { - EXPECT_TRUE(waitForCallback(kConfigCallbacktimeoutNs)); + if (halResult == Result::OK) { + if (radioClass == Class::AM_FM) { + EXPECT_TRUE(waitForCallback(kConfigCallbacktimeoutNs)); + } + } else { + EXPECT_EQ(Result::INVALID_STATE, halResult); } } @@ -432,6 +447,9 @@ TEST_P(BroadcastRadioHidlTest, OpenTunerTwice) { * - the methods return 0 (no error) * - the configuration callback is received within kConfigCallbacktimeoutNs ns * - the configuration read back from HAl has the same class Id + * + * Skipped for other radio classes than AM/FM, because setConfiguration + * applies only for these bands. */ TEST_P(BroadcastRadioHidlTest, SetAndGetConfiguration) { if (radioClass != Class::AM_FM) skipped = true; @@ -467,6 +485,9 @@ TEST_P(BroadcastRadioHidlTest, SetAndGetConfiguration) { * Verifies that: * - the methods returns INVALID_ARGUMENTS on invalid arguments * - the method recovers and succeeds after passing correct arguments + * + * Skipped for other radio classes than AM/FM, because setConfiguration + * applies only for these bands. */ TEST_P(BroadcastRadioHidlTest, SetConfigurationFails) { if (radioClass != Class::AM_FM) skipped = true; @@ -531,6 +552,9 @@ TEST_P(BroadcastRadioHidlTest, Scan) { * - the method returns 0 (no error) * - the tuned callback is received within kTuneCallbacktimeoutNs ns * - skipping sub-channel or not does not fail the call + * + * Skipped for other radio classes than AM/FM, because step is not possible + * on DAB nor satellite. */ TEST_P(BroadcastRadioHidlTest, Step) { if (radioClass != Class::AM_FM) skipped = true; @@ -559,6 +583,9 @@ TEST_P(BroadcastRadioHidlTest, Step) { * - the HAL implements the methods * - the methods return 0 (no error) * - the tuned callback is received within kTuneCallbacktimeoutNs ns after tune() + * + * Skipped for other radio classes than AM/FM, because tune to frequency + * is not possible on DAB nor satellite. */ TEST_P(BroadcastRadioHidlTest, TuneAndGetProgramInformationAndCancel) { if (radioClass != Class::AM_FM) skipped = true; @@ -617,6 +644,9 @@ TEST_P(BroadcastRadioHidlTest, TuneAndGetProgramInformationAndCancel) { * Verifies that: * - the method returns INVALID_ARGUMENTS when applicable * - the method recovers and succeeds after passing correct arguments + * + * Skipped for other radio classes than AM/FM, because tune to frequency + * is not possible on DAB nor satellite. */ TEST_P(BroadcastRadioHidlTest, TuneFailsOutOfBounds) { if (radioClass != Class::AM_FM) skipped = true; From 04c2a19598fadcfb77a4231e3dd8eef832d55356 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Fri, 11 Aug 2017 14:52:56 -0700 Subject: [PATCH 134/265] Tetheroffload tests static link to HAL def libs. Bug: 64040096 Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --skip-preconditions --module VtsHalTetherOffloadControlV1_0Target Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --skip-preconditions --module VtsHalTetherOffloadConfigV1_0Target Change-Id: Ib771c07646f3e219c7b9ba4be5515552d7fd6348 --- .../config/1.0/vts/functional/Android.bp | 17 ++--------------- .../control/1.0/vts/functional/Android.bp | 15 ++------------- 2 files changed, 4 insertions(+), 28 deletions(-) diff --git a/tetheroffload/config/1.0/vts/functional/Android.bp b/tetheroffload/config/1.0/vts/functional/Android.bp index 2e720c6855..dc95eaa28d 100644 --- a/tetheroffload/config/1.0/vts/functional/Android.bp +++ b/tetheroffload/config/1.0/vts/functional/Android.bp @@ -14,20 +14,7 @@ cc_test { name: "VtsHalTetheroffloadConfigV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalTetheroffloadConfigV1_0TargetTest.cpp"], - shared_libs: [ - "android.hardware.tetheroffload.config@1.0", - "libbase", - "libcutils", - "libhidlbase", - "libhidltransport", - "liblog", - "libutils", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], + static_libs: ["android.hardware.tetheroffload.config@1.0"], } diff --git a/tetheroffload/control/1.0/vts/functional/Android.bp b/tetheroffload/control/1.0/vts/functional/Android.bp index 69fac6e57f..c6216a2f97 100644 --- a/tetheroffload/control/1.0/vts/functional/Android.bp +++ b/tetheroffload/control/1.0/vts/functional/Android.bp @@ -14,21 +14,10 @@ cc_test { name: "VtsHalTetheroffloadControlV1_0TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalTetheroffloadControlV1_0TargetTest.cpp"], - shared_libs: [ + static_libs: [ "android.hardware.tetheroffload.config@1.0", "android.hardware.tetheroffload.control@1.0", - "libbase", - "libcutils", - "libhidlbase", - "libhidltransport", - "liblog", - "libutils", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", ], } From 1020ebedfbf7c5014896266a98de562a6116d4a2 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Fri, 11 Aug 2017 22:56:24 +0000 Subject: [PATCH 135/265] Revert "Updating all makefiles." This reverts commit 8ac1971678999c46338d751fdaec16c2e4bd78cb. Reason for revert: Didn't remove automotive changes from this CL. Merged-In: I8608c8f636c35f21e4246a805a9eff6d14124e0a Change-Id: I1c660cffc8817ad0b33da9f6eceb3d88e7c48416 --- automotive/vehicle/2.0/Android.mk | 974 +++++++- automotive/vehicle/2.1/Android.mk | 361 ++- biometrics/fingerprint/2.1/Android.mk | 233 +- bluetooth/1.0/Android.mk | 81 + boot/1.0/Android.mk | 77 + camera/common/1.0/Android.mk | 185 +- camera/metadata/3.2/Android.mk | 1230 +++++++++- configstore/1.0/Android.mk | 153 ++ configstore/1.1/Android.mk | 38 +- contexthub/1.0/Android.mk | 328 ++- gatekeeper/1.0/Android.mk | 77 +- gnss/1.0/Android.mk | 524 ++++- graphics/common/1.0/Android.mk | 147 +- health/1.0/Android.mk | 134 +- ir/1.0/Android.mk | 58 + light/2.0/Android.mk | 134 +- memtrack/1.0/Android.mk | 115 +- nfc/1.0/Android.mk | 100 + oemlock/1.0/Android.mk | 77 +- power/1.0/Android.mk | 134 +- power/1.1/Android.mk | 78 +- radio/1.0/Android.mk | 3055 +++++++++++++++++++++++++ radio/1.1/Android.mk | 386 ++++ radio/deprecated/1.0/Android.mk | 80 + tests/baz/1.0/Android.mk | 98 + tests/expression/1.0/Android.mk | 58 + tests/extension/light/2.0/Android.mk | 97 +- tests/hash/1.0/Android.mk | 37 + tests/inheritance/1.0/Android.mk | 104 + tests/libhwbinder/1.0/Android.mk | 56 + tests/multithread/1.0/Android.mk | 37 + tetheroffload/control/1.0/Android.mk | 136 ++ thermal/1.0/Android.mk | 172 +- thermal/1.1/Android.bp | 5 +- thermal/1.1/Android.mk | 59 +- tv/cec/1.0/Android.mk | 290 ++- usb/1.0/Android.mk | 195 +- usb/1.1/Android.mk | 97 +- vibrator/1.0/Android.mk | 96 +- vibrator/1.1/Android.mk | 59 +- vr/1.0/Android.mk | 37 +- weaver/1.0/Android.mk | 115 +- wifi/1.0/Android.mk | 1881 +++++++++++++++ wifi/1.1/Android.mk | 57 +- wifi/supplicant/1.0/Android.mk | 381 +++ 45 files changed, 12768 insertions(+), 58 deletions(-) diff --git a/automotive/vehicle/2.0/Android.mk b/automotive/vehicle/2.0/Android.mk index 5dc3b9e93e..eb05f35eca 100644 --- a/automotive/vehicle/2.0/Android.mk +++ b/automotive/vehicle/2.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (StatusCode) @@ -976,5 +974,977 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.automotive.vehicle-V2.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (StatusCode) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/StatusCode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.StatusCode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SubscribeFlags) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/SubscribeFlags.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.SubscribeFlags + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SubscribeOptions) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/SubscribeOptions.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.SubscribeOptions + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleApPowerBootupReason) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleApPowerBootupReason.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleApPowerBootupReason + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleApPowerSetState) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleApPowerSetState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleApPowerSetState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleApPowerState) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleApPowerState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleApPowerState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleApPowerStateConfigFlag) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleApPowerStateConfigFlag.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleApPowerStateConfigFlag + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleApPowerStateIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleApPowerStateIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleApPowerStateIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleApPowerStateShutdownParam) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleApPowerStateShutdownParam.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleApPowerStateShutdownParam + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleArea) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleArea.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleArea + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAreaConfig) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAreaConfig.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAreaConfig + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAreaDoor) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAreaDoor.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAreaDoor + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAreaMirror) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAreaMirror.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAreaMirror + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAreaSeat) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAreaSeat.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAreaSeat + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAreaWindow) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAreaWindow.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAreaWindow + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAreaZone) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAreaZone.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAreaZone + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAudioContextFlag) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioContextFlag.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAudioContextFlag + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAudioExtFocusFlag) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioExtFocusFlag.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAudioExtFocusFlag + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAudioFocusIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioFocusIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAudioFocusIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAudioFocusRequest) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioFocusRequest.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAudioFocusRequest + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAudioFocusState) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioFocusState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAudioFocusState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAudioHwVariantConfigFlag) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioHwVariantConfigFlag.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAudioHwVariantConfigFlag + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAudioRoutingPolicyIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioRoutingPolicyIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAudioRoutingPolicyIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAudioStream) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioStream.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAudioStream + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAudioStreamFlag) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioStreamFlag.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAudioStreamFlag + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAudioVolumeCapabilityFlag) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioVolumeCapabilityFlag.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAudioVolumeCapabilityFlag + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAudioVolumeIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioVolumeIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAudioVolumeIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAudioVolumeLimitIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioVolumeLimitIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAudioVolumeLimitIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleAudioVolumeState) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleAudioVolumeState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleAudioVolumeState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleDisplay) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleDisplay.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleDisplay + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleDrivingStatus) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleDrivingStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleDrivingStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleGear) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleGear.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleGear + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleHvacFanDirection) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleHvacFanDirection.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleHvacFanDirection + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleHwKeyInputAction) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleHwKeyInputAction.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleHwKeyInputAction + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleIgnitionState) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleIgnitionState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleIgnitionState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleInstrumentClusterType) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleInstrumentClusterType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleInstrumentClusterType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehiclePropConfig) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehiclePropConfig.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehiclePropConfig + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehiclePropValue) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehiclePropValue.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehiclePropValue + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleProperty) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleProperty.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleProperty + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehiclePropertyAccess) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehiclePropertyAccess.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehiclePropertyAccess + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehiclePropertyChangeMode) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehiclePropertyChangeMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehiclePropertyChangeMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehiclePropertyGroup) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehiclePropertyGroup.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehiclePropertyGroup + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehiclePropertyOperation) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehiclePropertyOperation.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehiclePropertyOperation + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehiclePropertyType) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehiclePropertyType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehiclePropertyType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleRadioConstants) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleRadioConstants.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleRadioConstants + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleTurnSignal) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleTurnSignal.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleTurnSignal + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleUnit) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VehicleUnit.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VehicleUnit + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Wheel) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Wheel.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Wheel + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IVehicle.hal +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/IVehicle.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVehicle.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IVehicleCallback.hal +$(GEN): $(LOCAL_PATH)/IVehicleCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::IVehicle + +$(GEN): $(LOCAL_PATH)/IVehicle.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IVehicleCallback.hal +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/IVehicleCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVehicleCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::IVehicleCallback + +$(GEN): $(LOCAL_PATH)/IVehicleCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/automotive/vehicle/2.1/Android.mk b/automotive/vehicle/2.1/Android.mk index 6078fb4e92..3001da05c4 100644 --- a/automotive/vehicle/2.1/Android.mk +++ b/automotive/vehicle/2.1/Android.mk @@ -16,8 +16,6 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.automotive.vehicle-V2.0-java \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (DiagnosticFloatSensorIndex) @@ -363,5 +361,364 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.automotive.vehicle-V2.1-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hardware.automotive.vehicle-V2.0-java-static \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (DiagnosticFloatSensorIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/DiagnosticFloatSensorIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.DiagnosticFloatSensorIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (DiagnosticIntegerSensorIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/DiagnosticIntegerSensorIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.DiagnosticIntegerSensorIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2CommonIgnitionMonitors) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2CommonIgnitionMonitors.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.Obd2CommonIgnitionMonitors + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2CompressionIgnitionMonitors) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2CompressionIgnitionMonitors.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.Obd2CompressionIgnitionMonitors + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2FuelSystemStatus) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2FuelSystemStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.Obd2FuelSystemStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2FuelType) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2FuelType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.Obd2FuelType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2IgnitionMonitorKind) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2IgnitionMonitorKind.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.Obd2IgnitionMonitorKind + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2SecondaryAirStatus) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2SecondaryAirStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.Obd2SecondaryAirStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2SparkIgnitionMonitors) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2SparkIgnitionMonitors.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.Obd2SparkIgnitionMonitors + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VehicleProperty) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VehicleProperty.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VehicleProperty + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsAvailabilityStateIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsAvailabilityStateIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsAvailabilityStateIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsBaseMessageIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsBaseMessageIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsBaseMessageIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsMessageType) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsMessageType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsMessageWithLayerAndPublisherIdIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageWithLayerAndPublisherIdIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsMessageWithLayerAndPublisherIdIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsMessageWithLayerIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageWithLayerIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsMessageWithLayerIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsOfferingMessageIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsOfferingMessageIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsOfferingMessageIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsSubscriptionsStateIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsSubscriptionsStateIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::types.VmsSubscriptionsStateIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IVehicle.hal +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/IVehicle.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVehicle.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.1::IVehicle + +$(GEN): $(LOCAL_PATH)/IVehicle.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/biometrics/fingerprint/2.1/Android.mk b/biometrics/fingerprint/2.1/Android.mk index 304f6a90d9..2f3237162c 100644 --- a/biometrics/fingerprint/2.1/Android.mk +++ b/biometrics/fingerprint/2.1/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (FingerprintAcquired) @@ -235,5 +233,236 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.biometrics.fingerprint-V2.1-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (FingerprintAcquired) +# +GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintAcquired.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.biometrics.fingerprint@2.1::types.FingerprintAcquired + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (FingerprintAcquiredInfo) +# +GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintAcquiredInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.biometrics.fingerprint@2.1::types.FingerprintAcquiredInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (FingerprintAuthenticated) +# +GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintAuthenticated.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.biometrics.fingerprint@2.1::types.FingerprintAuthenticated + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (FingerprintEnroll) +# +GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintEnroll.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.biometrics.fingerprint@2.1::types.FingerprintEnroll + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (FingerprintError) +# +GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintError.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.biometrics.fingerprint@2.1::types.FingerprintError + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (FingerprintFingerId) +# +GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintFingerId.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.biometrics.fingerprint@2.1::types.FingerprintFingerId + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (FingerprintIterator) +# +GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintIterator.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.biometrics.fingerprint@2.1::types.FingerprintIterator + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (FingerprintMsgType) +# +GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintMsgType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.biometrics.fingerprint@2.1::types.FingerprintMsgType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RequestStatus) +# +GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/RequestStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.biometrics.fingerprint@2.1::types.RequestStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IBiometricsFingerprint.hal +# +GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBiometricsFingerprint.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IBiometricsFingerprintClientCallback.hal +$(GEN): $(LOCAL_PATH)/IBiometricsFingerprintClientCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.biometrics.fingerprint@2.1::IBiometricsFingerprint + +$(GEN): $(LOCAL_PATH)/IBiometricsFingerprint.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IBiometricsFingerprintClientCallback.hal +# +GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBiometricsFingerprintClientCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.biometrics.fingerprint@2.1::IBiometricsFingerprintClientCallback + +$(GEN): $(LOCAL_PATH)/IBiometricsFingerprintClientCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/bluetooth/1.0/Android.mk b/bluetooth/1.0/Android.mk index 5937e0f3a2..5dade87f51 100644 --- a/bluetooth/1.0/Android.mk +++ b/bluetooth/1.0/Android.mk @@ -83,5 +83,86 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.bluetooth-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build types.hal (Status) +# +GEN := $(intermediates)/android/hardware/bluetooth/V1_0/Status.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.bluetooth@1.0::types.Status + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IBluetoothHci.hal +# +GEN := $(intermediates)/android/hardware/bluetooth/V1_0/IBluetoothHci.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBluetoothHci.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IBluetoothHciCallbacks.hal +$(GEN): $(LOCAL_PATH)/IBluetoothHciCallbacks.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.bluetooth@1.0::IBluetoothHci + +$(GEN): $(LOCAL_PATH)/IBluetoothHci.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IBluetoothHciCallbacks.hal +# +GEN := $(intermediates)/android/hardware/bluetooth/V1_0/IBluetoothHciCallbacks.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBluetoothHciCallbacks.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.bluetooth@1.0::IBluetoothHciCallbacks + +$(GEN): $(LOCAL_PATH)/IBluetoothHciCallbacks.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/boot/1.0/Android.mk b/boot/1.0/Android.mk index 253742b9e5..5ef55f31d8 100644 --- a/boot/1.0/Android.mk +++ b/boot/1.0/Android.mk @@ -79,5 +79,82 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.boot-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build types.hal (BoolResult) +# +GEN := $(intermediates)/android/hardware/boot/V1_0/BoolResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.boot@1.0::types.BoolResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CommandResult) +# +GEN := $(intermediates)/android/hardware/boot/V1_0/CommandResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.boot@1.0::types.CommandResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IBootControl.hal +# +GEN := $(intermediates)/android/hardware/boot/V1_0/IBootControl.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBootControl.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.boot@1.0::IBootControl + +$(GEN): $(LOCAL_PATH)/IBootControl.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/camera/common/1.0/Android.mk b/camera/common/1.0/Android.mk index c2e7075628..47bfb31b1b 100644 --- a/camera/common/1.0/Android.mk +++ b/camera/common/1.0/Android.mk @@ -11,8 +11,6 @@ LOCAL_MODULE_CLASS := JAVA_LIBRARIES intermediates := $(call local-generated-sources-dir, COMMON) HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (CameraDeviceStatus) @@ -187,5 +185,188 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.camera.common-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +# +# Build types.hal (CameraDeviceStatus) +# +GEN := $(intermediates)/android/hardware/camera/common/V1_0/CameraDeviceStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.common@1.0::types.CameraDeviceStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataType) +# +GEN := $(intermediates)/android/hardware/camera/common/V1_0/CameraMetadataType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.common@1.0::types.CameraMetadataType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraResourceCost) +# +GEN := $(intermediates)/android/hardware/camera/common/V1_0/CameraResourceCost.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.common@1.0::types.CameraResourceCost + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Status) +# +GEN := $(intermediates)/android/hardware/camera/common/V1_0/Status.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.common@1.0::types.Status + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (TagBoundaryId) +# +GEN := $(intermediates)/android/hardware/camera/common/V1_0/TagBoundaryId.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.common@1.0::types.TagBoundaryId + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (TorchMode) +# +GEN := $(intermediates)/android/hardware/camera/common/V1_0/TorchMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.common@1.0::types.TorchMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (TorchModeStatus) +# +GEN := $(intermediates)/android/hardware/camera/common/V1_0/TorchModeStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.common@1.0::types.TorchModeStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VendorTag) +# +GEN := $(intermediates)/android/hardware/camera/common/V1_0/VendorTag.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.common@1.0::types.VendorTag + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VendorTagSection) +# +GEN := $(intermediates)/android/hardware/camera/common/V1_0/VendorTagSection.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.common@1.0::types.VendorTagSection + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/camera/metadata/3.2/Android.mk b/camera/metadata/3.2/Android.mk index f9508b5fc0..935c37cd1e 100644 --- a/camera/metadata/3.2/Android.mk +++ b/camera/metadata/3.2/Android.mk @@ -11,8 +11,6 @@ LOCAL_MODULE_CLASS := JAVA_LIBRARIES intermediates := $(call local-generated-sources-dir, COMMON) HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (CameraMetadataEnumAndroidBlackLevelLock) @@ -1232,5 +1230,1233 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.camera.metadata-V3.2-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +# +# Build types.hal (CameraMetadataEnumAndroidBlackLevelLock) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidBlackLevelLock.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidBlackLevelLock + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidColorCorrectionAberrationMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidColorCorrectionAberrationMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidColorCorrectionAberrationMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidColorCorrectionMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidColorCorrectionMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidColorCorrectionMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlAeAntibandingMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeAntibandingMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeAntibandingMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlAeLock) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeLock.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeLock + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlAeLockAvailable) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeLockAvailable.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeLockAvailable + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlAeMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlAePrecaptureTrigger) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAePrecaptureTrigger.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAePrecaptureTrigger + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlAeState) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlAfMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAfMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAfMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlAfState) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAfState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAfState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlAfTrigger) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAfTrigger.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAfTrigger + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlAwbLock) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAwbLock.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAwbLock + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlAwbLockAvailable) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAwbLockAvailable.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAwbLockAvailable + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlAwbMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAwbMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAwbMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlAwbState) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAwbState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAwbState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlCaptureIntent) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlCaptureIntent.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlCaptureIntent + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlEffectMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlEffectMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlEffectMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlEnableZsl) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlEnableZsl.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlEnableZsl + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlSceneMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlSceneMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlSceneMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidControlVideoStabilizationMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlVideoStabilizationMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlVideoStabilizationMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidDemosaicMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidDemosaicMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidDemosaicMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidDepthAvailableDepthStreamConfigurations) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidDepthAvailableDepthStreamConfigurations.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidDepthAvailableDepthStreamConfigurations + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidDepthDepthIsExclusive) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidDepthDepthIsExclusive.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidDepthDepthIsExclusive + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidEdgeMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidEdgeMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidEdgeMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidFlashInfoAvailable) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidFlashInfoAvailable.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidFlashInfoAvailable + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidFlashMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidFlashMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidFlashMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidFlashState) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidFlashState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidFlashState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidHotPixelMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidHotPixelMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidHotPixelMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidInfoSupportedHardwareLevel) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidInfoSupportedHardwareLevel.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidInfoSupportedHardwareLevel + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidLedAvailableLeds) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLedAvailableLeds.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLedAvailableLeds + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidLedTransmit) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLedTransmit.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLedTransmit + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidLensFacing) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLensFacing.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLensFacing + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidLensInfoFocusDistanceCalibration) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLensInfoFocusDistanceCalibration.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLensInfoFocusDistanceCalibration + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidLensOpticalStabilizationMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLensOpticalStabilizationMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLensOpticalStabilizationMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidLensState) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLensState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLensState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidNoiseReductionMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidNoiseReductionMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidNoiseReductionMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidQuirksPartialResult) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidQuirksPartialResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidQuirksPartialResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidRequestAvailableCapabilities) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidRequestAvailableCapabilities.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidRequestAvailableCapabilities + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidRequestMetadataMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidRequestMetadataMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidRequestMetadataMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidRequestType) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidRequestType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidRequestType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidScalerAvailableFormats) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidScalerAvailableFormats.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidScalerAvailableFormats + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidScalerAvailableStreamConfigurations) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidScalerAvailableStreamConfigurations.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidScalerAvailableStreamConfigurations + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidScalerCroppingType) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidScalerCroppingType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidScalerCroppingType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidSensorInfoColorFilterArrangement) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorInfoColorFilterArrangement.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorInfoColorFilterArrangement + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidSensorInfoLensShadingApplied) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorInfoLensShadingApplied.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorInfoLensShadingApplied + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidSensorInfoTimestampSource) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorInfoTimestampSource.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorInfoTimestampSource + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidSensorReferenceIlluminant1) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorReferenceIlluminant1.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorReferenceIlluminant1 + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidSensorTestPatternMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorTestPatternMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorTestPatternMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidShadingMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidShadingMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidShadingMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidStatisticsFaceDetectMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsFaceDetectMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsFaceDetectMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidStatisticsHistogramMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsHistogramMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsHistogramMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidStatisticsHotPixelMapMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsHotPixelMapMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsHotPixelMapMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidStatisticsLensShadingMapMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsLensShadingMapMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsLensShadingMapMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidStatisticsSceneFlicker) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsSceneFlicker.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsSceneFlicker + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidStatisticsSharpnessMapMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsSharpnessMapMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsSharpnessMapMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidSyncFrameNumber) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSyncFrameNumber.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSyncFrameNumber + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidSyncMaxLatency) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSyncMaxLatency.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSyncMaxLatency + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidTonemapMode) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidTonemapMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidTonemapMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataEnumAndroidTonemapPresetCurve) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidTonemapPresetCurve.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidTonemapPresetCurve + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataSection) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataSection.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataSection + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataSectionStart) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataSectionStart.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataSectionStart + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CameraMetadataTag) +# +GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataTag.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.camera.metadata@3.2::types.CameraMetadataTag + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/configstore/1.0/Android.mk b/configstore/1.0/Android.mk index e050a92407..59eff955f9 100644 --- a/configstore/1.0/Android.mk +++ b/configstore/1.0/Android.mk @@ -155,5 +155,158 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.configstore-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build types.hal (OptionalBool) +# +GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalBool.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.configstore@1.0::types.OptionalBool + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (OptionalInt32) +# +GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalInt32.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.configstore@1.0::types.OptionalInt32 + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (OptionalInt64) +# +GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalInt64.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.configstore@1.0::types.OptionalInt64 + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (OptionalString) +# +GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalString.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.configstore@1.0::types.OptionalString + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (OptionalUInt32) +# +GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalUInt32.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.configstore@1.0::types.OptionalUInt32 + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (OptionalUInt64) +# +GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalUInt64.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.configstore@1.0::types.OptionalUInt64 + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISurfaceFlingerConfigs.hal +# +GEN := $(intermediates)/android/hardware/configstore/V1_0/ISurfaceFlingerConfigs.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.configstore@1.0::ISurfaceFlingerConfigs + +$(GEN): $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/configstore/1.1/Android.mk b/configstore/1.1/Android.mk index b3f7053cd9..a5fa6c4796 100644 --- a/configstore/1.1/Android.mk +++ b/configstore/1.1/Android.mk @@ -16,8 +16,6 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.configstore-V1.0-java \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build ISurfaceFlingerConfigs.hal @@ -40,5 +38,41 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.configstore-V1.1-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hardware.configstore-V1.0-java-static \ + android.hidl.base-V1.0-java-static \ + + +# +# Build ISurfaceFlingerConfigs.hal +# +GEN := $(intermediates)/android/hardware/configstore/V1_1/ISurfaceFlingerConfigs.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.configstore@1.1::ISurfaceFlingerConfigs + +$(GEN): $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/contexthub/1.0/Android.mk b/contexthub/1.0/Android.mk index 47bfd8fca9..d161e3b092 100644 --- a/contexthub/1.0/Android.mk +++ b/contexthub/1.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (AsyncEventType) @@ -330,5 +328,331 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.contexthub-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (AsyncEventType) +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/AsyncEventType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::types.AsyncEventType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ContextHub) +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/ContextHub.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::types.ContextHub + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ContextHubMsg) +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/ContextHubMsg.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::types.ContextHubMsg + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (HostEndPoint) +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/HostEndPoint.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::types.HostEndPoint + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (HubAppInfo) +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/HubAppInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::types.HubAppInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (HubMemoryFlag) +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/HubMemoryFlag.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::types.HubMemoryFlag + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (HubMemoryType) +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/HubMemoryType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::types.HubMemoryType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (MemRange) +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/MemRange.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::types.MemRange + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanoAppBinary) +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/NanoAppBinary.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::types.NanoAppBinary + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanoAppFlags) +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/NanoAppFlags.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::types.NanoAppFlags + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PhysicalSensor) +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/PhysicalSensor.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::types.PhysicalSensor + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Result) +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/Result.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::types.Result + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SensorType) +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/SensorType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::types.SensorType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (TransactionResult) +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/TransactionResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::types.TransactionResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IContexthub.hal +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/IContexthub.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IContexthub.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IContexthubCallback.hal +$(GEN): $(LOCAL_PATH)/IContexthubCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::IContexthub + +$(GEN): $(LOCAL_PATH)/IContexthub.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IContexthubCallback.hal +# +GEN := $(intermediates)/android/hardware/contexthub/V1_0/IContexthubCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IContexthubCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.contexthub@1.0::IContexthubCallback + +$(GEN): $(LOCAL_PATH)/IContexthubCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/gatekeeper/1.0/Android.mk b/gatekeeper/1.0/Android.mk index debc0d961b..576f729a23 100644 --- a/gatekeeper/1.0/Android.mk +++ b/gatekeeper/1.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (GatekeeperResponse) @@ -79,5 +77,80 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.gatekeeper-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (GatekeeperResponse) +# +GEN := $(intermediates)/android/hardware/gatekeeper/V1_0/GatekeeperResponse.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gatekeeper@1.0::types.GatekeeperResponse + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (GatekeeperStatusCode) +# +GEN := $(intermediates)/android/hardware/gatekeeper/V1_0/GatekeeperStatusCode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gatekeeper@1.0::types.GatekeeperStatusCode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGatekeeper.hal +# +GEN := $(intermediates)/android/hardware/gatekeeper/V1_0/IGatekeeper.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGatekeeper.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gatekeeper@1.0::IGatekeeper + +$(GEN): $(LOCAL_PATH)/IGatekeeper.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/gnss/1.0/Android.mk b/gnss/1.0/Android.mk index 1cb3945bf0..bb1b765d8c 100644 --- a/gnss/1.0/Android.mk +++ b/gnss/1.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (GnssConstellationType) @@ -526,6 +524,528 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.gnss-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (GnssConstellationType) +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/GnssConstellationType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::types.GnssConstellationType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (GnssLocation) +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/GnssLocation.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::types.GnssLocation + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (GnssLocationFlags) +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/GnssLocationFlags.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::types.GnssLocationFlags + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (GnssMax) +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/GnssMax.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::types.GnssMax + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IAGnss.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IAGnss.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IAGnss.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IAGnssCallback.hal +$(GEN): $(LOCAL_PATH)/IAGnssCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IAGnss + +$(GEN): $(LOCAL_PATH)/IAGnss.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IAGnssCallback.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IAGnssCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IAGnssCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IAGnssCallback + +$(GEN): $(LOCAL_PATH)/IAGnssCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IAGnssRil.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IAGnssRil.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IAGnssRil.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IAGnssRilCallback.hal +$(GEN): $(LOCAL_PATH)/IAGnssRilCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IAGnssRil + +$(GEN): $(LOCAL_PATH)/IAGnssRil.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IAGnssRilCallback.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IAGnssRilCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IAGnssRilCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IAGnssRilCallback + +$(GEN): $(LOCAL_PATH)/IAGnssRilCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnss.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnss.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnss.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IAGnss.hal +$(GEN): $(LOCAL_PATH)/IAGnss.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IAGnssRil.hal +$(GEN): $(LOCAL_PATH)/IAGnssRil.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssBatching.hal +$(GEN): $(LOCAL_PATH)/IGnssBatching.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssCallback.hal +$(GEN): $(LOCAL_PATH)/IGnssCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssConfiguration.hal +$(GEN): $(LOCAL_PATH)/IGnssConfiguration.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssDebug.hal +$(GEN): $(LOCAL_PATH)/IGnssDebug.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssGeofencing.hal +$(GEN): $(LOCAL_PATH)/IGnssGeofencing.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssMeasurement.hal +$(GEN): $(LOCAL_PATH)/IGnssMeasurement.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssNavigationMessage.hal +$(GEN): $(LOCAL_PATH)/IGnssNavigationMessage.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssNi.hal +$(GEN): $(LOCAL_PATH)/IGnssNi.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssXtra.hal +$(GEN): $(LOCAL_PATH)/IGnssXtra.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnss + +$(GEN): $(LOCAL_PATH)/IGnss.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssBatching.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssBatching.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssBatching.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssBatchingCallback.hal +$(GEN): $(LOCAL_PATH)/IGnssBatchingCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssBatching + +$(GEN): $(LOCAL_PATH)/IGnssBatching.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssBatchingCallback.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssBatchingCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssBatchingCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssBatchingCallback + +$(GEN): $(LOCAL_PATH)/IGnssBatchingCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssCallback.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssCallback + +$(GEN): $(LOCAL_PATH)/IGnssCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssConfiguration.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssConfiguration.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssConfiguration.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssConfiguration + +$(GEN): $(LOCAL_PATH)/IGnssConfiguration.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssDebug.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssDebug.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssDebug.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssDebug + +$(GEN): $(LOCAL_PATH)/IGnssDebug.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssGeofenceCallback.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssGeofenceCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssGeofenceCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssGeofenceCallback + +$(GEN): $(LOCAL_PATH)/IGnssGeofenceCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssGeofencing.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssGeofencing.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssGeofencing.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssGeofenceCallback.hal +$(GEN): $(LOCAL_PATH)/IGnssGeofenceCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssGeofencing + +$(GEN): $(LOCAL_PATH)/IGnssGeofencing.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssMeasurement.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssMeasurement.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssMeasurement.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssMeasurementCallback.hal +$(GEN): $(LOCAL_PATH)/IGnssMeasurementCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssMeasurement + +$(GEN): $(LOCAL_PATH)/IGnssMeasurement.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssMeasurementCallback.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssMeasurementCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssMeasurementCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssMeasurementCallback + +$(GEN): $(LOCAL_PATH)/IGnssMeasurementCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssNavigationMessage.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssNavigationMessage.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssNavigationMessage.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssNavigationMessageCallback.hal +$(GEN): $(LOCAL_PATH)/IGnssNavigationMessageCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssNavigationMessage + +$(GEN): $(LOCAL_PATH)/IGnssNavigationMessage.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssNavigationMessageCallback.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssNavigationMessageCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssNavigationMessageCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssNavigationMessageCallback + +$(GEN): $(LOCAL_PATH)/IGnssNavigationMessageCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssNi.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssNi.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssNi.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssNiCallback.hal +$(GEN): $(LOCAL_PATH)/IGnssNiCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssNi + +$(GEN): $(LOCAL_PATH)/IGnssNi.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssNiCallback.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssNiCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssNiCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssNiCallback + +$(GEN): $(LOCAL_PATH)/IGnssNiCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssXtra.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssXtra.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssXtra.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssXtraCallback.hal +$(GEN): $(LOCAL_PATH)/IGnssXtraCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssXtra + +$(GEN): $(LOCAL_PATH)/IGnssXtra.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGnssXtraCallback.hal +# +GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssXtraCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssXtraCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.gnss@1.0::IGnssXtraCallback + +$(GEN): $(LOCAL_PATH)/IGnssXtraCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + ################################################################################ include $(CLEAR_VARS) diff --git a/graphics/common/1.0/Android.mk b/graphics/common/1.0/Android.mk index 3fd948e47f..569a5f444a 100644 --- a/graphics/common/1.0/Android.mk +++ b/graphics/common/1.0/Android.mk @@ -11,8 +11,6 @@ LOCAL_MODULE_CLASS := JAVA_LIBRARIES intermediates := $(call local-generated-sources-dir, COMMON) HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (BufferUsage) @@ -149,6 +147,151 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.graphics.common-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +# +# Build types.hal (BufferUsage) +# +GEN := $(intermediates)/android/hardware/graphics/common/V1_0/BufferUsage.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.graphics.common@1.0::types.BufferUsage + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ColorMode) +# +GEN := $(intermediates)/android/hardware/graphics/common/V1_0/ColorMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.graphics.common@1.0::types.ColorMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ColorTransform) +# +GEN := $(intermediates)/android/hardware/graphics/common/V1_0/ColorTransform.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.graphics.common@1.0::types.ColorTransform + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Dataspace) +# +GEN := $(intermediates)/android/hardware/graphics/common/V1_0/Dataspace.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.graphics.common@1.0::types.Dataspace + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Hdr) +# +GEN := $(intermediates)/android/hardware/graphics/common/V1_0/Hdr.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.graphics.common@1.0::types.Hdr + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PixelFormat) +# +GEN := $(intermediates)/android/hardware/graphics/common/V1_0/PixelFormat.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.graphics.common@1.0::types.PixelFormat + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Transform) +# +GEN := $(intermediates)/android/hardware/graphics/common/V1_0/Transform.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.graphics.common@1.0::types.Transform + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + ################################################################################ include $(CLEAR_VARS) diff --git a/health/1.0/Android.mk b/health/1.0/Android.mk index 3b47239500..b03b868691 100644 --- a/health/1.0/Android.mk +++ b/health/1.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (BatteryHealth) @@ -136,6 +134,138 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.health-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (BatteryHealth) +# +GEN := $(intermediates)/android/hardware/health/V1_0/BatteryHealth.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.health@1.0::types.BatteryHealth + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (BatteryStatus) +# +GEN := $(intermediates)/android/hardware/health/V1_0/BatteryStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.health@1.0::types.BatteryStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (HealthConfig) +# +GEN := $(intermediates)/android/hardware/health/V1_0/HealthConfig.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.health@1.0::types.HealthConfig + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (HealthInfo) +# +GEN := $(intermediates)/android/hardware/health/V1_0/HealthInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.health@1.0::types.HealthInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Result) +# +GEN := $(intermediates)/android/hardware/health/V1_0/Result.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.health@1.0::types.Result + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IHealth.hal +# +GEN := $(intermediates)/android/hardware/health/V1_0/IHealth.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IHealth.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.health@1.0::IHealth + +$(GEN): $(LOCAL_PATH)/IHealth.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + ################################################################################ include $(CLEAR_VARS) diff --git a/ir/1.0/Android.mk b/ir/1.0/Android.mk index eca46f5a94..96812df854 100644 --- a/ir/1.0/Android.mk +++ b/ir/1.0/Android.mk @@ -60,5 +60,63 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.ir-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build types.hal (ConsumerIrFreqRange) +# +GEN := $(intermediates)/android/hardware/ir/V1_0/ConsumerIrFreqRange.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.ir@1.0::types.ConsumerIrFreqRange + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IConsumerIr.hal +# +GEN := $(intermediates)/android/hardware/ir/V1_0/IConsumerIr.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IConsumerIr.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.ir@1.0::IConsumerIr + +$(GEN): $(LOCAL_PATH)/IConsumerIr.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/light/2.0/Android.mk b/light/2.0/Android.mk index 93211e19c8..24d7ab1394 100644 --- a/light/2.0/Android.mk +++ b/light/2.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Brightness) @@ -136,5 +134,137 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.light-V2.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (Brightness) +# +GEN := $(intermediates)/android/hardware/light/V2_0/Brightness.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.light@2.0::types.Brightness + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Flash) +# +GEN := $(intermediates)/android/hardware/light/V2_0/Flash.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.light@2.0::types.Flash + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (LightState) +# +GEN := $(intermediates)/android/hardware/light/V2_0/LightState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.light@2.0::types.LightState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Status) +# +GEN := $(intermediates)/android/hardware/light/V2_0/Status.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.light@2.0::types.Status + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Type) +# +GEN := $(intermediates)/android/hardware/light/V2_0/Type.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.light@2.0::types.Type + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ILight.hal +# +GEN := $(intermediates)/android/hardware/light/V2_0/ILight.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ILight.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.light@2.0::ILight + +$(GEN): $(LOCAL_PATH)/ILight.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/memtrack/1.0/Android.mk b/memtrack/1.0/Android.mk index dfde3850b2..8583b0ab6a 100644 --- a/memtrack/1.0/Android.mk +++ b/memtrack/1.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (MemtrackFlag) @@ -117,5 +115,118 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.memtrack-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (MemtrackFlag) +# +GEN := $(intermediates)/android/hardware/memtrack/V1_0/MemtrackFlag.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.memtrack@1.0::types.MemtrackFlag + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (MemtrackRecord) +# +GEN := $(intermediates)/android/hardware/memtrack/V1_0/MemtrackRecord.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.memtrack@1.0::types.MemtrackRecord + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (MemtrackStatus) +# +GEN := $(intermediates)/android/hardware/memtrack/V1_0/MemtrackStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.memtrack@1.0::types.MemtrackStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (MemtrackType) +# +GEN := $(intermediates)/android/hardware/memtrack/V1_0/MemtrackType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.memtrack@1.0::types.MemtrackType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IMemtrack.hal +# +GEN := $(intermediates)/android/hardware/memtrack/V1_0/IMemtrack.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IMemtrack.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.memtrack@1.0::IMemtrack + +$(GEN): $(LOCAL_PATH)/IMemtrack.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/nfc/1.0/Android.mk b/nfc/1.0/Android.mk index bff25632c2..85ce5508ae 100644 --- a/nfc/1.0/Android.mk +++ b/nfc/1.0/Android.mk @@ -102,6 +102,106 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.nfc-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build types.hal (NfcEvent) +# +GEN := $(intermediates)/android/hardware/nfc/V1_0/NfcEvent.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.nfc@1.0::types.NfcEvent + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NfcStatus) +# +GEN := $(intermediates)/android/hardware/nfc/V1_0/NfcStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.nfc@1.0::types.NfcStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build INfc.hal +# +GEN := $(intermediates)/android/hardware/nfc/V1_0/INfc.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/INfc.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/INfcClientCallback.hal +$(GEN): $(LOCAL_PATH)/INfcClientCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.nfc@1.0::INfc + +$(GEN): $(LOCAL_PATH)/INfc.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build INfcClientCallback.hal +# +GEN := $(intermediates)/android/hardware/nfc/V1_0/INfcClientCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/INfcClientCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.nfc@1.0::INfcClientCallback + +$(GEN): $(LOCAL_PATH)/INfcClientCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + ################################################################################ include $(CLEAR_VARS) diff --git a/oemlock/1.0/Android.mk b/oemlock/1.0/Android.mk index 91cc8f8cbc..d9864414ae 100644 --- a/oemlock/1.0/Android.mk +++ b/oemlock/1.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (OemLockSecureStatus) @@ -79,5 +77,80 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.oemlock-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (OemLockSecureStatus) +# +GEN := $(intermediates)/android/hardware/oemlock/V1_0/OemLockSecureStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.oemlock@1.0::types.OemLockSecureStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (OemLockStatus) +# +GEN := $(intermediates)/android/hardware/oemlock/V1_0/OemLockStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.oemlock@1.0::types.OemLockStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IOemLock.hal +# +GEN := $(intermediates)/android/hardware/oemlock/V1_0/IOemLock.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOemLock.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.oemlock@1.0::IOemLock + +$(GEN): $(LOCAL_PATH)/IOemLock.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/power/1.0/Android.mk b/power/1.0/Android.mk index 414d0c338e..8a89a45269 100644 --- a/power/1.0/Android.mk +++ b/power/1.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Feature) @@ -136,5 +134,137 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.power-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (Feature) +# +GEN := $(intermediates)/android/hardware/power/V1_0/Feature.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.power@1.0::types.Feature + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PowerHint) +# +GEN := $(intermediates)/android/hardware/power/V1_0/PowerHint.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.power@1.0::types.PowerHint + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PowerStatePlatformSleepState) +# +GEN := $(intermediates)/android/hardware/power/V1_0/PowerStatePlatformSleepState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.power@1.0::types.PowerStatePlatformSleepState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PowerStateVoter) +# +GEN := $(intermediates)/android/hardware/power/V1_0/PowerStateVoter.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.power@1.0::types.PowerStateVoter + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Status) +# +GEN := $(intermediates)/android/hardware/power/V1_0/Status.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.power@1.0::types.Status + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IPower.hal +# +GEN := $(intermediates)/android/hardware/power/V1_0/IPower.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IPower.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.power@1.0::IPower + +$(GEN): $(LOCAL_PATH)/IPower.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/power/1.1/Android.mk b/power/1.1/Android.mk index 5044cfa61e..16cfcbd4f2 100644 --- a/power/1.1/Android.mk +++ b/power/1.1/Android.mk @@ -16,8 +16,6 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.power-V1.0-java \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (PowerStateSubsystem) @@ -80,5 +78,81 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.power-V1.1-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hardware.power-V1.0-java-static \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (PowerStateSubsystem) +# +GEN := $(intermediates)/android/hardware/power/V1_1/PowerStateSubsystem.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.power@1.1::types.PowerStateSubsystem + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PowerStateSubsystemSleepState) +# +GEN := $(intermediates)/android/hardware/power/V1_1/PowerStateSubsystemSleepState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.power@1.1::types.PowerStateSubsystemSleepState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IPower.hal +# +GEN := $(intermediates)/android/hardware/power/V1_1/IPower.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IPower.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.power@1.1::IPower + +$(GEN): $(LOCAL_PATH)/IPower.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/radio/1.0/Android.mk b/radio/1.0/Android.mk index 4225120e38..d5ba4cf263 100644 --- a/radio/1.0/Android.mk +++ b/radio/1.0/Android.mk @@ -3057,5 +3057,3060 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.radio-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build types.hal (ActivityStatsInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/ActivityStatsInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.ActivityStatsInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ApnAuthType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/ApnAuthType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.ApnAuthType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ApnTypes) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/ApnTypes.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.ApnTypes + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (AppState) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/AppState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.AppState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (AppStatus) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/AppStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.AppStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (AppType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/AppType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.AppType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Call) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/Call.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.Call + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CallForwardInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CallForwardInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CallForwardInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CallForwardInfoStatus) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CallForwardInfoStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CallForwardInfoStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CallPresentation) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CallPresentation.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CallPresentation + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CallState) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CallState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CallState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CardState) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CardState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CardState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CardStatus) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CardStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CardStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Carrier) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/Carrier.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.Carrier + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CarrierMatchType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CarrierMatchType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CarrierMatchType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CarrierRestrictions) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CarrierRestrictions.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CarrierRestrictions + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaBroadcastSmsConfigInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaBroadcastSmsConfigInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaBroadcastSmsConfigInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaCallWaiting) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaCallWaiting.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaCallWaiting + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaCallWaitingNumberPlan) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaCallWaitingNumberPlan.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaCallWaitingNumberPlan + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaCallWaitingNumberPresentation) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaCallWaitingNumberPresentation.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaCallWaitingNumberPresentation + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaCallWaitingNumberType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaCallWaitingNumberType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaCallWaitingNumberType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaDisplayInfoRecord) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaDisplayInfoRecord.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaDisplayInfoRecord + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaInfoRecName) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaInfoRecName.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaInfoRecName + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaInformationRecord) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaInformationRecord.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaInformationRecord + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaInformationRecords) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaInformationRecords.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaInformationRecords + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaLineControlInfoRecord) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaLineControlInfoRecord.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaLineControlInfoRecord + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaNumberInfoRecord) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaNumberInfoRecord.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaNumberInfoRecord + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaOtaProvisionStatus) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaOtaProvisionStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaOtaProvisionStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaRedirectingNumberInfoRecord) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaRedirectingNumberInfoRecord.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaRedirectingNumberInfoRecord + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaRedirectingReason) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaRedirectingReason.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaRedirectingReason + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaRoamingType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaRoamingType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaRoamingType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSignalInfoRecord) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSignalInfoRecord.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSignalInfoRecord + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSignalStrength) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSignalStrength.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSignalStrength + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSmsAck) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsAck.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSmsAck + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSmsAddress) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsAddress.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSmsAddress + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSmsDigitMode) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsDigitMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSmsDigitMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSmsErrorClass) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsErrorClass.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSmsErrorClass + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSmsMessage) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsMessage.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSmsMessage + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSmsNumberMode) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsNumberMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSmsNumberMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSmsNumberPlan) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsNumberPlan.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSmsNumberPlan + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSmsNumberType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsNumberType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSmsNumberType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSmsSubaddress) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsSubaddress.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSmsSubaddress + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSmsSubaddressType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsSubaddressType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSmsSubaddressType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSmsWriteArgs) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsWriteArgs.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSmsWriteArgs + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSmsWriteArgsStatus) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsWriteArgsStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSmsWriteArgsStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaSubscriptionSource) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSubscriptionSource.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaSubscriptionSource + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaT53AudioControlInfoRecord) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaT53AudioControlInfoRecord.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaT53AudioControlInfoRecord + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CdmaT53ClirInfoRecord) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaT53ClirInfoRecord.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CdmaT53ClirInfoRecord + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CellIdentity) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentity.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CellIdentity + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CellIdentityCdma) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityCdma.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CellIdentityCdma + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CellIdentityGsm) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityGsm.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CellIdentityGsm + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CellIdentityLte) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityLte.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CellIdentityLte + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CellIdentityTdscdma) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityTdscdma.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CellIdentityTdscdma + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CellIdentityWcdma) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityWcdma.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CellIdentityWcdma + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CellInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CellInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CellInfoCdma) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoCdma.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CellInfoCdma + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CellInfoGsm) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoGsm.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CellInfoGsm + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CellInfoLte) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoLte.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CellInfoLte + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CellInfoTdscdma) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoTdscdma.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CellInfoTdscdma + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CellInfoType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CellInfoType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CellInfoWcdma) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoWcdma.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CellInfoWcdma + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CfData) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/CfData.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.CfData + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ClipStatus) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/ClipStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.ClipStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Clir) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/Clir.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.Clir + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (DataCallFailCause) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/DataCallFailCause.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.DataCallFailCause + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (DataProfileId) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/DataProfileId.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.DataProfileId + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (DataProfileInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/DataProfileInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.DataProfileInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (DataProfileInfoType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/DataProfileInfoType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.DataProfileInfoType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (DataRegStateResult) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/DataRegStateResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.DataRegStateResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (DeviceStateType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/DeviceStateType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.DeviceStateType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Dial) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/Dial.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.Dial + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (EvdoSignalStrength) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/EvdoSignalStrength.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.EvdoSignalStrength + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (GsmBroadcastSmsConfigInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/GsmBroadcastSmsConfigInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.GsmBroadcastSmsConfigInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (GsmSignalStrength) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/GsmSignalStrength.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.GsmSignalStrength + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (GsmSmsMessage) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/GsmSmsMessage.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.GsmSmsMessage + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (HardwareConfig) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfig.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.HardwareConfig + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (HardwareConfigModem) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfigModem.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.HardwareConfigModem + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (HardwareConfigSim) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfigSim.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.HardwareConfigSim + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (HardwareConfigState) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfigState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.HardwareConfigState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (HardwareConfigType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfigType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.HardwareConfigType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (IccIo) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/IccIo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.IccIo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (IccIoResult) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/IccIoResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.IccIoResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ImsSmsMessage) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/ImsSmsMessage.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.ImsSmsMessage + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (IndicationFilter) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/IndicationFilter.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.IndicationFilter + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (LastCallFailCause) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/LastCallFailCause.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.LastCallFailCause + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (LastCallFailCauseInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/LastCallFailCauseInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.LastCallFailCauseInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (LceDataInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/LceDataInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.LceDataInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (LceStatus) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/LceStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.LceStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (LceStatusInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/LceStatusInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.LceStatusInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (LteSignalStrength) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/LteSignalStrength.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.LteSignalStrength + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (MvnoType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/MvnoType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.MvnoType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NeighboringCell) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/NeighboringCell.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.NeighboringCell + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NvItem) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/NvItem.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.NvItem + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NvWriteItem) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/NvWriteItem.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.NvWriteItem + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (OperatorInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/OperatorInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.OperatorInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (OperatorStatus) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/OperatorStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.OperatorStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (P2Constant) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/P2Constant.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.P2Constant + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PcoDataInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/PcoDataInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.PcoDataInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PersoSubstate) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/PersoSubstate.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.PersoSubstate + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PhoneRestrictedState) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/PhoneRestrictedState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.PhoneRestrictedState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PinState) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/PinState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.PinState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PreferredNetworkType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/PreferredNetworkType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.PreferredNetworkType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioAccessFamily) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RadioAccessFamily.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RadioAccessFamily + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioBandMode) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RadioBandMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RadioBandMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioCapability) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RadioCapability.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RadioCapability + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioCapabilityPhase) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RadioCapabilityPhase.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RadioCapabilityPhase + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioCapabilityStatus) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RadioCapabilityStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RadioCapabilityStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioCdmaSmsConst) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RadioCdmaSmsConst.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RadioCdmaSmsConst + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioConst) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RadioConst.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RadioConst + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioError) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RadioError.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RadioError + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioIndicationType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RadioIndicationType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RadioIndicationType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioResponseInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RadioResponseInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RadioResponseInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioResponseType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RadioResponseType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RadioResponseType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioState) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RadioState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RadioState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioTechnology) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RadioTechnology.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RadioTechnology + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioTechnologyFamily) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RadioTechnologyFamily.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RadioTechnologyFamily + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RegState) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RegState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RegState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ResetNvType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/ResetNvType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.ResetNvType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RestrictedState) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/RestrictedState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.RestrictedState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SapApduType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SapApduType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SapApduType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SapConnectRsp) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SapConnectRsp.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SapConnectRsp + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SapDisconnectType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SapDisconnectType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SapDisconnectType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SapResultCode) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SapResultCode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SapResultCode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SapStatus) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SapStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SapStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SapTransferProtocol) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SapTransferProtocol.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SapTransferProtocol + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SelectUiccSub) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SelectUiccSub.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SelectUiccSub + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SendSmsResult) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SendSmsResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SendSmsResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SetupDataCallResult) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SetupDataCallResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SetupDataCallResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SignalStrength) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SignalStrength.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SignalStrength + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SimApdu) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SimApdu.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SimApdu + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SimRefreshResult) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SimRefreshResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SimRefreshResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SimRefreshType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SimRefreshType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SimRefreshType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SmsAcknowledgeFailCause) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SmsAcknowledgeFailCause.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SmsAcknowledgeFailCause + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SmsWriteArgs) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SmsWriteArgs.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SmsWriteArgs + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SmsWriteArgsStatus) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SmsWriteArgsStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SmsWriteArgsStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SrvccState) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SrvccState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SrvccState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SsInfoData) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SsInfoData.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SsInfoData + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SsRequestType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SsRequestType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SsRequestType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SsServiceType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SsServiceType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SsServiceType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SsTeleserviceType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SsTeleserviceType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SsTeleserviceType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StkCcUnsolSsResult) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/StkCcUnsolSsResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.StkCcUnsolSsResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SubscriptionType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SubscriptionType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SubscriptionType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SuppServiceClass) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SuppServiceClass.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SuppServiceClass + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SuppSvcNotification) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/SuppSvcNotification.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.SuppSvcNotification + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (TdScdmaSignalStrength) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/TdScdmaSignalStrength.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.TdScdmaSignalStrength + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (TimeStampType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/TimeStampType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.TimeStampType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (TtyMode) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/TtyMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.TtyMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (UiccSubActStatus) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/UiccSubActStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.UiccSubActStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (UssdModeType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/UssdModeType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.UssdModeType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (UusDcs) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/UusDcs.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.UusDcs + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (UusInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/UusInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.UusInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (UusType) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/UusType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.UusType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VoiceRegStateResult) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/VoiceRegStateResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.VoiceRegStateResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WcdmaSignalStrength) +# +GEN := $(intermediates)/android/hardware/radio/V1_0/WcdmaSignalStrength.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::types.WcdmaSignalStrength + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IRadio.hal +# +GEN := $(intermediates)/android/hardware/radio/V1_0/IRadio.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadio.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IRadioIndication.hal +$(GEN): $(LOCAL_PATH)/IRadioIndication.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IRadioResponse.hal +$(GEN): $(LOCAL_PATH)/IRadioResponse.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::IRadio + +$(GEN): $(LOCAL_PATH)/IRadio.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IRadioIndication.hal +# +GEN := $(intermediates)/android/hardware/radio/V1_0/IRadioIndication.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadioIndication.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::IRadioIndication + +$(GEN): $(LOCAL_PATH)/IRadioIndication.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IRadioResponse.hal +# +GEN := $(intermediates)/android/hardware/radio/V1_0/IRadioResponse.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadioResponse.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::IRadioResponse + +$(GEN): $(LOCAL_PATH)/IRadioResponse.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISap.hal +# +GEN := $(intermediates)/android/hardware/radio/V1_0/ISap.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISap.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISapCallback.hal +$(GEN): $(LOCAL_PATH)/ISapCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::ISap + +$(GEN): $(LOCAL_PATH)/ISap.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISapCallback.hal +# +GEN := $(intermediates)/android/hardware/radio/V1_0/ISapCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISapCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.0::ISapCallback + +$(GEN): $(LOCAL_PATH)/ISapCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/radio/1.1/Android.mk b/radio/1.1/Android.mk index 0535bb1e54..74ce516309 100644 --- a/radio/1.1/Android.mk +++ b/radio/1.1/Android.mk @@ -388,5 +388,391 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.radio-V1.1-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hardware.radio-V1.0-java-static \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build types.hal (CardPowerState) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/CardPowerState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.CardPowerState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (EutranBands) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/EutranBands.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.EutranBands + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (GeranBands) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/GeranBands.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.GeranBands + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ImsiEncryptionInfo) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/ImsiEncryptionInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.ImsiEncryptionInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (KeepaliveRequest) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveRequest.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.KeepaliveRequest + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (KeepaliveStatus) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.KeepaliveStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (KeepaliveStatusCode) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveStatusCode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.KeepaliveStatusCode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (KeepaliveType) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.KeepaliveType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NetworkScanRequest) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/NetworkScanRequest.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.NetworkScanRequest + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NetworkScanResult) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/NetworkScanResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.NetworkScanResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioAccessNetworks) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/RadioAccessNetworks.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.RadioAccessNetworks + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RadioAccessSpecifier) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/RadioAccessSpecifier.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.RadioAccessSpecifier + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ScanStatus) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/ScanStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.ScanStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ScanType) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/ScanType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.ScanType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (UtranBands) +# +GEN := $(intermediates)/android/hardware/radio/V1_1/UtranBands.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::types.UtranBands + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IRadio.hal +# +GEN := $(intermediates)/android/hardware/radio/V1_1/IRadio.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadio.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::IRadio + +$(GEN): $(LOCAL_PATH)/IRadio.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IRadioIndication.hal +# +GEN := $(intermediates)/android/hardware/radio/V1_1/IRadioIndication.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadioIndication.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::IRadioIndication + +$(GEN): $(LOCAL_PATH)/IRadioIndication.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IRadioResponse.hal +# +GEN := $(intermediates)/android/hardware/radio/V1_1/IRadioResponse.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadioResponse.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::IRadioResponse + +$(GEN): $(LOCAL_PATH)/IRadioResponse.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISap.hal +# +GEN := $(intermediates)/android/hardware/radio/V1_1/ISap.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISap.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio@1.1::ISap + +$(GEN): $(LOCAL_PATH)/ISap.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/radio/deprecated/1.0/Android.mk b/radio/deprecated/1.0/Android.mk index 2a410b2e95..e7516c85d2 100644 --- a/radio/deprecated/1.0/Android.mk +++ b/radio/deprecated/1.0/Android.mk @@ -82,5 +82,85 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.radio.deprecated-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hardware.radio-V1.0-java-static \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build IOemHook.hal +# +GEN := $(intermediates)/android/hardware/radio/deprecated/V1_0/IOemHook.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOemHook.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IOemHookIndication.hal +$(GEN): $(LOCAL_PATH)/IOemHookIndication.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IOemHookResponse.hal +$(GEN): $(LOCAL_PATH)/IOemHookResponse.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio.deprecated@1.0::IOemHook + +$(GEN): $(LOCAL_PATH)/IOemHook.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IOemHookIndication.hal +# +GEN := $(intermediates)/android/hardware/radio/deprecated/V1_0/IOemHookIndication.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOemHookIndication.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio.deprecated@1.0::IOemHookIndication + +$(GEN): $(LOCAL_PATH)/IOemHookIndication.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IOemHookResponse.hal +# +GEN := $(intermediates)/android/hardware/radio/deprecated/V1_0/IOemHookResponse.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOemHookResponse.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.radio.deprecated@1.0::IOemHookResponse + +$(GEN): $(LOCAL_PATH)/IOemHookResponse.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/baz/1.0/Android.mk b/tests/baz/1.0/Android.mk index 603e552d85..52d6b0ce63 100644 --- a/tests/baz/1.0/Android.mk +++ b/tests/baz/1.0/Android.mk @@ -100,5 +100,103 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.tests.baz-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build IBase.hal +# +GEN := $(intermediates)/android/hardware/tests/baz/V1_0/IBase.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBase.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.baz@1.0::IBase + +$(GEN): $(LOCAL_PATH)/IBase.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IBaz.hal +# +GEN := $(intermediates)/android/hardware/tests/baz/V1_0/IBaz.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBaz.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IBase.hal +$(GEN): $(LOCAL_PATH)/IBase.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IBazCallback.hal +$(GEN): $(LOCAL_PATH)/IBazCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.baz@1.0::IBaz + +$(GEN): $(LOCAL_PATH)/IBaz.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IBazCallback.hal +# +GEN := $(intermediates)/android/hardware/tests/baz/V1_0/IBazCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBazCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.baz@1.0::IBazCallback + +$(GEN): $(LOCAL_PATH)/IBazCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IQuux.hal +# +GEN := $(intermediates)/android/hardware/tests/baz/V1_0/IQuux.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IQuux.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.baz@1.0::IQuux + +$(GEN): $(LOCAL_PATH)/IQuux.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/expression/1.0/Android.mk b/tests/expression/1.0/Android.mk index 7f716fd517..499ec3faf8 100644 --- a/tests/expression/1.0/Android.mk +++ b/tests/expression/1.0/Android.mk @@ -60,5 +60,63 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.tests.expression-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build IExpression.hal +# +GEN := $(intermediates)/android/hardware/tests/expression/V1_0/IExpression.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IExpression.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.expression@1.0::IExpression + +$(GEN): $(LOCAL_PATH)/IExpression.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IExpressionExt.hal +# +GEN := $(intermediates)/android/hardware/tests/expression/V1_0/IExpressionExt.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IExpressionExt.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IExpression.hal +$(GEN): $(LOCAL_PATH)/IExpression.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.expression@1.0::IExpressionExt + +$(GEN): $(LOCAL_PATH)/IExpressionExt.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/extension/light/2.0/Android.mk b/tests/extension/light/2.0/Android.mk index 485230b11a..f1e10e47ee 100644 --- a/tests/extension/light/2.0/Android.mk +++ b/tests/extension/light/2.0/Android.mk @@ -16,8 +16,6 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.light-V2.0-java \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Default) @@ -99,5 +97,100 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.tests.extension.light-V2.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hardware.light-V2.0-java-static \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (Default) +# +GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/Default.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.extension.light@2.0::types.Default + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ExtBrightness) +# +GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/ExtBrightness.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.extension.light@2.0::types.ExtBrightness + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ExtLightState) +# +GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/ExtLightState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.extension.light@2.0::types.ExtLightState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IExtLight.hal +# +GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/IExtLight.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IExtLight.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.extension.light@2.0::IExtLight + +$(GEN): $(LOCAL_PATH)/IExtLight.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/hash/1.0/Android.mk b/tests/hash/1.0/Android.mk index 94a594e709..cd813cb74f 100644 --- a/tests/hash/1.0/Android.mk +++ b/tests/hash/1.0/Android.mk @@ -39,5 +39,42 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.tests.hash-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build IHash.hal +# +GEN := $(intermediates)/android/hardware/tests/hash/V1_0/IHash.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IHash.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.hash@1.0::IHash + +$(GEN): $(LOCAL_PATH)/IHash.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/inheritance/1.0/Android.mk b/tests/inheritance/1.0/Android.mk index f01b9782ff..5b6ccefbcb 100644 --- a/tests/inheritance/1.0/Android.mk +++ b/tests/inheritance/1.0/Android.mk @@ -106,5 +106,109 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.tests.inheritance-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build IChild.hal +# +GEN := $(intermediates)/android/hardware/tests/inheritance/V1_0/IChild.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IChild.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IParent.hal +$(GEN): $(LOCAL_PATH)/IParent.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.inheritance@1.0::IChild + +$(GEN): $(LOCAL_PATH)/IChild.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IFetcher.hal +# +GEN := $(intermediates)/android/hardware/tests/inheritance/V1_0/IFetcher.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IFetcher.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IChild.hal +$(GEN): $(LOCAL_PATH)/IChild.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGrandparent.hal +$(GEN): $(LOCAL_PATH)/IGrandparent.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IParent.hal +$(GEN): $(LOCAL_PATH)/IParent.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.inheritance@1.0::IFetcher + +$(GEN): $(LOCAL_PATH)/IFetcher.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IGrandparent.hal +# +GEN := $(intermediates)/android/hardware/tests/inheritance/V1_0/IGrandparent.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGrandparent.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.inheritance@1.0::IGrandparent + +$(GEN): $(LOCAL_PATH)/IGrandparent.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IParent.hal +# +GEN := $(intermediates)/android/hardware/tests/inheritance/V1_0/IParent.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IParent.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGrandparent.hal +$(GEN): $(LOCAL_PATH)/IGrandparent.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.inheritance@1.0::IParent + +$(GEN): $(LOCAL_PATH)/IParent.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/libhwbinder/1.0/Android.mk b/tests/libhwbinder/1.0/Android.mk index 1ac7681b5a..c821f861e6 100644 --- a/tests/libhwbinder/1.0/Android.mk +++ b/tests/libhwbinder/1.0/Android.mk @@ -58,5 +58,61 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.tests.libhwbinder-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build IBenchmark.hal +# +GEN := $(intermediates)/android/hardware/tests/libhwbinder/V1_0/IBenchmark.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBenchmark.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.libhwbinder@1.0::IBenchmark + +$(GEN): $(LOCAL_PATH)/IBenchmark.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IScheduleTest.hal +# +GEN := $(intermediates)/android/hardware/tests/libhwbinder/V1_0/IScheduleTest.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IScheduleTest.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.libhwbinder@1.0::IScheduleTest + +$(GEN): $(LOCAL_PATH)/IScheduleTest.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/multithread/1.0/Android.mk b/tests/multithread/1.0/Android.mk index a2d2b100e6..08fd8fb6f8 100644 --- a/tests/multithread/1.0/Android.mk +++ b/tests/multithread/1.0/Android.mk @@ -39,5 +39,42 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.tests.multithread-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build IMultithread.hal +# +GEN := $(intermediates)/android/hardware/tests/multithread/V1_0/IMultithread.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IMultithread.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tests.multithread@1.0::IMultithread + +$(GEN): $(LOCAL_PATH)/IMultithread.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tetheroffload/control/1.0/Android.mk b/tetheroffload/control/1.0/Android.mk index 7e642bec24..4185a6671b 100644 --- a/tetheroffload/control/1.0/Android.mk +++ b/tetheroffload/control/1.0/Android.mk @@ -138,5 +138,141 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.tetheroffload.control-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build types.hal (IPv4AddrPortPair) +# +GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/IPv4AddrPortPair.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tetheroffload.control@1.0::types.IPv4AddrPortPair + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NatTimeoutUpdate) +# +GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/NatTimeoutUpdate.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tetheroffload.control@1.0::types.NatTimeoutUpdate + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NetworkProtocol) +# +GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/NetworkProtocol.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tetheroffload.control@1.0::types.NetworkProtocol + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (OffloadCallbackEvent) +# +GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/OffloadCallbackEvent.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tetheroffload.control@1.0::types.OffloadCallbackEvent + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IOffloadControl.hal +# +GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/IOffloadControl.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOffloadControl.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ITetheringOffloadCallback.hal +$(GEN): $(LOCAL_PATH)/ITetheringOffloadCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tetheroffload.control@1.0::IOffloadControl + +$(GEN): $(LOCAL_PATH)/IOffloadControl.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ITetheringOffloadCallback.hal +# +GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ITetheringOffloadCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tetheroffload.control@1.0::ITetheringOffloadCallback + +$(GEN): $(LOCAL_PATH)/ITetheringOffloadCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/thermal/1.0/Android.mk b/thermal/1.0/Android.mk index 0b8206ea27..5a0a9a0a86 100644 --- a/thermal/1.0/Android.mk +++ b/thermal/1.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (CoolingDevice) @@ -174,6 +172,176 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.thermal-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (CoolingDevice) +# +GEN := $(intermediates)/android/hardware/thermal/V1_0/CoolingDevice.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.thermal@1.0::types.CoolingDevice + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CoolingType) +# +GEN := $(intermediates)/android/hardware/thermal/V1_0/CoolingType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.thermal@1.0::types.CoolingType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CpuUsage) +# +GEN := $(intermediates)/android/hardware/thermal/V1_0/CpuUsage.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.thermal@1.0::types.CpuUsage + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Temperature) +# +GEN := $(intermediates)/android/hardware/thermal/V1_0/Temperature.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.thermal@1.0::types.Temperature + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (TemperatureType) +# +GEN := $(intermediates)/android/hardware/thermal/V1_0/TemperatureType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.thermal@1.0::types.TemperatureType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ThermalStatus) +# +GEN := $(intermediates)/android/hardware/thermal/V1_0/ThermalStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.thermal@1.0::types.ThermalStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ThermalStatusCode) +# +GEN := $(intermediates)/android/hardware/thermal/V1_0/ThermalStatusCode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.thermal@1.0::types.ThermalStatusCode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IThermal.hal +# +GEN := $(intermediates)/android/hardware/thermal/V1_0/IThermal.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermal.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.thermal@1.0::IThermal + +$(GEN): $(LOCAL_PATH)/IThermal.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + ################################################################################ include $(CLEAR_VARS) diff --git a/thermal/1.1/Android.bp b/thermal/1.1/Android.bp index 0985d947b6..833f219ed6 100644 --- a/thermal/1.1/Android.bp +++ b/thermal/1.1/Android.bp @@ -42,16 +42,13 @@ genrule { ], } -cc_library { +cc_library_shared { name: "android.hardware.thermal@1.1", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.thermal@1.1_genc++"], generated_headers: ["android.hardware.thermal@1.1_genc++_headers"], export_generated_headers: ["android.hardware.thermal@1.1_genc++_headers"], vendor_available: true, - vndk: { - enabled: true, - }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/thermal/1.1/Android.mk b/thermal/1.1/Android.mk index 059ac8bde7..082d65b815 100644 --- a/thermal/1.1/Android.mk +++ b/thermal/1.1/Android.mk @@ -16,8 +16,6 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.thermal-V1.0-java \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build IThermal.hal @@ -61,5 +59,62 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.thermal-V1.1-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hardware.thermal-V1.0-java-static \ + android.hidl.base-V1.0-java-static \ + + +# +# Build IThermal.hal +# +GEN := $(intermediates)/android/hardware/thermal/V1_1/IThermal.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermal.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IThermalCallback.hal +$(GEN): $(LOCAL_PATH)/IThermalCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.thermal@1.1::IThermal + +$(GEN): $(LOCAL_PATH)/IThermal.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IThermalCallback.hal +# +GEN := $(intermediates)/android/hardware/thermal/V1_1/IThermalCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermalCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.thermal@1.1::IThermalCallback + +$(GEN): $(LOCAL_PATH)/IThermalCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tv/cec/1.0/Android.mk b/tv/cec/1.0/Android.mk index 7cccf90cd0..1e3853d08e 100644 --- a/tv/cec/1.0/Android.mk +++ b/tv/cec/1.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (AbortReason) @@ -292,5 +290,293 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.tv.cec-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (AbortReason) +# +GEN := $(intermediates)/android/hardware/tv/cec/V1_0/AbortReason.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tv.cec@1.0::types.AbortReason + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CecDeviceType) +# +GEN := $(intermediates)/android/hardware/tv/cec/V1_0/CecDeviceType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tv.cec@1.0::types.CecDeviceType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CecLogicalAddress) +# +GEN := $(intermediates)/android/hardware/tv/cec/V1_0/CecLogicalAddress.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tv.cec@1.0::types.CecLogicalAddress + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CecMessage) +# +GEN := $(intermediates)/android/hardware/tv/cec/V1_0/CecMessage.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tv.cec@1.0::types.CecMessage + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (CecMessageType) +# +GEN := $(intermediates)/android/hardware/tv/cec/V1_0/CecMessageType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tv.cec@1.0::types.CecMessageType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (HdmiPortInfo) +# +GEN := $(intermediates)/android/hardware/tv/cec/V1_0/HdmiPortInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tv.cec@1.0::types.HdmiPortInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (HdmiPortType) +# +GEN := $(intermediates)/android/hardware/tv/cec/V1_0/HdmiPortType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tv.cec@1.0::types.HdmiPortType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (HotplugEvent) +# +GEN := $(intermediates)/android/hardware/tv/cec/V1_0/HotplugEvent.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tv.cec@1.0::types.HotplugEvent + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (MaxLength) +# +GEN := $(intermediates)/android/hardware/tv/cec/V1_0/MaxLength.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tv.cec@1.0::types.MaxLength + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (OptionKey) +# +GEN := $(intermediates)/android/hardware/tv/cec/V1_0/OptionKey.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tv.cec@1.0::types.OptionKey + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Result) +# +GEN := $(intermediates)/android/hardware/tv/cec/V1_0/Result.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tv.cec@1.0::types.Result + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SendMessageResult) +# +GEN := $(intermediates)/android/hardware/tv/cec/V1_0/SendMessageResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tv.cec@1.0::types.SendMessageResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IHdmiCec.hal +# +GEN := $(intermediates)/android/hardware/tv/cec/V1_0/IHdmiCec.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IHdmiCec.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IHdmiCecCallback.hal +$(GEN): $(LOCAL_PATH)/IHdmiCecCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tv.cec@1.0::IHdmiCec + +$(GEN): $(LOCAL_PATH)/IHdmiCec.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IHdmiCecCallback.hal +# +GEN := $(intermediates)/android/hardware/tv/cec/V1_0/IHdmiCecCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IHdmiCecCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.tv.cec@1.0::IHdmiCecCallback + +$(GEN): $(LOCAL_PATH)/IHdmiCecCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/usb/1.0/Android.mk b/usb/1.0/Android.mk index 32d03a3142..62f69354bc 100644 --- a/usb/1.0/Android.mk +++ b/usb/1.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (PortDataRole) @@ -197,6 +195,199 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.usb-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (PortDataRole) +# +GEN := $(intermediates)/android/hardware/usb/V1_0/PortDataRole.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.usb@1.0::types.PortDataRole + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PortMode) +# +GEN := $(intermediates)/android/hardware/usb/V1_0/PortMode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.usb@1.0::types.PortMode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PortPowerRole) +# +GEN := $(intermediates)/android/hardware/usb/V1_0/PortPowerRole.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.usb@1.0::types.PortPowerRole + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PortRole) +# +GEN := $(intermediates)/android/hardware/usb/V1_0/PortRole.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.usb@1.0::types.PortRole + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PortRoleType) +# +GEN := $(intermediates)/android/hardware/usb/V1_0/PortRoleType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.usb@1.0::types.PortRoleType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PortStatus) +# +GEN := $(intermediates)/android/hardware/usb/V1_0/PortStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.usb@1.0::types.PortStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Status) +# +GEN := $(intermediates)/android/hardware/usb/V1_0/Status.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.usb@1.0::types.Status + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IUsb.hal +# +GEN := $(intermediates)/android/hardware/usb/V1_0/IUsb.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsb.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IUsbCallback.hal +$(GEN): $(LOCAL_PATH)/IUsbCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.usb@1.0::IUsb + +$(GEN): $(LOCAL_PATH)/IUsb.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IUsbCallback.hal +# +GEN := $(intermediates)/android/hardware/usb/V1_0/IUsbCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsbCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.usb@1.0::IUsbCallback + +$(GEN): $(LOCAL_PATH)/IUsbCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + ################################################################################ include $(CLEAR_VARS) diff --git a/usb/1.1/Android.mk b/usb/1.1/Android.mk index 57147f18e5..12d306b922 100644 --- a/usb/1.1/Android.mk +++ b/usb/1.1/Android.mk @@ -16,8 +16,6 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.usb-V1.0-java \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (PortMode_1_1) @@ -99,6 +97,101 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.usb-V1.1-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hardware.usb-V1.0-java-static \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (PortMode_1_1) +# +GEN := $(intermediates)/android/hardware/usb/V1_1/PortMode_1_1.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.usb@1.1::types.PortMode_1_1 + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (PortStatus_1_1) +# +GEN := $(intermediates)/android/hardware/usb/V1_1/PortStatus_1_1.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.usb@1.1::types.PortStatus_1_1 + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IUsb.hal +# +GEN := $(intermediates)/android/hardware/usb/V1_1/IUsb.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsb.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.usb@1.1::IUsb + +$(GEN): $(LOCAL_PATH)/IUsb.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IUsbCallback.hal +# +GEN := $(intermediates)/android/hardware/usb/V1_1/IUsbCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsbCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.usb@1.1::IUsbCallback + +$(GEN): $(LOCAL_PATH)/IUsbCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + ################################################################################ include $(CLEAR_VARS) diff --git a/vibrator/1.0/Android.mk b/vibrator/1.0/Android.mk index 4e03392f32..c54b655a39 100644 --- a/vibrator/1.0/Android.mk +++ b/vibrator/1.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Effect) @@ -98,6 +96,100 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.vibrator-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (Effect) +# +GEN := $(intermediates)/android/hardware/vibrator/V1_0/Effect.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.vibrator@1.0::types.Effect + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (EffectStrength) +# +GEN := $(intermediates)/android/hardware/vibrator/V1_0/EffectStrength.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.vibrator@1.0::types.EffectStrength + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Status) +# +GEN := $(intermediates)/android/hardware/vibrator/V1_0/Status.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.vibrator@1.0::types.Status + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IVibrator.hal +# +GEN := $(intermediates)/android/hardware/vibrator/V1_0/IVibrator.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVibrator.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.vibrator@1.0::IVibrator + +$(GEN): $(LOCAL_PATH)/IVibrator.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + ################################################################################ include $(CLEAR_VARS) diff --git a/vibrator/1.1/Android.mk b/vibrator/1.1/Android.mk index d08f8376d9..2344e9141d 100644 --- a/vibrator/1.1/Android.mk +++ b/vibrator/1.1/Android.mk @@ -16,8 +16,6 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.vibrator-V1.0-java \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Effect_1_1) @@ -61,6 +59,63 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.vibrator-V1.1-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hardware.vibrator-V1.0-java-static \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (Effect_1_1) +# +GEN := $(intermediates)/android/hardware/vibrator/V1_1/Effect_1_1.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.vibrator@1.1::types.Effect_1_1 + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IVibrator.hal +# +GEN := $(intermediates)/android/hardware/vibrator/V1_1/IVibrator.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVibrator.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.vibrator@1.1::IVibrator + +$(GEN): $(LOCAL_PATH)/IVibrator.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + ################################################################################ include $(CLEAR_VARS) diff --git a/vr/1.0/Android.mk b/vr/1.0/Android.mk index 1115963032..fc5c675d12 100644 --- a/vr/1.0/Android.mk +++ b/vr/1.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build IVr.hal @@ -39,5 +37,40 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.vr-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build IVr.hal +# +GEN := $(intermediates)/android/hardware/vr/V1_0/IVr.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVr.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.vr@1.0::IVr + +$(GEN): $(LOCAL_PATH)/IVr.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/weaver/1.0/Android.mk b/weaver/1.0/Android.mk index ab33a158db..7f35b4e2fd 100644 --- a/weaver/1.0/Android.mk +++ b/weaver/1.0/Android.mk @@ -15,8 +15,6 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (WeaverConfig) @@ -117,5 +115,118 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.weaver-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + + +# +# Build types.hal (WeaverConfig) +# +GEN := $(intermediates)/android/hardware/weaver/V1_0/WeaverConfig.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.weaver@1.0::types.WeaverConfig + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WeaverReadResponse) +# +GEN := $(intermediates)/android/hardware/weaver/V1_0/WeaverReadResponse.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.weaver@1.0::types.WeaverReadResponse + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WeaverReadStatus) +# +GEN := $(intermediates)/android/hardware/weaver/V1_0/WeaverReadStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.weaver@1.0::types.WeaverReadStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WeaverStatus) +# +GEN := $(intermediates)/android/hardware/weaver/V1_0/WeaverStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.weaver@1.0::types.WeaverStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWeaver.hal +# +GEN := $(intermediates)/android/hardware/weaver/V1_0/IWeaver.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWeaver.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.weaver@1.0::IWeaver + +$(GEN): $(LOCAL_PATH)/IWeaver.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/wifi/1.0/Android.mk b/wifi/1.0/Android.mk index b89724ca73..bceb635203 100644 --- a/wifi/1.0/Android.mk +++ b/wifi/1.0/Android.mk @@ -1883,6 +1883,1887 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.wifi-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build types.hal (IfaceType) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/IfaceType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.IfaceType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanBandIndex) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanBandIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanBandIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanBandSpecificConfig) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanBandSpecificConfig.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanBandSpecificConfig + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanCapabilities) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanCapabilities.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanCapabilities + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanCipherSuiteType) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanCipherSuiteType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanCipherSuiteType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanClusterEventInd) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanClusterEventInd.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanClusterEventInd + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanClusterEventType) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanClusterEventType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanClusterEventType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanConfigRequest) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanConfigRequest.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanConfigRequest + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanDataPathChannelCfg) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathChannelCfg.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanDataPathChannelCfg + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanDataPathConfirmInd) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathConfirmInd.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanDataPathConfirmInd + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanDataPathRequestInd) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathRequestInd.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanDataPathRequestInd + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanDataPathSecurityConfig) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathSecurityConfig.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanDataPathSecurityConfig + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanDataPathSecurityType) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathSecurityType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanDataPathSecurityType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanDebugConfig) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDebugConfig.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanDebugConfig + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanDiscoveryCommonConfig) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDiscoveryCommonConfig.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanDiscoveryCommonConfig + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanEnableRequest) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanEnableRequest.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanEnableRequest + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanFollowupReceivedInd) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanFollowupReceivedInd.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanFollowupReceivedInd + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanInitiateDataPathRequest) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanInitiateDataPathRequest.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanInitiateDataPathRequest + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanMatchAlg) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanMatchAlg.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanMatchAlg + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanMatchInd) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanMatchInd.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanMatchInd + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanParamSizeLimits) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanParamSizeLimits.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanParamSizeLimits + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanPublishRequest) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanPublishRequest.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanPublishRequest + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanPublishType) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanPublishType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanPublishType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanRangingIndication) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanRangingIndication.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanRangingIndication + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanRespondToDataPathIndicationRequest) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanRespondToDataPathIndicationRequest.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanRespondToDataPathIndicationRequest + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanSrfType) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanSrfType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanSrfType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanStatusType) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanStatusType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanStatusType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanSubscribeRequest) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanSubscribeRequest.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanSubscribeRequest + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanSubscribeType) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanSubscribeType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanSubscribeType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanTransmitFollowupRequest) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanTransmitFollowupRequest.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanTransmitFollowupRequest + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (NanTxType) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/NanTxType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.NanTxType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RttBw) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/RttBw.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.RttBw + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RttCapabilities) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/RttCapabilities.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.RttCapabilities + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RttConfig) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/RttConfig.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.RttConfig + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RttLciInformation) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/RttLciInformation.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.RttLciInformation + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RttLcrInformation) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/RttLcrInformation.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.RttLcrInformation + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RttMotionPattern) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/RttMotionPattern.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.RttMotionPattern + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RttPeerType) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/RttPeerType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.RttPeerType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RttPreamble) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/RttPreamble.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.RttPreamble + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RttResponder) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/RttResponder.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.RttResponder + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RttResult) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/RttResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.RttResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RttStatus) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/RttStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.RttStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (RttType) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/RttType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.RttType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaApfPacketFilterCapabilities) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaApfPacketFilterCapabilities.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaApfPacketFilterCapabilities + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaBackgroundScanBucketEventReportSchemeMask) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaBackgroundScanBucketEventReportSchemeMask.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaBackgroundScanBucketEventReportSchemeMask + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaBackgroundScanBucketParameters) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaBackgroundScanBucketParameters.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaBackgroundScanBucketParameters + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaBackgroundScanCapabilities) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaBackgroundScanCapabilities.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaBackgroundScanCapabilities + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaBackgroundScanParameters) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaBackgroundScanParameters.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaBackgroundScanParameters + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaLinkLayerIfacePacketStats) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaLinkLayerIfacePacketStats.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaLinkLayerIfacePacketStats + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaLinkLayerIfaceStats) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaLinkLayerIfaceStats.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaLinkLayerIfaceStats + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaLinkLayerRadioStats) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaLinkLayerRadioStats.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaLinkLayerRadioStats + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaLinkLayerStats) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaLinkLayerStats.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaLinkLayerStats + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaRoamingCapabilities) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaRoamingCapabilities.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaRoamingCapabilities + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaRoamingConfig) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaRoamingConfig.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaRoamingConfig + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaRoamingState) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaRoamingState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaRoamingState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaScanData) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaScanData.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaScanData + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaScanDataFlagMask) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaScanDataFlagMask.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaScanDataFlagMask + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaScanLimits) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaScanLimits.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaScanLimits + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (StaScanResult) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/StaScanResult.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.StaScanResult + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiBand) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiBand.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiBand + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiChannelInfo) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiChannelInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiChannelInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiChannelWidthInMhz) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiChannelWidthInMhz.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiChannelWidthInMhz + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugHostWakeReasonRxIcmpPacketDetails) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugHostWakeReasonRxIcmpPacketDetails.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxIcmpPacketDetails + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugHostWakeReasonRxMulticastPacketDetails) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugHostWakeReasonRxMulticastPacketDetails.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxMulticastPacketDetails + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugHostWakeReasonRxPacketDetails) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugHostWakeReasonRxPacketDetails.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxPacketDetails + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugHostWakeReasonStats) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugHostWakeReasonStats.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonStats + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugPacketFateFrameInfo) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugPacketFateFrameInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiDebugPacketFateFrameInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugPacketFateFrameType) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugPacketFateFrameType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiDebugPacketFateFrameType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugRingBufferFlags) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingBufferFlags.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiDebugRingBufferFlags + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugRingBufferStatus) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingBufferStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiDebugRingBufferStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugRingBufferVerboseLevel) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingBufferVerboseLevel.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiDebugRingBufferVerboseLevel + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugRxPacketFate) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRxPacketFate.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiDebugRxPacketFate + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugRxPacketFateReport) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRxPacketFateReport.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiDebugRxPacketFateReport + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugTxPacketFate) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugTxPacketFate.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiDebugTxPacketFate + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugTxPacketFateReport) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugTxPacketFateReport.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiDebugTxPacketFateReport + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiInformationElement) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiInformationElement.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiInformationElement + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiNanStatus) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiNanStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiNanStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiRateInfo) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiRateInfo.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiRateInfo + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiRateNss) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiRateNss.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiRateNss + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiRatePreamble) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiRatePreamble.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiRatePreamble + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiStatus) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiStatusCode) +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiStatusCode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::types.WifiStatusCode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWifi.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifi.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifi.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiChip.hal +$(GEN): $(LOCAL_PATH)/IWifiChip.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiEventCallback.hal +$(GEN): $(LOCAL_PATH)/IWifiEventCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::IWifi + +$(GEN): $(LOCAL_PATH)/IWifi.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWifiApIface.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiApIface.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiApIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal +$(GEN): $(LOCAL_PATH)/IWifiIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::IWifiApIface + +$(GEN): $(LOCAL_PATH)/IWifiApIface.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWifiChip.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiChip.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiChip.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiApIface.hal +$(GEN): $(LOCAL_PATH)/IWifiApIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiChipEventCallback.hal +$(GEN): $(LOCAL_PATH)/IWifiChipEventCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal +$(GEN): $(LOCAL_PATH)/IWifiIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiNanIface.hal +$(GEN): $(LOCAL_PATH)/IWifiNanIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiP2pIface.hal +$(GEN): $(LOCAL_PATH)/IWifiP2pIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiRttController.hal +$(GEN): $(LOCAL_PATH)/IWifiRttController.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiStaIface.hal +$(GEN): $(LOCAL_PATH)/IWifiStaIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::IWifiChip + +$(GEN): $(LOCAL_PATH)/IWifiChip.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWifiChipEventCallback.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiChipEventCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiChipEventCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::IWifiChipEventCallback + +$(GEN): $(LOCAL_PATH)/IWifiChipEventCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWifiEventCallback.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiEventCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiEventCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::IWifiEventCallback + +$(GEN): $(LOCAL_PATH)/IWifiEventCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWifiIface.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiIface.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::IWifiIface + +$(GEN): $(LOCAL_PATH)/IWifiIface.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWifiNanIface.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiNanIface.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiNanIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal +$(GEN): $(LOCAL_PATH)/IWifiIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiNanIfaceEventCallback.hal +$(GEN): $(LOCAL_PATH)/IWifiNanIfaceEventCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::IWifiNanIface + +$(GEN): $(LOCAL_PATH)/IWifiNanIface.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWifiNanIfaceEventCallback.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiNanIfaceEventCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiNanIfaceEventCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::IWifiNanIfaceEventCallback + +$(GEN): $(LOCAL_PATH)/IWifiNanIfaceEventCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWifiP2pIface.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiP2pIface.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiP2pIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal +$(GEN): $(LOCAL_PATH)/IWifiIface.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::IWifiP2pIface + +$(GEN): $(LOCAL_PATH)/IWifiP2pIface.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWifiRttController.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiRttController.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiRttController.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal +$(GEN): $(LOCAL_PATH)/IWifiIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiRttControllerEventCallback.hal +$(GEN): $(LOCAL_PATH)/IWifiRttControllerEventCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::IWifiRttController + +$(GEN): $(LOCAL_PATH)/IWifiRttController.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWifiRttControllerEventCallback.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiRttControllerEventCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiRttControllerEventCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::IWifiRttControllerEventCallback + +$(GEN): $(LOCAL_PATH)/IWifiRttControllerEventCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWifiStaIface.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiStaIface.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiStaIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal +$(GEN): $(LOCAL_PATH)/IWifiIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiStaIfaceEventCallback.hal +$(GEN): $(LOCAL_PATH)/IWifiStaIfaceEventCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::IWifiStaIface + +$(GEN): $(LOCAL_PATH)/IWifiStaIface.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWifiStaIfaceEventCallback.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiStaIfaceEventCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiStaIfaceEventCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.0::IWifiStaIfaceEventCallback + +$(GEN): $(LOCAL_PATH)/IWifiStaIfaceEventCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + ################################################################################ include $(CLEAR_VARS) diff --git a/wifi/1.1/Android.mk b/wifi/1.1/Android.mk index 5f4bc6a471..fbc79ca159 100644 --- a/wifi/1.1/Android.mk +++ b/wifi/1.1/Android.mk @@ -16,8 +16,6 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.wifi-V1.0-java \ android.hidl.base-V1.0-java \ -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build IWifi.hal @@ -59,5 +57,60 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.wifi-V1.1-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hardware.wifi-V1.0-java-static \ + android.hidl.base-V1.0-java-static \ + + +# +# Build IWifi.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_1/IWifi.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifi.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.1::IWifi + +$(GEN): $(LOCAL_PATH)/IWifi.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IWifiChip.hal +# +GEN := $(intermediates)/android/hardware/wifi/V1_1/IWifiChip.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiChip.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi@1.1::IWifiChip + +$(GEN): $(LOCAL_PATH)/IWifiChip.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/wifi/supplicant/1.0/Android.mk b/wifi/supplicant/1.0/Android.mk index 14a1270ef3..770ed884fb 100644 --- a/wifi/supplicant/1.0/Android.mk +++ b/wifi/supplicant/1.0/Android.mk @@ -383,5 +383,386 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.wifi.supplicant-V1.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(call local-generated-sources-dir, COMMON) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hidl.base-V1.0-java-static \ + +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES := core-oj hwbinder + +# +# Build types.hal (IfaceType) +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/IfaceType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::types.IfaceType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (P2pGroupCapabilityMask) +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/P2pGroupCapabilityMask.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::types.P2pGroupCapabilityMask + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SupplicantStatus) +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/SupplicantStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::types.SupplicantStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (SupplicantStatusCode) +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/SupplicantStatusCode.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::types.SupplicantStatusCode + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WpsConfigMethods) +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/WpsConfigMethods.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::types.WpsConfigMethods + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISupplicant.hal +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicant.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicant.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantCallback.hal +$(GEN): $(LOCAL_PATH)/ISupplicantCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantIface.hal +$(GEN): $(LOCAL_PATH)/ISupplicantIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::ISupplicant + +$(GEN): $(LOCAL_PATH)/ISupplicant.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISupplicantCallback.hal +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::ISupplicantCallback + +$(GEN): $(LOCAL_PATH)/ISupplicantCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISupplicantIface.hal +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantIface.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantNetwork.hal +$(GEN): $(LOCAL_PATH)/ISupplicantNetwork.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::ISupplicantIface + +$(GEN): $(LOCAL_PATH)/ISupplicantIface.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISupplicantNetwork.hal +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantNetwork.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantNetwork.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::ISupplicantNetwork + +$(GEN): $(LOCAL_PATH)/ISupplicantNetwork.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISupplicantP2pIface.hal +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantP2pIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantIface.hal +$(GEN): $(LOCAL_PATH)/ISupplicantIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantP2pIfaceCallback.hal +$(GEN): $(LOCAL_PATH)/ISupplicantP2pIfaceCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::ISupplicantP2pIface + +$(GEN): $(LOCAL_PATH)/ISupplicantP2pIface.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISupplicantP2pIfaceCallback.hal +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantP2pIfaceCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::ISupplicantP2pIfaceCallback + +$(GEN): $(LOCAL_PATH)/ISupplicantP2pIfaceCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISupplicantP2pNetwork.hal +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantP2pNetwork.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantP2pNetwork.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantNetwork.hal +$(GEN): $(LOCAL_PATH)/ISupplicantNetwork.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantP2pNetworkCallback.hal +$(GEN): $(LOCAL_PATH)/ISupplicantP2pNetworkCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::ISupplicantP2pNetwork + +$(GEN): $(LOCAL_PATH)/ISupplicantP2pNetwork.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISupplicantP2pNetworkCallback.hal +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantP2pNetworkCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantP2pNetworkCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::ISupplicantP2pNetworkCallback + +$(GEN): $(LOCAL_PATH)/ISupplicantP2pNetworkCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISupplicantStaIface.hal +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantStaIface.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantStaIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantIface.hal +$(GEN): $(LOCAL_PATH)/ISupplicantIface.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantStaIfaceCallback.hal +$(GEN): $(LOCAL_PATH)/ISupplicantStaIfaceCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::ISupplicantStaIface + +$(GEN): $(LOCAL_PATH)/ISupplicantStaIface.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISupplicantStaIfaceCallback.hal +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantStaIfaceCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::ISupplicantStaIfaceCallback + +$(GEN): $(LOCAL_PATH)/ISupplicantStaIfaceCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISupplicantStaNetwork.hal +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantStaNetwork.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantNetwork.hal +$(GEN): $(LOCAL_PATH)/ISupplicantNetwork.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantStaNetworkCallback.hal +$(GEN): $(LOCAL_PATH)/ISupplicantStaNetworkCallback.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::ISupplicantStaNetwork + +$(GEN): $(LOCAL_PATH)/ISupplicantStaNetwork.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build ISupplicantStaNetworkCallback.hal +# +GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantStaNetworkCallback.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.wifi.supplicant@1.0::ISupplicantStaNetworkCallback + +$(GEN): $(LOCAL_PATH)/ISupplicantStaNetworkCallback.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + include $(call all-makefiles-under,$(LOCAL_PATH)) From 4f25c2a14324c92ad38a45ea30bca30973e792f6 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Fri, 11 Aug 2017 22:59:15 +0000 Subject: [PATCH 136/265] Revert "Revert "Updating all makefiles."" Relanding without automotive/vehicle/2.0+2.1 changes. This reverts commit 1020ebedfbf7c5014896266a98de562a6116d4a2. Merged-In: I8608c8f636c35f21e4246a805a9eff6d14124e0a Change-Id: Icc49df42c2bedf443d878d5d8fbaa53441ea65db --- biometrics/fingerprint/2.1/Android.mk | 233 +- bluetooth/1.0/Android.mk | 81 - boot/1.0/Android.mk | 77 - camera/common/1.0/Android.mk | 185 +- camera/metadata/3.2/Android.mk | 1230 +--------- configstore/1.0/Android.mk | 153 -- configstore/1.1/Android.mk | 38 +- contexthub/1.0/Android.mk | 328 +-- gatekeeper/1.0/Android.mk | 77 +- gnss/1.0/Android.mk | 524 +---- graphics/common/1.0/Android.mk | 147 +- health/1.0/Android.mk | 134 +- ir/1.0/Android.mk | 58 - light/2.0/Android.mk | 134 +- memtrack/1.0/Android.mk | 115 +- nfc/1.0/Android.mk | 100 - oemlock/1.0/Android.mk | 77 +- power/1.0/Android.mk | 134 +- power/1.1/Android.mk | 78 +- radio/1.0/Android.mk | 3055 ------------------------- radio/1.1/Android.mk | 386 ---- radio/deprecated/1.0/Android.mk | 80 - tests/baz/1.0/Android.mk | 98 - tests/expression/1.0/Android.mk | 58 - tests/extension/light/2.0/Android.mk | 97 +- tests/hash/1.0/Android.mk | 37 - tests/inheritance/1.0/Android.mk | 104 - tests/libhwbinder/1.0/Android.mk | 56 - tests/multithread/1.0/Android.mk | 37 - tetheroffload/control/1.0/Android.mk | 136 -- thermal/1.0/Android.mk | 172 +- thermal/1.1/Android.bp | 5 +- thermal/1.1/Android.mk | 59 +- tv/cec/1.0/Android.mk | 290 +-- usb/1.0/Android.mk | 195 +- usb/1.1/Android.mk | 97 +- vibrator/1.0/Android.mk | 96 +- vibrator/1.1/Android.mk | 59 +- vr/1.0/Android.mk | 37 +- weaver/1.0/Android.mk | 115 +- wifi/1.0/Android.mk | 1881 --------------- wifi/1.1/Android.mk | 57 +- wifi/supplicant/1.0/Android.mk | 381 --- 43 files changed, 54 insertions(+), 11437 deletions(-) diff --git a/biometrics/fingerprint/2.1/Android.mk b/biometrics/fingerprint/2.1/Android.mk index 2f3237162c..304f6a90d9 100644 --- a/biometrics/fingerprint/2.1/Android.mk +++ b/biometrics/fingerprint/2.1/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (FingerprintAcquired) @@ -233,236 +235,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.biometrics.fingerprint-V2.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (FingerprintAcquired) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintAcquired.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintAcquired - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (FingerprintAcquiredInfo) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintAcquiredInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintAcquiredInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (FingerprintAuthenticated) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintAuthenticated.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintAuthenticated - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (FingerprintEnroll) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintEnroll.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintEnroll - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (FingerprintError) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintError.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintError - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (FingerprintFingerId) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintFingerId.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintFingerId - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (FingerprintIterator) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintIterator.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintIterator - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (FingerprintMsgType) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/FingerprintMsgType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.FingerprintMsgType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RequestStatus) -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/RequestStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::types.RequestStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IBiometricsFingerprint.hal -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBiometricsFingerprint.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IBiometricsFingerprintClientCallback.hal -$(GEN): $(LOCAL_PATH)/IBiometricsFingerprintClientCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::IBiometricsFingerprint - -$(GEN): $(LOCAL_PATH)/IBiometricsFingerprint.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IBiometricsFingerprintClientCallback.hal -# -GEN := $(intermediates)/android/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBiometricsFingerprintClientCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.biometrics.fingerprint@2.1::IBiometricsFingerprintClientCallback - -$(GEN): $(LOCAL_PATH)/IBiometricsFingerprintClientCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/bluetooth/1.0/Android.mk b/bluetooth/1.0/Android.mk index 5dade87f51..5937e0f3a2 100644 --- a/bluetooth/1.0/Android.mk +++ b/bluetooth/1.0/Android.mk @@ -83,86 +83,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.bluetooth-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (Status) -# -GEN := $(intermediates)/android/hardware/bluetooth/V1_0/Status.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.bluetooth@1.0::types.Status - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IBluetoothHci.hal -# -GEN := $(intermediates)/android/hardware/bluetooth/V1_0/IBluetoothHci.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBluetoothHci.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IBluetoothHciCallbacks.hal -$(GEN): $(LOCAL_PATH)/IBluetoothHciCallbacks.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.bluetooth@1.0::IBluetoothHci - -$(GEN): $(LOCAL_PATH)/IBluetoothHci.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IBluetoothHciCallbacks.hal -# -GEN := $(intermediates)/android/hardware/bluetooth/V1_0/IBluetoothHciCallbacks.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBluetoothHciCallbacks.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.bluetooth@1.0::IBluetoothHciCallbacks - -$(GEN): $(LOCAL_PATH)/IBluetoothHciCallbacks.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/boot/1.0/Android.mk b/boot/1.0/Android.mk index 5ef55f31d8..253742b9e5 100644 --- a/boot/1.0/Android.mk +++ b/boot/1.0/Android.mk @@ -79,82 +79,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.boot-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (BoolResult) -# -GEN := $(intermediates)/android/hardware/boot/V1_0/BoolResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.boot@1.0::types.BoolResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CommandResult) -# -GEN := $(intermediates)/android/hardware/boot/V1_0/CommandResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.boot@1.0::types.CommandResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IBootControl.hal -# -GEN := $(intermediates)/android/hardware/boot/V1_0/IBootControl.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBootControl.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.boot@1.0::IBootControl - -$(GEN): $(LOCAL_PATH)/IBootControl.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/camera/common/1.0/Android.mk b/camera/common/1.0/Android.mk index 47bfb31b1b..c2e7075628 100644 --- a/camera/common/1.0/Android.mk +++ b/camera/common/1.0/Android.mk @@ -11,6 +11,8 @@ LOCAL_MODULE_CLASS := JAVA_LIBRARIES intermediates := $(call local-generated-sources-dir, COMMON) HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (CameraDeviceStatus) @@ -185,188 +187,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.camera.common-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -# -# Build types.hal (CameraDeviceStatus) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/CameraDeviceStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.CameraDeviceStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataType) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/CameraMetadataType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.CameraMetadataType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraResourceCost) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/CameraResourceCost.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.CameraResourceCost - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Status) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/Status.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.Status - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TagBoundaryId) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/TagBoundaryId.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.TagBoundaryId - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TorchMode) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/TorchMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.TorchMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TorchModeStatus) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/TorchModeStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.TorchModeStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VendorTag) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/VendorTag.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.VendorTag - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VendorTagSection) -# -GEN := $(intermediates)/android/hardware/camera/common/V1_0/VendorTagSection.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.common@1.0::types.VendorTagSection - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/camera/metadata/3.2/Android.mk b/camera/metadata/3.2/Android.mk index 935c37cd1e..f9508b5fc0 100644 --- a/camera/metadata/3.2/Android.mk +++ b/camera/metadata/3.2/Android.mk @@ -11,6 +11,8 @@ LOCAL_MODULE_CLASS := JAVA_LIBRARIES intermediates := $(call local-generated-sources-dir, COMMON) HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (CameraMetadataEnumAndroidBlackLevelLock) @@ -1230,1233 +1232,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.camera.metadata-V3.2-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -# -# Build types.hal (CameraMetadataEnumAndroidBlackLevelLock) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidBlackLevelLock.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidBlackLevelLock - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidColorCorrectionAberrationMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidColorCorrectionAberrationMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidColorCorrectionAberrationMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidColorCorrectionMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidColorCorrectionMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidColorCorrectionMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAeAntibandingMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeAntibandingMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeAntibandingMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAeLock) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeLock.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeLock - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAeLockAvailable) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeLockAvailable.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeLockAvailable - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAeMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAePrecaptureTrigger) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAePrecaptureTrigger.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAePrecaptureTrigger - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAeState) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAeState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAeState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAfMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAfMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAfMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAfState) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAfState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAfState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAfTrigger) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAfTrigger.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAfTrigger - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAwbLock) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAwbLock.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAwbLock - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAwbLockAvailable) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAwbLockAvailable.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAwbLockAvailable - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAwbMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAwbMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAwbMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlAwbState) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlAwbState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlAwbState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlCaptureIntent) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlCaptureIntent.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlCaptureIntent - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlEffectMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlEffectMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlEffectMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlEnableZsl) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlEnableZsl.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlEnableZsl - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlSceneMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlSceneMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlSceneMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidControlVideoStabilizationMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidControlVideoStabilizationMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidControlVideoStabilizationMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidDemosaicMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidDemosaicMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidDemosaicMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidDepthAvailableDepthStreamConfigurations) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidDepthAvailableDepthStreamConfigurations.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidDepthAvailableDepthStreamConfigurations - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidDepthDepthIsExclusive) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidDepthDepthIsExclusive.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidDepthDepthIsExclusive - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidEdgeMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidEdgeMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidEdgeMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidFlashInfoAvailable) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidFlashInfoAvailable.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidFlashInfoAvailable - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidFlashMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidFlashMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidFlashMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidFlashState) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidFlashState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidFlashState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidHotPixelMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidHotPixelMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidHotPixelMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidInfoSupportedHardwareLevel) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidInfoSupportedHardwareLevel.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidInfoSupportedHardwareLevel - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidLedAvailableLeds) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLedAvailableLeds.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLedAvailableLeds - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidLedTransmit) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLedTransmit.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLedTransmit - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidLensFacing) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLensFacing.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLensFacing - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidLensInfoFocusDistanceCalibration) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLensInfoFocusDistanceCalibration.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLensInfoFocusDistanceCalibration - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidLensOpticalStabilizationMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLensOpticalStabilizationMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLensOpticalStabilizationMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidLensState) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidLensState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidLensState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidNoiseReductionMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidNoiseReductionMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidNoiseReductionMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidQuirksPartialResult) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidQuirksPartialResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidQuirksPartialResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidRequestAvailableCapabilities) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidRequestAvailableCapabilities.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidRequestAvailableCapabilities - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidRequestMetadataMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidRequestMetadataMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidRequestMetadataMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidRequestType) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidRequestType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidRequestType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidScalerAvailableFormats) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidScalerAvailableFormats.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidScalerAvailableFormats - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidScalerAvailableStreamConfigurations) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidScalerAvailableStreamConfigurations.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidScalerAvailableStreamConfigurations - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidScalerCroppingType) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidScalerCroppingType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidScalerCroppingType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidSensorInfoColorFilterArrangement) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorInfoColorFilterArrangement.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorInfoColorFilterArrangement - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidSensorInfoLensShadingApplied) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorInfoLensShadingApplied.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorInfoLensShadingApplied - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidSensorInfoTimestampSource) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorInfoTimestampSource.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorInfoTimestampSource - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidSensorReferenceIlluminant1) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorReferenceIlluminant1.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorReferenceIlluminant1 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidSensorTestPatternMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSensorTestPatternMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSensorTestPatternMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidShadingMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidShadingMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidShadingMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidStatisticsFaceDetectMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsFaceDetectMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsFaceDetectMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidStatisticsHistogramMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsHistogramMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsHistogramMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidStatisticsHotPixelMapMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsHotPixelMapMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsHotPixelMapMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidStatisticsLensShadingMapMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsLensShadingMapMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsLensShadingMapMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidStatisticsSceneFlicker) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsSceneFlicker.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsSceneFlicker - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidStatisticsSharpnessMapMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidStatisticsSharpnessMapMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidStatisticsSharpnessMapMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidSyncFrameNumber) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSyncFrameNumber.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSyncFrameNumber - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidSyncMaxLatency) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidSyncMaxLatency.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidSyncMaxLatency - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidTonemapMode) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidTonemapMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidTonemapMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataEnumAndroidTonemapPresetCurve) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataEnumAndroidTonemapPresetCurve.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataEnumAndroidTonemapPresetCurve - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataSection) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataSection.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataSection - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataSectionStart) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataSectionStart.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataSectionStart - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CameraMetadataTag) -# -GEN := $(intermediates)/android/hardware/camera/metadata/V3_2/CameraMetadataTag.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.camera.metadata@3.2::types.CameraMetadataTag - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/configstore/1.0/Android.mk b/configstore/1.0/Android.mk index 59eff955f9..e050a92407 100644 --- a/configstore/1.0/Android.mk +++ b/configstore/1.0/Android.mk @@ -155,158 +155,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.configstore-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (OptionalBool) -# -GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalBool.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.0::types.OptionalBool - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OptionalInt32) -# -GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalInt32.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.0::types.OptionalInt32 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OptionalInt64) -# -GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalInt64.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.0::types.OptionalInt64 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OptionalString) -# -GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalString.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.0::types.OptionalString - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OptionalUInt32) -# -GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalUInt32.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.0::types.OptionalUInt32 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OptionalUInt64) -# -GEN := $(intermediates)/android/hardware/configstore/V1_0/OptionalUInt64.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.0::types.OptionalUInt64 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISurfaceFlingerConfigs.hal -# -GEN := $(intermediates)/android/hardware/configstore/V1_0/ISurfaceFlingerConfigs.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.0::ISurfaceFlingerConfigs - -$(GEN): $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/configstore/1.1/Android.mk b/configstore/1.1/Android.mk index a5fa6c4796..b3f7053cd9 100644 --- a/configstore/1.1/Android.mk +++ b/configstore/1.1/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.configstore-V1.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build ISurfaceFlingerConfigs.hal @@ -38,41 +40,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.configstore-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.configstore-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build ISurfaceFlingerConfigs.hal -# -GEN := $(intermediates)/android/hardware/configstore/V1_1/ISurfaceFlingerConfigs.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.1::ISurfaceFlingerConfigs - -$(GEN): $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/contexthub/1.0/Android.mk b/contexthub/1.0/Android.mk index d161e3b092..47bfd8fca9 100644 --- a/contexthub/1.0/Android.mk +++ b/contexthub/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (AsyncEventType) @@ -328,331 +330,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.contexthub-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (AsyncEventType) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/AsyncEventType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.AsyncEventType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ContextHub) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/ContextHub.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.ContextHub - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ContextHubMsg) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/ContextHubMsg.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.ContextHubMsg - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HostEndPoint) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/HostEndPoint.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.HostEndPoint - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HubAppInfo) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/HubAppInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.HubAppInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HubMemoryFlag) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/HubMemoryFlag.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.HubMemoryFlag - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HubMemoryType) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/HubMemoryType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.HubMemoryType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (MemRange) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/MemRange.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.MemRange - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanoAppBinary) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/NanoAppBinary.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.NanoAppBinary - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanoAppFlags) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/NanoAppFlags.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.NanoAppFlags - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PhysicalSensor) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/PhysicalSensor.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.PhysicalSensor - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Result) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/Result.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.Result - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SensorType) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/SensorType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.SensorType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TransactionResult) -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/TransactionResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::types.TransactionResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IContexthub.hal -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/IContexthub.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IContexthub.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IContexthubCallback.hal -$(GEN): $(LOCAL_PATH)/IContexthubCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::IContexthub - -$(GEN): $(LOCAL_PATH)/IContexthub.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IContexthubCallback.hal -# -GEN := $(intermediates)/android/hardware/contexthub/V1_0/IContexthubCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IContexthubCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.contexthub@1.0::IContexthubCallback - -$(GEN): $(LOCAL_PATH)/IContexthubCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/gatekeeper/1.0/Android.mk b/gatekeeper/1.0/Android.mk index 576f729a23..debc0d961b 100644 --- a/gatekeeper/1.0/Android.mk +++ b/gatekeeper/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (GatekeeperResponse) @@ -77,80 +79,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.gatekeeper-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (GatekeeperResponse) -# -GEN := $(intermediates)/android/hardware/gatekeeper/V1_0/GatekeeperResponse.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gatekeeper@1.0::types.GatekeeperResponse - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GatekeeperStatusCode) -# -GEN := $(intermediates)/android/hardware/gatekeeper/V1_0/GatekeeperStatusCode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gatekeeper@1.0::types.GatekeeperStatusCode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGatekeeper.hal -# -GEN := $(intermediates)/android/hardware/gatekeeper/V1_0/IGatekeeper.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGatekeeper.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gatekeeper@1.0::IGatekeeper - -$(GEN): $(LOCAL_PATH)/IGatekeeper.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/gnss/1.0/Android.mk b/gnss/1.0/Android.mk index bb1b765d8c..1cb3945bf0 100644 --- a/gnss/1.0/Android.mk +++ b/gnss/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (GnssConstellationType) @@ -524,528 +526,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.gnss-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (GnssConstellationType) -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/GnssConstellationType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::types.GnssConstellationType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GnssLocation) -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/GnssLocation.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::types.GnssLocation - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GnssLocationFlags) -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/GnssLocationFlags.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::types.GnssLocationFlags - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GnssMax) -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/GnssMax.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::types.GnssMax - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IAGnss.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IAGnss.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IAGnss.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IAGnssCallback.hal -$(GEN): $(LOCAL_PATH)/IAGnssCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IAGnss - -$(GEN): $(LOCAL_PATH)/IAGnss.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IAGnssCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IAGnssCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IAGnssCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IAGnssCallback - -$(GEN): $(LOCAL_PATH)/IAGnssCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IAGnssRil.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IAGnssRil.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IAGnssRil.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IAGnssRilCallback.hal -$(GEN): $(LOCAL_PATH)/IAGnssRilCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IAGnssRil - -$(GEN): $(LOCAL_PATH)/IAGnssRil.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IAGnssRilCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IAGnssRilCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IAGnssRilCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IAGnssRilCallback - -$(GEN): $(LOCAL_PATH)/IAGnssRilCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnss.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnss.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnss.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IAGnss.hal -$(GEN): $(LOCAL_PATH)/IAGnss.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IAGnssRil.hal -$(GEN): $(LOCAL_PATH)/IAGnssRil.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssBatching.hal -$(GEN): $(LOCAL_PATH)/IGnssBatching.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssCallback.hal -$(GEN): $(LOCAL_PATH)/IGnssCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssConfiguration.hal -$(GEN): $(LOCAL_PATH)/IGnssConfiguration.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssDebug.hal -$(GEN): $(LOCAL_PATH)/IGnssDebug.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssGeofencing.hal -$(GEN): $(LOCAL_PATH)/IGnssGeofencing.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssMeasurement.hal -$(GEN): $(LOCAL_PATH)/IGnssMeasurement.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssNavigationMessage.hal -$(GEN): $(LOCAL_PATH)/IGnssNavigationMessage.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssNi.hal -$(GEN): $(LOCAL_PATH)/IGnssNi.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssXtra.hal -$(GEN): $(LOCAL_PATH)/IGnssXtra.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnss - -$(GEN): $(LOCAL_PATH)/IGnss.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssBatching.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssBatching.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssBatching.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssBatchingCallback.hal -$(GEN): $(LOCAL_PATH)/IGnssBatchingCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssBatching - -$(GEN): $(LOCAL_PATH)/IGnssBatching.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssBatchingCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssBatchingCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssBatchingCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssBatchingCallback - -$(GEN): $(LOCAL_PATH)/IGnssBatchingCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssCallback - -$(GEN): $(LOCAL_PATH)/IGnssCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssConfiguration.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssConfiguration.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssConfiguration.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssConfiguration - -$(GEN): $(LOCAL_PATH)/IGnssConfiguration.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssDebug.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssDebug.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssDebug.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssDebug - -$(GEN): $(LOCAL_PATH)/IGnssDebug.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssGeofenceCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssGeofenceCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssGeofenceCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssGeofenceCallback - -$(GEN): $(LOCAL_PATH)/IGnssGeofenceCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssGeofencing.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssGeofencing.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssGeofencing.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssGeofenceCallback.hal -$(GEN): $(LOCAL_PATH)/IGnssGeofenceCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssGeofencing - -$(GEN): $(LOCAL_PATH)/IGnssGeofencing.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssMeasurement.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssMeasurement.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssMeasurement.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssMeasurementCallback.hal -$(GEN): $(LOCAL_PATH)/IGnssMeasurementCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssMeasurement - -$(GEN): $(LOCAL_PATH)/IGnssMeasurement.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssMeasurementCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssMeasurementCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssMeasurementCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssMeasurementCallback - -$(GEN): $(LOCAL_PATH)/IGnssMeasurementCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssNavigationMessage.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssNavigationMessage.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssNavigationMessage.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssNavigationMessageCallback.hal -$(GEN): $(LOCAL_PATH)/IGnssNavigationMessageCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssNavigationMessage - -$(GEN): $(LOCAL_PATH)/IGnssNavigationMessage.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssNavigationMessageCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssNavigationMessageCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssNavigationMessageCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssNavigationMessageCallback - -$(GEN): $(LOCAL_PATH)/IGnssNavigationMessageCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssNi.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssNi.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssNi.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssNiCallback.hal -$(GEN): $(LOCAL_PATH)/IGnssNiCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssNi - -$(GEN): $(LOCAL_PATH)/IGnssNi.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssNiCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssNiCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssNiCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssNiCallback - -$(GEN): $(LOCAL_PATH)/IGnssNiCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssXtra.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssXtra.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssXtra.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGnssXtraCallback.hal -$(GEN): $(LOCAL_PATH)/IGnssXtraCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssXtra - -$(GEN): $(LOCAL_PATH)/IGnssXtra.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGnssXtraCallback.hal -# -GEN := $(intermediates)/android/hardware/gnss/V1_0/IGnssXtraCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGnssXtraCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.gnss@1.0::IGnssXtraCallback - -$(GEN): $(LOCAL_PATH)/IGnssXtraCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/graphics/common/1.0/Android.mk b/graphics/common/1.0/Android.mk index 569a5f444a..3fd948e47f 100644 --- a/graphics/common/1.0/Android.mk +++ b/graphics/common/1.0/Android.mk @@ -11,6 +11,8 @@ LOCAL_MODULE_CLASS := JAVA_LIBRARIES intermediates := $(call local-generated-sources-dir, COMMON) HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (BufferUsage) @@ -147,151 +149,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.graphics.common-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -# -# Build types.hal (BufferUsage) -# -GEN := $(intermediates)/android/hardware/graphics/common/V1_0/BufferUsage.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.graphics.common@1.0::types.BufferUsage - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ColorMode) -# -GEN := $(intermediates)/android/hardware/graphics/common/V1_0/ColorMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.graphics.common@1.0::types.ColorMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ColorTransform) -# -GEN := $(intermediates)/android/hardware/graphics/common/V1_0/ColorTransform.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.graphics.common@1.0::types.ColorTransform - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Dataspace) -# -GEN := $(intermediates)/android/hardware/graphics/common/V1_0/Dataspace.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.graphics.common@1.0::types.Dataspace - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Hdr) -# -GEN := $(intermediates)/android/hardware/graphics/common/V1_0/Hdr.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.graphics.common@1.0::types.Hdr - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PixelFormat) -# -GEN := $(intermediates)/android/hardware/graphics/common/V1_0/PixelFormat.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.graphics.common@1.0::types.PixelFormat - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Transform) -# -GEN := $(intermediates)/android/hardware/graphics/common/V1_0/Transform.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.graphics.common@1.0::types.Transform - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/health/1.0/Android.mk b/health/1.0/Android.mk index b03b868691..3b47239500 100644 --- a/health/1.0/Android.mk +++ b/health/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (BatteryHealth) @@ -134,138 +136,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.health-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (BatteryHealth) -# -GEN := $(intermediates)/android/hardware/health/V1_0/BatteryHealth.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.health@1.0::types.BatteryHealth - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (BatteryStatus) -# -GEN := $(intermediates)/android/hardware/health/V1_0/BatteryStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.health@1.0::types.BatteryStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HealthConfig) -# -GEN := $(intermediates)/android/hardware/health/V1_0/HealthConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.health@1.0::types.HealthConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HealthInfo) -# -GEN := $(intermediates)/android/hardware/health/V1_0/HealthInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.health@1.0::types.HealthInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Result) -# -GEN := $(intermediates)/android/hardware/health/V1_0/Result.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.health@1.0::types.Result - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IHealth.hal -# -GEN := $(intermediates)/android/hardware/health/V1_0/IHealth.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IHealth.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.health@1.0::IHealth - -$(GEN): $(LOCAL_PATH)/IHealth.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/ir/1.0/Android.mk b/ir/1.0/Android.mk index 96812df854..eca46f5a94 100644 --- a/ir/1.0/Android.mk +++ b/ir/1.0/Android.mk @@ -60,63 +60,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.ir-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (ConsumerIrFreqRange) -# -GEN := $(intermediates)/android/hardware/ir/V1_0/ConsumerIrFreqRange.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.ir@1.0::types.ConsumerIrFreqRange - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IConsumerIr.hal -# -GEN := $(intermediates)/android/hardware/ir/V1_0/IConsumerIr.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IConsumerIr.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.ir@1.0::IConsumerIr - -$(GEN): $(LOCAL_PATH)/IConsumerIr.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/light/2.0/Android.mk b/light/2.0/Android.mk index 24d7ab1394..93211e19c8 100644 --- a/light/2.0/Android.mk +++ b/light/2.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Brightness) @@ -134,137 +136,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.light-V2.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (Brightness) -# -GEN := $(intermediates)/android/hardware/light/V2_0/Brightness.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.light@2.0::types.Brightness - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Flash) -# -GEN := $(intermediates)/android/hardware/light/V2_0/Flash.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.light@2.0::types.Flash - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (LightState) -# -GEN := $(intermediates)/android/hardware/light/V2_0/LightState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.light@2.0::types.LightState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Status) -# -GEN := $(intermediates)/android/hardware/light/V2_0/Status.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.light@2.0::types.Status - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Type) -# -GEN := $(intermediates)/android/hardware/light/V2_0/Type.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.light@2.0::types.Type - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ILight.hal -# -GEN := $(intermediates)/android/hardware/light/V2_0/ILight.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ILight.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.light@2.0::ILight - -$(GEN): $(LOCAL_PATH)/ILight.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/memtrack/1.0/Android.mk b/memtrack/1.0/Android.mk index 8583b0ab6a..dfde3850b2 100644 --- a/memtrack/1.0/Android.mk +++ b/memtrack/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (MemtrackFlag) @@ -115,118 +117,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.memtrack-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (MemtrackFlag) -# -GEN := $(intermediates)/android/hardware/memtrack/V1_0/MemtrackFlag.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.memtrack@1.0::types.MemtrackFlag - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (MemtrackRecord) -# -GEN := $(intermediates)/android/hardware/memtrack/V1_0/MemtrackRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.memtrack@1.0::types.MemtrackRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (MemtrackStatus) -# -GEN := $(intermediates)/android/hardware/memtrack/V1_0/MemtrackStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.memtrack@1.0::types.MemtrackStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (MemtrackType) -# -GEN := $(intermediates)/android/hardware/memtrack/V1_0/MemtrackType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.memtrack@1.0::types.MemtrackType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IMemtrack.hal -# -GEN := $(intermediates)/android/hardware/memtrack/V1_0/IMemtrack.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IMemtrack.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.memtrack@1.0::IMemtrack - -$(GEN): $(LOCAL_PATH)/IMemtrack.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/nfc/1.0/Android.mk b/nfc/1.0/Android.mk index 85ce5508ae..bff25632c2 100644 --- a/nfc/1.0/Android.mk +++ b/nfc/1.0/Android.mk @@ -102,106 +102,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.nfc-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (NfcEvent) -# -GEN := $(intermediates)/android/hardware/nfc/V1_0/NfcEvent.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.nfc@1.0::types.NfcEvent - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NfcStatus) -# -GEN := $(intermediates)/android/hardware/nfc/V1_0/NfcStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.nfc@1.0::types.NfcStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build INfc.hal -# -GEN := $(intermediates)/android/hardware/nfc/V1_0/INfc.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/INfc.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/INfcClientCallback.hal -$(GEN): $(LOCAL_PATH)/INfcClientCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.nfc@1.0::INfc - -$(GEN): $(LOCAL_PATH)/INfc.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build INfcClientCallback.hal -# -GEN := $(intermediates)/android/hardware/nfc/V1_0/INfcClientCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/INfcClientCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.nfc@1.0::INfcClientCallback - -$(GEN): $(LOCAL_PATH)/INfcClientCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/oemlock/1.0/Android.mk b/oemlock/1.0/Android.mk index d9864414ae..91cc8f8cbc 100644 --- a/oemlock/1.0/Android.mk +++ b/oemlock/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (OemLockSecureStatus) @@ -77,80 +79,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.oemlock-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (OemLockSecureStatus) -# -GEN := $(intermediates)/android/hardware/oemlock/V1_0/OemLockSecureStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.oemlock@1.0::types.OemLockSecureStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OemLockStatus) -# -GEN := $(intermediates)/android/hardware/oemlock/V1_0/OemLockStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.oemlock@1.0::types.OemLockStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IOemLock.hal -# -GEN := $(intermediates)/android/hardware/oemlock/V1_0/IOemLock.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOemLock.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.oemlock@1.0::IOemLock - -$(GEN): $(LOCAL_PATH)/IOemLock.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/power/1.0/Android.mk b/power/1.0/Android.mk index 8a89a45269..414d0c338e 100644 --- a/power/1.0/Android.mk +++ b/power/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Feature) @@ -134,137 +136,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.power-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (Feature) -# -GEN := $(intermediates)/android/hardware/power/V1_0/Feature.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.0::types.Feature - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PowerHint) -# -GEN := $(intermediates)/android/hardware/power/V1_0/PowerHint.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.0::types.PowerHint - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PowerStatePlatformSleepState) -# -GEN := $(intermediates)/android/hardware/power/V1_0/PowerStatePlatformSleepState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.0::types.PowerStatePlatformSleepState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PowerStateVoter) -# -GEN := $(intermediates)/android/hardware/power/V1_0/PowerStateVoter.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.0::types.PowerStateVoter - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Status) -# -GEN := $(intermediates)/android/hardware/power/V1_0/Status.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.0::types.Status - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IPower.hal -# -GEN := $(intermediates)/android/hardware/power/V1_0/IPower.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IPower.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.0::IPower - -$(GEN): $(LOCAL_PATH)/IPower.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/power/1.1/Android.mk b/power/1.1/Android.mk index 16cfcbd4f2..5044cfa61e 100644 --- a/power/1.1/Android.mk +++ b/power/1.1/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.power-V1.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (PowerStateSubsystem) @@ -78,81 +80,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.power-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.power-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (PowerStateSubsystem) -# -GEN := $(intermediates)/android/hardware/power/V1_1/PowerStateSubsystem.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.1::types.PowerStateSubsystem - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PowerStateSubsystemSleepState) -# -GEN := $(intermediates)/android/hardware/power/V1_1/PowerStateSubsystemSleepState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.1::types.PowerStateSubsystemSleepState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IPower.hal -# -GEN := $(intermediates)/android/hardware/power/V1_1/IPower.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IPower.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.power@1.1::IPower - -$(GEN): $(LOCAL_PATH)/IPower.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/radio/1.0/Android.mk b/radio/1.0/Android.mk index d5ba4cf263..4225120e38 100644 --- a/radio/1.0/Android.mk +++ b/radio/1.0/Android.mk @@ -3057,3060 +3057,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.radio-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (ActivityStatsInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ActivityStatsInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.ActivityStatsInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ApnAuthType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ApnAuthType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.ApnAuthType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ApnTypes) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ApnTypes.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.ApnTypes - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (AppState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/AppState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.AppState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (AppStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/AppStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.AppStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (AppType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/AppType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.AppType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Call) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/Call.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.Call - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CallForwardInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CallForwardInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CallForwardInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CallForwardInfoStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CallForwardInfoStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CallForwardInfoStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CallPresentation) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CallPresentation.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CallPresentation - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CallState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CallState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CallState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CardState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CardState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CardState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CardStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CardStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CardStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Carrier) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/Carrier.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.Carrier - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CarrierMatchType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CarrierMatchType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CarrierMatchType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CarrierRestrictions) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CarrierRestrictions.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CarrierRestrictions - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaBroadcastSmsConfigInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaBroadcastSmsConfigInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaBroadcastSmsConfigInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaCallWaiting) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaCallWaiting.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaCallWaiting - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaCallWaitingNumberPlan) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaCallWaitingNumberPlan.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaCallWaitingNumberPlan - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaCallWaitingNumberPresentation) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaCallWaitingNumberPresentation.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaCallWaitingNumberPresentation - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaCallWaitingNumberType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaCallWaitingNumberType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaCallWaitingNumberType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaDisplayInfoRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaDisplayInfoRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaDisplayInfoRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaInfoRecName) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaInfoRecName.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaInfoRecName - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaInformationRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaInformationRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaInformationRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaInformationRecords) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaInformationRecords.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaInformationRecords - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaLineControlInfoRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaLineControlInfoRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaLineControlInfoRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaNumberInfoRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaNumberInfoRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaNumberInfoRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaOtaProvisionStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaOtaProvisionStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaOtaProvisionStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaRedirectingNumberInfoRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaRedirectingNumberInfoRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaRedirectingNumberInfoRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaRedirectingReason) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaRedirectingReason.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaRedirectingReason - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaRoamingType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaRoamingType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaRoamingType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSignalInfoRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSignalInfoRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSignalInfoRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSignalStrength) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSignalStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSignalStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsAck) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsAck.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsAck - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsAddress) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsAddress.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsAddress - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsDigitMode) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsDigitMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsDigitMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsErrorClass) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsErrorClass.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsErrorClass - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsMessage) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsMessage.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsMessage - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsNumberMode) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsNumberMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsNumberMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsNumberPlan) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsNumberPlan.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsNumberPlan - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsNumberType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsNumberType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsNumberType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsSubaddress) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsSubaddress.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsSubaddress - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsSubaddressType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsSubaddressType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsSubaddressType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsWriteArgs) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsWriteArgs.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsWriteArgs - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSmsWriteArgsStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSmsWriteArgsStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSmsWriteArgsStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaSubscriptionSource) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaSubscriptionSource.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaSubscriptionSource - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaT53AudioControlInfoRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaT53AudioControlInfoRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaT53AudioControlInfoRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CdmaT53ClirInfoRecord) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CdmaT53ClirInfoRecord.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CdmaT53ClirInfoRecord - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellIdentity) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentity.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellIdentity - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellIdentityCdma) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityCdma.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellIdentityCdma - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellIdentityGsm) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityGsm.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellIdentityGsm - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellIdentityLte) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityLte.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellIdentityLte - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellIdentityTdscdma) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityTdscdma.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellIdentityTdscdma - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellIdentityWcdma) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellIdentityWcdma.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellIdentityWcdma - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellInfoCdma) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoCdma.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellInfoCdma - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellInfoGsm) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoGsm.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellInfoGsm - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellInfoLte) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoLte.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellInfoLte - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellInfoTdscdma) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoTdscdma.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellInfoTdscdma - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellInfoType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellInfoType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CellInfoWcdma) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CellInfoWcdma.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CellInfoWcdma - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CfData) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/CfData.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.CfData - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ClipStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ClipStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.ClipStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Clir) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/Clir.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.Clir - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DataCallFailCause) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/DataCallFailCause.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.DataCallFailCause - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DataProfileId) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/DataProfileId.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.DataProfileId - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DataProfileInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/DataProfileInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.DataProfileInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DataProfileInfoType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/DataProfileInfoType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.DataProfileInfoType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DataRegStateResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/DataRegStateResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.DataRegStateResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DeviceStateType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/DeviceStateType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.DeviceStateType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Dial) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/Dial.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.Dial - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (EvdoSignalStrength) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/EvdoSignalStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.EvdoSignalStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GsmBroadcastSmsConfigInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/GsmBroadcastSmsConfigInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.GsmBroadcastSmsConfigInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GsmSignalStrength) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/GsmSignalStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.GsmSignalStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GsmSmsMessage) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/GsmSmsMessage.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.GsmSmsMessage - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HardwareConfig) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.HardwareConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HardwareConfigModem) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfigModem.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.HardwareConfigModem - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HardwareConfigSim) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfigSim.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.HardwareConfigSim - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HardwareConfigState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfigState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.HardwareConfigState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HardwareConfigType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/HardwareConfigType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.HardwareConfigType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (IccIo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/IccIo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.IccIo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (IccIoResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/IccIoResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.IccIoResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ImsSmsMessage) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ImsSmsMessage.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.ImsSmsMessage - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (IndicationFilter) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/IndicationFilter.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.IndicationFilter - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (LastCallFailCause) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/LastCallFailCause.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.LastCallFailCause - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (LastCallFailCauseInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/LastCallFailCauseInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.LastCallFailCauseInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (LceDataInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/LceDataInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.LceDataInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (LceStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/LceStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.LceStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (LceStatusInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/LceStatusInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.LceStatusInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (LteSignalStrength) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/LteSignalStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.LteSignalStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (MvnoType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/MvnoType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.MvnoType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NeighboringCell) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/NeighboringCell.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.NeighboringCell - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NvItem) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/NvItem.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.NvItem - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NvWriteItem) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/NvWriteItem.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.NvWriteItem - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OperatorInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/OperatorInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.OperatorInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OperatorStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/OperatorStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.OperatorStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (P2Constant) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/P2Constant.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.P2Constant - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PcoDataInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/PcoDataInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.PcoDataInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PersoSubstate) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/PersoSubstate.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.PersoSubstate - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PhoneRestrictedState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/PhoneRestrictedState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.PhoneRestrictedState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PinState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/PinState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.PinState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PreferredNetworkType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/PreferredNetworkType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.PreferredNetworkType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioAccessFamily) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioAccessFamily.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioAccessFamily - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioBandMode) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioBandMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioBandMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioCapability) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioCapability.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioCapability - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioCapabilityPhase) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioCapabilityPhase.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioCapabilityPhase - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioCapabilityStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioCapabilityStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioCapabilityStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioCdmaSmsConst) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioCdmaSmsConst.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioCdmaSmsConst - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioConst) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioConst.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioConst - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioError) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioError.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioError - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioIndicationType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioIndicationType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioIndicationType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioResponseInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioResponseInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioResponseInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioResponseType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioResponseType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioResponseType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioTechnology) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioTechnology.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioTechnology - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioTechnologyFamily) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RadioTechnologyFamily.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RadioTechnologyFamily - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RegState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RegState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RegState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ResetNvType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ResetNvType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.ResetNvType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RestrictedState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/RestrictedState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.RestrictedState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SapApduType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SapApduType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SapApduType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SapConnectRsp) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SapConnectRsp.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SapConnectRsp - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SapDisconnectType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SapDisconnectType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SapDisconnectType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SapResultCode) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SapResultCode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SapResultCode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SapStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SapStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SapStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SapTransferProtocol) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SapTransferProtocol.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SapTransferProtocol - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SelectUiccSub) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SelectUiccSub.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SelectUiccSub - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SendSmsResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SendSmsResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SendSmsResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SetupDataCallResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SetupDataCallResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SetupDataCallResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SignalStrength) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SignalStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SignalStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SimApdu) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SimApdu.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SimApdu - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SimRefreshResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SimRefreshResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SimRefreshResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SimRefreshType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SimRefreshType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SimRefreshType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SmsAcknowledgeFailCause) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SmsAcknowledgeFailCause.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SmsAcknowledgeFailCause - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SmsWriteArgs) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SmsWriteArgs.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SmsWriteArgs - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SmsWriteArgsStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SmsWriteArgsStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SmsWriteArgsStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SrvccState) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SrvccState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SrvccState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SsInfoData) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SsInfoData.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SsInfoData - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SsRequestType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SsRequestType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SsRequestType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SsServiceType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SsServiceType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SsServiceType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SsTeleserviceType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SsTeleserviceType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SsTeleserviceType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StkCcUnsolSsResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/StkCcUnsolSsResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.StkCcUnsolSsResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SubscriptionType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SubscriptionType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SubscriptionType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SuppServiceClass) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SuppServiceClass.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SuppServiceClass - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SuppSvcNotification) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/SuppSvcNotification.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.SuppSvcNotification - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TdScdmaSignalStrength) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/TdScdmaSignalStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.TdScdmaSignalStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TimeStampType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/TimeStampType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.TimeStampType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TtyMode) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/TtyMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.TtyMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (UiccSubActStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/UiccSubActStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.UiccSubActStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (UssdModeType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/UssdModeType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.UssdModeType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (UusDcs) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/UusDcs.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.UusDcs - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (UusInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/UusInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.UusInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (UusType) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/UusType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.UusType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VoiceRegStateResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/VoiceRegStateResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.VoiceRegStateResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WcdmaSignalStrength) -# -GEN := $(intermediates)/android/hardware/radio/V1_0/WcdmaSignalStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::types.WcdmaSignalStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IRadio.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_0/IRadio.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadio.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IRadioIndication.hal -$(GEN): $(LOCAL_PATH)/IRadioIndication.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IRadioResponse.hal -$(GEN): $(LOCAL_PATH)/IRadioResponse.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::IRadio - -$(GEN): $(LOCAL_PATH)/IRadio.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IRadioIndication.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_0/IRadioIndication.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadioIndication.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::IRadioIndication - -$(GEN): $(LOCAL_PATH)/IRadioIndication.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IRadioResponse.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_0/IRadioResponse.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadioResponse.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::IRadioResponse - -$(GEN): $(LOCAL_PATH)/IRadioResponse.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISap.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ISap.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISap.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISapCallback.hal -$(GEN): $(LOCAL_PATH)/ISapCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::ISap - -$(GEN): $(LOCAL_PATH)/ISap.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISapCallback.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_0/ISapCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISapCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.0::ISapCallback - -$(GEN): $(LOCAL_PATH)/ISapCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/radio/1.1/Android.mk b/radio/1.1/Android.mk index 74ce516309..0535bb1e54 100644 --- a/radio/1.1/Android.mk +++ b/radio/1.1/Android.mk @@ -388,391 +388,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.radio-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.radio-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (CardPowerState) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/CardPowerState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.CardPowerState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (EutranBands) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/EutranBands.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.EutranBands - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (GeranBands) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/GeranBands.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.GeranBands - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ImsiEncryptionInfo) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/ImsiEncryptionInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.ImsiEncryptionInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (KeepaliveRequest) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.KeepaliveRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (KeepaliveStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.KeepaliveStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (KeepaliveStatusCode) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveStatusCode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.KeepaliveStatusCode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (KeepaliveType) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/KeepaliveType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.KeepaliveType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NetworkScanRequest) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/NetworkScanRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.NetworkScanRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NetworkScanResult) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/NetworkScanResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.NetworkScanResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioAccessNetworks) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/RadioAccessNetworks.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.RadioAccessNetworks - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RadioAccessSpecifier) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/RadioAccessSpecifier.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.RadioAccessSpecifier - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ScanStatus) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/ScanStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.ScanStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ScanType) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/ScanType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.ScanType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (UtranBands) -# -GEN := $(intermediates)/android/hardware/radio/V1_1/UtranBands.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::types.UtranBands - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IRadio.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_1/IRadio.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadio.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::IRadio - -$(GEN): $(LOCAL_PATH)/IRadio.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IRadioIndication.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_1/IRadioIndication.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadioIndication.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::IRadioIndication - -$(GEN): $(LOCAL_PATH)/IRadioIndication.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IRadioResponse.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_1/IRadioResponse.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IRadioResponse.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::IRadioResponse - -$(GEN): $(LOCAL_PATH)/IRadioResponse.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISap.hal -# -GEN := $(intermediates)/android/hardware/radio/V1_1/ISap.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISap.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio@1.1::ISap - -$(GEN): $(LOCAL_PATH)/ISap.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/radio/deprecated/1.0/Android.mk b/radio/deprecated/1.0/Android.mk index e7516c85d2..2a410b2e95 100644 --- a/radio/deprecated/1.0/Android.mk +++ b/radio/deprecated/1.0/Android.mk @@ -82,85 +82,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.radio.deprecated-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.radio-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build IOemHook.hal -# -GEN := $(intermediates)/android/hardware/radio/deprecated/V1_0/IOemHook.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOemHook.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IOemHookIndication.hal -$(GEN): $(LOCAL_PATH)/IOemHookIndication.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IOemHookResponse.hal -$(GEN): $(LOCAL_PATH)/IOemHookResponse.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio.deprecated@1.0::IOemHook - -$(GEN): $(LOCAL_PATH)/IOemHook.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IOemHookIndication.hal -# -GEN := $(intermediates)/android/hardware/radio/deprecated/V1_0/IOemHookIndication.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOemHookIndication.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio.deprecated@1.0::IOemHookIndication - -$(GEN): $(LOCAL_PATH)/IOemHookIndication.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IOemHookResponse.hal -# -GEN := $(intermediates)/android/hardware/radio/deprecated/V1_0/IOemHookResponse.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOemHookResponse.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.radio.deprecated@1.0::IOemHookResponse - -$(GEN): $(LOCAL_PATH)/IOemHookResponse.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/baz/1.0/Android.mk b/tests/baz/1.0/Android.mk index 52d6b0ce63..603e552d85 100644 --- a/tests/baz/1.0/Android.mk +++ b/tests/baz/1.0/Android.mk @@ -100,103 +100,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tests.baz-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build IBase.hal -# -GEN := $(intermediates)/android/hardware/tests/baz/V1_0/IBase.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBase.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.baz@1.0::IBase - -$(GEN): $(LOCAL_PATH)/IBase.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IBaz.hal -# -GEN := $(intermediates)/android/hardware/tests/baz/V1_0/IBaz.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBaz.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IBase.hal -$(GEN): $(LOCAL_PATH)/IBase.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IBazCallback.hal -$(GEN): $(LOCAL_PATH)/IBazCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.baz@1.0::IBaz - -$(GEN): $(LOCAL_PATH)/IBaz.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IBazCallback.hal -# -GEN := $(intermediates)/android/hardware/tests/baz/V1_0/IBazCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBazCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.baz@1.0::IBazCallback - -$(GEN): $(LOCAL_PATH)/IBazCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IQuux.hal -# -GEN := $(intermediates)/android/hardware/tests/baz/V1_0/IQuux.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IQuux.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.baz@1.0::IQuux - -$(GEN): $(LOCAL_PATH)/IQuux.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/expression/1.0/Android.mk b/tests/expression/1.0/Android.mk index 499ec3faf8..7f716fd517 100644 --- a/tests/expression/1.0/Android.mk +++ b/tests/expression/1.0/Android.mk @@ -60,63 +60,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tests.expression-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build IExpression.hal -# -GEN := $(intermediates)/android/hardware/tests/expression/V1_0/IExpression.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IExpression.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.expression@1.0::IExpression - -$(GEN): $(LOCAL_PATH)/IExpression.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IExpressionExt.hal -# -GEN := $(intermediates)/android/hardware/tests/expression/V1_0/IExpressionExt.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IExpressionExt.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IExpression.hal -$(GEN): $(LOCAL_PATH)/IExpression.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.expression@1.0::IExpressionExt - -$(GEN): $(LOCAL_PATH)/IExpressionExt.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/extension/light/2.0/Android.mk b/tests/extension/light/2.0/Android.mk index f1e10e47ee..485230b11a 100644 --- a/tests/extension/light/2.0/Android.mk +++ b/tests/extension/light/2.0/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.light-V2.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Default) @@ -97,100 +99,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tests.extension.light-V2.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.light-V2.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (Default) -# -GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/Default.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.extension.light@2.0::types.Default - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ExtBrightness) -# -GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/ExtBrightness.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.extension.light@2.0::types.ExtBrightness - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ExtLightState) -# -GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/ExtLightState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.extension.light@2.0::types.ExtLightState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IExtLight.hal -# -GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/IExtLight.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IExtLight.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.extension.light@2.0::IExtLight - -$(GEN): $(LOCAL_PATH)/IExtLight.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/hash/1.0/Android.mk b/tests/hash/1.0/Android.mk index cd813cb74f..94a594e709 100644 --- a/tests/hash/1.0/Android.mk +++ b/tests/hash/1.0/Android.mk @@ -39,42 +39,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tests.hash-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build IHash.hal -# -GEN := $(intermediates)/android/hardware/tests/hash/V1_0/IHash.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IHash.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.hash@1.0::IHash - -$(GEN): $(LOCAL_PATH)/IHash.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/inheritance/1.0/Android.mk b/tests/inheritance/1.0/Android.mk index 5b6ccefbcb..f01b9782ff 100644 --- a/tests/inheritance/1.0/Android.mk +++ b/tests/inheritance/1.0/Android.mk @@ -106,109 +106,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tests.inheritance-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build IChild.hal -# -GEN := $(intermediates)/android/hardware/tests/inheritance/V1_0/IChild.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IChild.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IParent.hal -$(GEN): $(LOCAL_PATH)/IParent.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.inheritance@1.0::IChild - -$(GEN): $(LOCAL_PATH)/IChild.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IFetcher.hal -# -GEN := $(intermediates)/android/hardware/tests/inheritance/V1_0/IFetcher.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IFetcher.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IChild.hal -$(GEN): $(LOCAL_PATH)/IChild.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGrandparent.hal -$(GEN): $(LOCAL_PATH)/IGrandparent.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IParent.hal -$(GEN): $(LOCAL_PATH)/IParent.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.inheritance@1.0::IFetcher - -$(GEN): $(LOCAL_PATH)/IFetcher.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IGrandparent.hal -# -GEN := $(intermediates)/android/hardware/tests/inheritance/V1_0/IGrandparent.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IGrandparent.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.inheritance@1.0::IGrandparent - -$(GEN): $(LOCAL_PATH)/IGrandparent.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IParent.hal -# -GEN := $(intermediates)/android/hardware/tests/inheritance/V1_0/IParent.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IParent.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IGrandparent.hal -$(GEN): $(LOCAL_PATH)/IGrandparent.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.inheritance@1.0::IParent - -$(GEN): $(LOCAL_PATH)/IParent.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/libhwbinder/1.0/Android.mk b/tests/libhwbinder/1.0/Android.mk index c821f861e6..1ac7681b5a 100644 --- a/tests/libhwbinder/1.0/Android.mk +++ b/tests/libhwbinder/1.0/Android.mk @@ -58,61 +58,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tests.libhwbinder-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build IBenchmark.hal -# -GEN := $(intermediates)/android/hardware/tests/libhwbinder/V1_0/IBenchmark.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBenchmark.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.libhwbinder@1.0::IBenchmark - -$(GEN): $(LOCAL_PATH)/IBenchmark.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IScheduleTest.hal -# -GEN := $(intermediates)/android/hardware/tests/libhwbinder/V1_0/IScheduleTest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IScheduleTest.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.libhwbinder@1.0::IScheduleTest - -$(GEN): $(LOCAL_PATH)/IScheduleTest.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/multithread/1.0/Android.mk b/tests/multithread/1.0/Android.mk index 08fd8fb6f8..a2d2b100e6 100644 --- a/tests/multithread/1.0/Android.mk +++ b/tests/multithread/1.0/Android.mk @@ -39,42 +39,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tests.multithread-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build IMultithread.hal -# -GEN := $(intermediates)/android/hardware/tests/multithread/V1_0/IMultithread.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IMultithread.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tests.multithread@1.0::IMultithread - -$(GEN): $(LOCAL_PATH)/IMultithread.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tetheroffload/control/1.0/Android.mk b/tetheroffload/control/1.0/Android.mk index 4185a6671b..7e642bec24 100644 --- a/tetheroffload/control/1.0/Android.mk +++ b/tetheroffload/control/1.0/Android.mk @@ -138,141 +138,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tetheroffload.control-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (IPv4AddrPortPair) -# -GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/IPv4AddrPortPair.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tetheroffload.control@1.0::types.IPv4AddrPortPair - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NatTimeoutUpdate) -# -GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/NatTimeoutUpdate.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tetheroffload.control@1.0::types.NatTimeoutUpdate - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NetworkProtocol) -# -GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/NetworkProtocol.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tetheroffload.control@1.0::types.NetworkProtocol - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OffloadCallbackEvent) -# -GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/OffloadCallbackEvent.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tetheroffload.control@1.0::types.OffloadCallbackEvent - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IOffloadControl.hal -# -GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/IOffloadControl.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IOffloadControl.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ITetheringOffloadCallback.hal -$(GEN): $(LOCAL_PATH)/ITetheringOffloadCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tetheroffload.control@1.0::IOffloadControl - -$(GEN): $(LOCAL_PATH)/IOffloadControl.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ITetheringOffloadCallback.hal -# -GEN := $(intermediates)/android/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ITetheringOffloadCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tetheroffload.control@1.0::ITetheringOffloadCallback - -$(GEN): $(LOCAL_PATH)/ITetheringOffloadCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/thermal/1.0/Android.mk b/thermal/1.0/Android.mk index 5a0a9a0a86..0b8206ea27 100644 --- a/thermal/1.0/Android.mk +++ b/thermal/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (CoolingDevice) @@ -172,176 +174,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.thermal-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (CoolingDevice) -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/CoolingDevice.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::types.CoolingDevice - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CoolingType) -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/CoolingType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::types.CoolingType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CpuUsage) -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/CpuUsage.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::types.CpuUsage - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Temperature) -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/Temperature.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::types.Temperature - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (TemperatureType) -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/TemperatureType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::types.TemperatureType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ThermalStatus) -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/ThermalStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::types.ThermalStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (ThermalStatusCode) -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/ThermalStatusCode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::types.ThermalStatusCode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IThermal.hal -# -GEN := $(intermediates)/android/hardware/thermal/V1_0/IThermal.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermal.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.0::IThermal - -$(GEN): $(LOCAL_PATH)/IThermal.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/thermal/1.1/Android.bp b/thermal/1.1/Android.bp index 833f219ed6..0985d947b6 100644 --- a/thermal/1.1/Android.bp +++ b/thermal/1.1/Android.bp @@ -42,13 +42,16 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.thermal@1.1", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.thermal@1.1_genc++"], generated_headers: ["android.hardware.thermal@1.1_genc++_headers"], export_generated_headers: ["android.hardware.thermal@1.1_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/thermal/1.1/Android.mk b/thermal/1.1/Android.mk index 082d65b815..059ac8bde7 100644 --- a/thermal/1.1/Android.mk +++ b/thermal/1.1/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.thermal-V1.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build IThermal.hal @@ -59,62 +61,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.thermal-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.thermal-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build IThermal.hal -# -GEN := $(intermediates)/android/hardware/thermal/V1_1/IThermal.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermal.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IThermalCallback.hal -$(GEN): $(LOCAL_PATH)/IThermalCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.1::IThermal - -$(GEN): $(LOCAL_PATH)/IThermal.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IThermalCallback.hal -# -GEN := $(intermediates)/android/hardware/thermal/V1_1/IThermalCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermalCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.thermal@1.1::IThermalCallback - -$(GEN): $(LOCAL_PATH)/IThermalCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tv/cec/1.0/Android.mk b/tv/cec/1.0/Android.mk index 1e3853d08e..7cccf90cd0 100644 --- a/tv/cec/1.0/Android.mk +++ b/tv/cec/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (AbortReason) @@ -290,293 +292,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.tv.cec-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (AbortReason) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/AbortReason.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.AbortReason - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CecDeviceType) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/CecDeviceType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.CecDeviceType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CecLogicalAddress) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/CecLogicalAddress.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.CecLogicalAddress - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CecMessage) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/CecMessage.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.CecMessage - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (CecMessageType) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/CecMessageType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.CecMessageType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HdmiPortInfo) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/HdmiPortInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.HdmiPortInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HdmiPortType) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/HdmiPortType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.HdmiPortType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (HotplugEvent) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/HotplugEvent.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.HotplugEvent - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (MaxLength) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/MaxLength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.MaxLength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (OptionKey) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/OptionKey.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.OptionKey - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Result) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/Result.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.Result - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SendMessageResult) -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/SendMessageResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::types.SendMessageResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IHdmiCec.hal -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/IHdmiCec.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IHdmiCec.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IHdmiCecCallback.hal -$(GEN): $(LOCAL_PATH)/IHdmiCecCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::IHdmiCec - -$(GEN): $(LOCAL_PATH)/IHdmiCec.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IHdmiCecCallback.hal -# -GEN := $(intermediates)/android/hardware/tv/cec/V1_0/IHdmiCecCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IHdmiCecCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.tv.cec@1.0::IHdmiCecCallback - -$(GEN): $(LOCAL_PATH)/IHdmiCecCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/usb/1.0/Android.mk b/usb/1.0/Android.mk index 62f69354bc..32d03a3142 100644 --- a/usb/1.0/Android.mk +++ b/usb/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (PortDataRole) @@ -195,199 +197,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.usb-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (PortDataRole) -# -GEN := $(intermediates)/android/hardware/usb/V1_0/PortDataRole.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::types.PortDataRole - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PortMode) -# -GEN := $(intermediates)/android/hardware/usb/V1_0/PortMode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::types.PortMode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PortPowerRole) -# -GEN := $(intermediates)/android/hardware/usb/V1_0/PortPowerRole.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::types.PortPowerRole - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PortRole) -# -GEN := $(intermediates)/android/hardware/usb/V1_0/PortRole.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::types.PortRole - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PortRoleType) -# -GEN := $(intermediates)/android/hardware/usb/V1_0/PortRoleType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::types.PortRoleType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PortStatus) -# -GEN := $(intermediates)/android/hardware/usb/V1_0/PortStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::types.PortStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Status) -# -GEN := $(intermediates)/android/hardware/usb/V1_0/Status.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::types.Status - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IUsb.hal -# -GEN := $(intermediates)/android/hardware/usb/V1_0/IUsb.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsb.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IUsbCallback.hal -$(GEN): $(LOCAL_PATH)/IUsbCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::IUsb - -$(GEN): $(LOCAL_PATH)/IUsb.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IUsbCallback.hal -# -GEN := $(intermediates)/android/hardware/usb/V1_0/IUsbCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsbCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.0::IUsbCallback - -$(GEN): $(LOCAL_PATH)/IUsbCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/usb/1.1/Android.mk b/usb/1.1/Android.mk index 12d306b922..57147f18e5 100644 --- a/usb/1.1/Android.mk +++ b/usb/1.1/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.usb-V1.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (PortMode_1_1) @@ -97,101 +99,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.usb-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.usb-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (PortMode_1_1) -# -GEN := $(intermediates)/android/hardware/usb/V1_1/PortMode_1_1.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.1::types.PortMode_1_1 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (PortStatus_1_1) -# -GEN := $(intermediates)/android/hardware/usb/V1_1/PortStatus_1_1.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.1::types.PortStatus_1_1 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IUsb.hal -# -GEN := $(intermediates)/android/hardware/usb/V1_1/IUsb.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsb.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.1::IUsb - -$(GEN): $(LOCAL_PATH)/IUsb.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IUsbCallback.hal -# -GEN := $(intermediates)/android/hardware/usb/V1_1/IUsbCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsbCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.usb@1.1::IUsbCallback - -$(GEN): $(LOCAL_PATH)/IUsbCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/vibrator/1.0/Android.mk b/vibrator/1.0/Android.mk index c54b655a39..4e03392f32 100644 --- a/vibrator/1.0/Android.mk +++ b/vibrator/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Effect) @@ -96,100 +98,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.vibrator-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (Effect) -# -GEN := $(intermediates)/android/hardware/vibrator/V1_0/Effect.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.vibrator@1.0::types.Effect - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (EffectStrength) -# -GEN := $(intermediates)/android/hardware/vibrator/V1_0/EffectStrength.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.vibrator@1.0::types.EffectStrength - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Status) -# -GEN := $(intermediates)/android/hardware/vibrator/V1_0/Status.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.vibrator@1.0::types.Status - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IVibrator.hal -# -GEN := $(intermediates)/android/hardware/vibrator/V1_0/IVibrator.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVibrator.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.vibrator@1.0::IVibrator - -$(GEN): $(LOCAL_PATH)/IVibrator.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/vibrator/1.1/Android.mk b/vibrator/1.1/Android.mk index 2344e9141d..d08f8376d9 100644 --- a/vibrator/1.1/Android.mk +++ b/vibrator/1.1/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.vibrator-V1.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (Effect_1_1) @@ -59,63 +61,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.vibrator-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.vibrator-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (Effect_1_1) -# -GEN := $(intermediates)/android/hardware/vibrator/V1_1/Effect_1_1.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.vibrator@1.1::types.Effect_1_1 - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IVibrator.hal -# -GEN := $(intermediates)/android/hardware/vibrator/V1_1/IVibrator.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVibrator.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.vibrator@1.1::IVibrator - -$(GEN): $(LOCAL_PATH)/IVibrator.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/vr/1.0/Android.mk b/vr/1.0/Android.mk index fc5c675d12..1115963032 100644 --- a/vr/1.0/Android.mk +++ b/vr/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build IVr.hal @@ -37,40 +39,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.vr-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build IVr.hal -# -GEN := $(intermediates)/android/hardware/vr/V1_0/IVr.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVr.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.vr@1.0::IVr - -$(GEN): $(LOCAL_PATH)/IVr.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/weaver/1.0/Android.mk b/weaver/1.0/Android.mk index 7f35b4e2fd..ab33a158db 100644 --- a/weaver/1.0/Android.mk +++ b/weaver/1.0/Android.mk @@ -15,6 +15,8 @@ HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build types.hal (WeaverConfig) @@ -115,118 +117,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.weaver-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (WeaverConfig) -# -GEN := $(intermediates)/android/hardware/weaver/V1_0/WeaverConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.weaver@1.0::types.WeaverConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WeaverReadResponse) -# -GEN := $(intermediates)/android/hardware/weaver/V1_0/WeaverReadResponse.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.weaver@1.0::types.WeaverReadResponse - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WeaverReadStatus) -# -GEN := $(intermediates)/android/hardware/weaver/V1_0/WeaverReadStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.weaver@1.0::types.WeaverReadStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WeaverStatus) -# -GEN := $(intermediates)/android/hardware/weaver/V1_0/WeaverStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.weaver@1.0::types.WeaverStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWeaver.hal -# -GEN := $(intermediates)/android/hardware/weaver/V1_0/IWeaver.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWeaver.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.weaver@1.0::IWeaver - -$(GEN): $(LOCAL_PATH)/IWeaver.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/wifi/1.0/Android.mk b/wifi/1.0/Android.mk index bceb635203..b89724ca73 100644 --- a/wifi/1.0/Android.mk +++ b/wifi/1.0/Android.mk @@ -1883,1887 +1883,6 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.wifi-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (IfaceType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IfaceType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.IfaceType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanBandIndex) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanBandIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanBandIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanBandSpecificConfig) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanBandSpecificConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanBandSpecificConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanCapabilities) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanCapabilities.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanCapabilities - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanCipherSuiteType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanCipherSuiteType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanCipherSuiteType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanClusterEventInd) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanClusterEventInd.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanClusterEventInd - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanClusterEventType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanClusterEventType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanClusterEventType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanConfigRequest) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanConfigRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanConfigRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanDataPathChannelCfg) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathChannelCfg.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanDataPathChannelCfg - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanDataPathConfirmInd) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathConfirmInd.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanDataPathConfirmInd - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanDataPathRequestInd) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathRequestInd.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanDataPathRequestInd - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanDataPathSecurityConfig) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathSecurityConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanDataPathSecurityConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanDataPathSecurityType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDataPathSecurityType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanDataPathSecurityType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanDebugConfig) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDebugConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanDebugConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanDiscoveryCommonConfig) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanDiscoveryCommonConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanDiscoveryCommonConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanEnableRequest) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanEnableRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanEnableRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanFollowupReceivedInd) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanFollowupReceivedInd.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanFollowupReceivedInd - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanInitiateDataPathRequest) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanInitiateDataPathRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanInitiateDataPathRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanMatchAlg) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanMatchAlg.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanMatchAlg - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanMatchInd) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanMatchInd.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanMatchInd - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanParamSizeLimits) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanParamSizeLimits.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanParamSizeLimits - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanPublishRequest) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanPublishRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanPublishRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanPublishType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanPublishType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanPublishType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanRangingIndication) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanRangingIndication.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanRangingIndication - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanRespondToDataPathIndicationRequest) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanRespondToDataPathIndicationRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanRespondToDataPathIndicationRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanSrfType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanSrfType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanSrfType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanStatusType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanStatusType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanStatusType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanSubscribeRequest) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanSubscribeRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanSubscribeRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanSubscribeType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanSubscribeType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanSubscribeType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanTransmitFollowupRequest) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanTransmitFollowupRequest.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanTransmitFollowupRequest - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (NanTxType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/NanTxType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.NanTxType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttBw) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttBw.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttBw - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttCapabilities) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttCapabilities.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttCapabilities - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttConfig) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttLciInformation) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttLciInformation.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttLciInformation - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttLcrInformation) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttLcrInformation.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttLcrInformation - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttMotionPattern) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttMotionPattern.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttMotionPattern - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttPeerType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttPeerType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttPeerType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttPreamble) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttPreamble.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttPreamble - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttResponder) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttResponder.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttResponder - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttResult) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttStatus) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (RttType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/RttType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.RttType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaApfPacketFilterCapabilities) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaApfPacketFilterCapabilities.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaApfPacketFilterCapabilities - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaBackgroundScanBucketEventReportSchemeMask) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaBackgroundScanBucketEventReportSchemeMask.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaBackgroundScanBucketEventReportSchemeMask - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaBackgroundScanBucketParameters) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaBackgroundScanBucketParameters.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaBackgroundScanBucketParameters - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaBackgroundScanCapabilities) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaBackgroundScanCapabilities.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaBackgroundScanCapabilities - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaBackgroundScanParameters) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaBackgroundScanParameters.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaBackgroundScanParameters - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaLinkLayerIfacePacketStats) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaLinkLayerIfacePacketStats.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaLinkLayerIfacePacketStats - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaLinkLayerIfaceStats) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaLinkLayerIfaceStats.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaLinkLayerIfaceStats - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaLinkLayerRadioStats) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaLinkLayerRadioStats.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaLinkLayerRadioStats - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaLinkLayerStats) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaLinkLayerStats.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaLinkLayerStats - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaRoamingCapabilities) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaRoamingCapabilities.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaRoamingCapabilities - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaRoamingConfig) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaRoamingConfig.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaRoamingConfig - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaRoamingState) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaRoamingState.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaRoamingState - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaScanData) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaScanData.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaScanData - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaScanDataFlagMask) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaScanDataFlagMask.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaScanDataFlagMask - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaScanLimits) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaScanLimits.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaScanLimits - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (StaScanResult) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/StaScanResult.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.StaScanResult - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiBand) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiBand.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiBand - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiChannelInfo) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiChannelInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiChannelInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiChannelWidthInMhz) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiChannelWidthInMhz.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiChannelWidthInMhz - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugHostWakeReasonRxIcmpPacketDetails) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugHostWakeReasonRxIcmpPacketDetails.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxIcmpPacketDetails - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugHostWakeReasonRxMulticastPacketDetails) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugHostWakeReasonRxMulticastPacketDetails.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxMulticastPacketDetails - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugHostWakeReasonRxPacketDetails) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugHostWakeReasonRxPacketDetails.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxPacketDetails - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugHostWakeReasonStats) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugHostWakeReasonStats.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonStats - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugPacketFateFrameInfo) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugPacketFateFrameInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugPacketFateFrameInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugPacketFateFrameType) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugPacketFateFrameType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugPacketFateFrameType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugRingBufferFlags) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingBufferFlags.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugRingBufferFlags - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugRingBufferStatus) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingBufferStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugRingBufferStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugRingBufferVerboseLevel) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingBufferVerboseLevel.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugRingBufferVerboseLevel - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugRxPacketFate) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRxPacketFate.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugRxPacketFate - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugRxPacketFateReport) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRxPacketFateReport.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugRxPacketFateReport - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugTxPacketFate) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugTxPacketFate.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugTxPacketFate - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiDebugTxPacketFateReport) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugTxPacketFateReport.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiDebugTxPacketFateReport - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiInformationElement) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiInformationElement.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiInformationElement - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiNanStatus) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiNanStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiNanStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiRateInfo) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiRateInfo.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiRateInfo - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiRateNss) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiRateNss.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiRateNss - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiRatePreamble) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiRatePreamble.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiRatePreamble - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiStatus) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WifiStatusCode) -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiStatusCode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::types.WifiStatusCode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifi.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifi.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifi.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiChip.hal -$(GEN): $(LOCAL_PATH)/IWifiChip.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiEventCallback.hal -$(GEN): $(LOCAL_PATH)/IWifiEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifi - -$(GEN): $(LOCAL_PATH)/IWifi.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiApIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiApIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiApIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal -$(GEN): $(LOCAL_PATH)/IWifiIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiApIface - -$(GEN): $(LOCAL_PATH)/IWifiApIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiChip.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiChip.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiChip.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiApIface.hal -$(GEN): $(LOCAL_PATH)/IWifiApIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiChipEventCallback.hal -$(GEN): $(LOCAL_PATH)/IWifiChipEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal -$(GEN): $(LOCAL_PATH)/IWifiIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiNanIface.hal -$(GEN): $(LOCAL_PATH)/IWifiNanIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiP2pIface.hal -$(GEN): $(LOCAL_PATH)/IWifiP2pIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiRttController.hal -$(GEN): $(LOCAL_PATH)/IWifiRttController.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiStaIface.hal -$(GEN): $(LOCAL_PATH)/IWifiStaIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiChip - -$(GEN): $(LOCAL_PATH)/IWifiChip.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiChipEventCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiChipEventCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiChipEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiChipEventCallback - -$(GEN): $(LOCAL_PATH)/IWifiChipEventCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiEventCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiEventCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiEventCallback - -$(GEN): $(LOCAL_PATH)/IWifiEventCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiIface - -$(GEN): $(LOCAL_PATH)/IWifiIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiNanIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiNanIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiNanIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal -$(GEN): $(LOCAL_PATH)/IWifiIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiNanIfaceEventCallback.hal -$(GEN): $(LOCAL_PATH)/IWifiNanIfaceEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiNanIface - -$(GEN): $(LOCAL_PATH)/IWifiNanIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiNanIfaceEventCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiNanIfaceEventCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiNanIfaceEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiNanIfaceEventCallback - -$(GEN): $(LOCAL_PATH)/IWifiNanIfaceEventCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiP2pIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiP2pIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiP2pIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal -$(GEN): $(LOCAL_PATH)/IWifiIface.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiP2pIface - -$(GEN): $(LOCAL_PATH)/IWifiP2pIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiRttController.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiRttController.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiRttController.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal -$(GEN): $(LOCAL_PATH)/IWifiIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiRttControllerEventCallback.hal -$(GEN): $(LOCAL_PATH)/IWifiRttControllerEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiRttController - -$(GEN): $(LOCAL_PATH)/IWifiRttController.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiRttControllerEventCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiRttControllerEventCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiRttControllerEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiRttControllerEventCallback - -$(GEN): $(LOCAL_PATH)/IWifiRttControllerEventCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiStaIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiStaIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiStaIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiIface.hal -$(GEN): $(LOCAL_PATH)/IWifiIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IWifiStaIfaceEventCallback.hal -$(GEN): $(LOCAL_PATH)/IWifiStaIfaceEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiStaIface - -$(GEN): $(LOCAL_PATH)/IWifiStaIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiStaIfaceEventCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_0/IWifiStaIfaceEventCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiStaIfaceEventCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.0::IWifiStaIfaceEventCallback - -$(GEN): $(LOCAL_PATH)/IWifiStaIfaceEventCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - ################################################################################ include $(CLEAR_VARS) diff --git a/wifi/1.1/Android.mk b/wifi/1.1/Android.mk index fbc79ca159..5f4bc6a471 100644 --- a/wifi/1.1/Android.mk +++ b/wifi/1.1/Android.mk @@ -16,6 +16,8 @@ LOCAL_JAVA_LIBRARIES := \ android.hardware.wifi-V1.0-java \ android.hidl.base-V1.0-java \ +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_JAVA_LIBRARIES += core-oj hwbinder # # Build IWifi.hal @@ -57,60 +59,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.wifi-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.wifi-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build IWifi.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_1/IWifi.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifi.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.1::IWifi - -$(GEN): $(LOCAL_PATH)/IWifi.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IWifiChip.hal -# -GEN := $(intermediates)/android/hardware/wifi/V1_1/IWifiChip.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IWifiChip.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi@1.1::IWifiChip - -$(GEN): $(LOCAL_PATH)/IWifiChip.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/wifi/supplicant/1.0/Android.mk b/wifi/supplicant/1.0/Android.mk index 770ed884fb..14a1270ef3 100644 --- a/wifi/supplicant/1.0/Android.mk +++ b/wifi/supplicant/1.0/Android.mk @@ -383,386 +383,5 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(BUILD_JAVA_LIBRARY) -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.wifi.supplicant-V1.0-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hidl.base-V1.0-java-static \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES := core-oj hwbinder - -# -# Build types.hal (IfaceType) -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/IfaceType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::types.IfaceType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (P2pGroupCapabilityMask) -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/P2pGroupCapabilityMask.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::types.P2pGroupCapabilityMask - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SupplicantStatus) -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/SupplicantStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::types.SupplicantStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (SupplicantStatusCode) -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/SupplicantStatusCode.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::types.SupplicantStatusCode - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (WpsConfigMethods) -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/WpsConfigMethods.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::types.WpsConfigMethods - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicant.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicant.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicant.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantCallback.hal -$(GEN): $(LOCAL_PATH)/ISupplicantCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantIface.hal -$(GEN): $(LOCAL_PATH)/ISupplicantIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicant - -$(GEN): $(LOCAL_PATH)/ISupplicant.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantCallback - -$(GEN): $(LOCAL_PATH)/ISupplicantCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantNetwork.hal -$(GEN): $(LOCAL_PATH)/ISupplicantNetwork.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantIface - -$(GEN): $(LOCAL_PATH)/ISupplicantIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantNetwork.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantNetwork.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantNetwork.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantNetwork - -$(GEN): $(LOCAL_PATH)/ISupplicantNetwork.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantP2pIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantP2pIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantIface.hal -$(GEN): $(LOCAL_PATH)/ISupplicantIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantP2pIfaceCallback.hal -$(GEN): $(LOCAL_PATH)/ISupplicantP2pIfaceCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantP2pIface - -$(GEN): $(LOCAL_PATH)/ISupplicantP2pIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantP2pIfaceCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantP2pIfaceCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantP2pIfaceCallback - -$(GEN): $(LOCAL_PATH)/ISupplicantP2pIfaceCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantP2pNetwork.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantP2pNetwork.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantP2pNetwork.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantNetwork.hal -$(GEN): $(LOCAL_PATH)/ISupplicantNetwork.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantP2pNetworkCallback.hal -$(GEN): $(LOCAL_PATH)/ISupplicantP2pNetworkCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantP2pNetwork - -$(GEN): $(LOCAL_PATH)/ISupplicantP2pNetwork.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantP2pNetworkCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantP2pNetworkCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantP2pNetworkCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantP2pNetworkCallback - -$(GEN): $(LOCAL_PATH)/ISupplicantP2pNetworkCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantStaIface.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantStaIface.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantStaIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantIface.hal -$(GEN): $(LOCAL_PATH)/ISupplicantIface.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantStaIfaceCallback.hal -$(GEN): $(LOCAL_PATH)/ISupplicantStaIfaceCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantStaIface - -$(GEN): $(LOCAL_PATH)/ISupplicantStaIface.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantStaIfaceCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantStaIfaceCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantStaIfaceCallback - -$(GEN): $(LOCAL_PATH)/ISupplicantStaIfaceCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantStaNetwork.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantStaNetwork.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantNetwork.hal -$(GEN): $(LOCAL_PATH)/ISupplicantNetwork.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/ISupplicantStaNetworkCallback.hal -$(GEN): $(LOCAL_PATH)/ISupplicantStaNetworkCallback.hal -$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal -$(GEN): $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantStaNetwork - -$(GEN): $(LOCAL_PATH)/ISupplicantStaNetwork.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build ISupplicantStaNetworkCallback.hal -# -GEN := $(intermediates)/android/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISupplicantStaNetworkCallback.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.wifi.supplicant@1.0::ISupplicantStaNetworkCallback - -$(GEN): $(LOCAL_PATH)/ISupplicantStaNetworkCallback.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - include $(call all-makefiles-under,$(LOCAL_PATH)) From a5a663c6e5b88a6c1789394a2790e91fce1020f7 Mon Sep 17 00:00:00 2001 From: Miao Wang Date: Wed, 2 Aug 2017 20:21:06 -0700 Subject: [PATCH 137/265] Remove the data type from the OperationType enum. - Now the driver needs to report a list of tuple {OperationType, OperandType} for capabilities. - Any time Operation information is passed across HIDL, it should be passed as the tuple {OperationType, OperandType} Bug: 63905942 Test: mm Change-Id: I909b5acf4936f65c242ee0925d3a1ac665f46131 --- neuralnetworks/1.0/types.hal | 81 ++++++++++--------- .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 14 ++-- 2 files changed, 52 insertions(+), 43 deletions(-) diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index ccc17f144e..0adebb85d0 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -32,7 +32,7 @@ enum OperandType : uint32_t { UINT32 = 7, TENSOR_FLOAT16 = 8, TENSOR_FLOAT32 = 9, - TENSOR_SYMMETRICAL_QUANT8 = 10, + TENSOR_QUANT8_ASYMM = 10, }; // The type of operations. Unlike the operation types found in @@ -41,39 +41,39 @@ enum OperandType : uint32_t { // TODO: Currently they are the same. Add a conversion when finalizing the model. // When modifying, be sure to update HAL_NUM_OPERATION_TYPES in HalIntefaces.h. enum OperationType : uint32_t { - AVERAGE_POOL_FLOAT32 = 0, - CONCATENATION_FLOAT32 = 1, - CONV_FLOAT32 = 2, - DEPTHWISE_CONV_FLOAT32 = 3, - MAX_POOL_FLOAT32 = 4, - L2_POOL_FLOAT32 = 5, - DEPTH_TO_SPACE_FLOAT32 = 6, - SPACE_TO_DEPTH_FLOAT32 = 7, - LOCAL_RESPONSE_NORMALIZATION_FLOAT32 = 8, - SOFTMAX_FLOAT32 = 9, - RESHAPE_FLOAT32 = 10, - SPLIT_FLOAT32 = 11, - FAKE_QUANT_FLOAT32 = 12, - ADD_FLOAT32 = 13, - FULLY_CONNECTED_FLOAT32 = 14, - CAST_FLOAT32 = 15, - MUL_FLOAT32 = 16, - L2_NORMALIZATION_FLOAT32 = 17, - LOGISTIC_FLOAT32 = 18, - RELU_FLOAT32 = 19, - RELU6_FLOAT32 = 20, - RELU1_FLOAT32 = 21, - TANH_FLOAT32 = 22, - DEQUANTIZE_FLOAT32 = 23, - FLOOR_FLOAT32 = 24, - GATHER_FLOAT32 = 25, - RESIZE_BILINEAR_FLOAT32 = 26, - LSH_PROJECTION_FLOAT32 = 27, - LSTM_FLOAT32 = 28, - SVDF_FLOAT32 = 29, - RNN_FLOAT32 = 30, - N_GRAM_FLOAT32 = 31, - LOOKUP_FLOAT32 = 32, + AVERAGE_POOL = 0, + CONCATENATION = 1, + CONV = 2, + DEPTHWISE_CONV = 3, + MAX_POOL = 4, + L2_POOL = 5, + DEPTH_TO_SPACE = 6, + SPACE_TO_DEPTH = 7, + LOCAL_RESPONSE_NORMALIZATION = 8, + SOFTMAX = 9, + RESHAPE = 10, + SPLIT = 11, + FAKE_QUANT = 12, + ADD = 13, + FULLY_CONNECTED = 14, + CAST = 15, + MUL = 16, + L2_NORMALIZATION = 17, + LOGISTIC = 18, + RELU = 19, + RELU6 = 20, + RELU1 = 21, + TANH = 22, + DEQUANTIZE = 23, + FLOOR = 24, + GATHER = 25, + RESIZE_BILINEAR = 26, + LSH_PROJECTION = 27, + LSTM = 28, + SVDF = 29, + RNN = 30, + N_GRAM = 31, + LOOKUP = 32, }; // Two special values that can be used instead of a regular poolIndex. @@ -102,9 +102,16 @@ struct PerformanceInfo { float powerUsage; // in picoJoules }; +struct OperationTuple { + // The type of operation. + OperationType operationType; + // The input data type of operation. + OperandType operandType; +}; + // The capabilities of a driver. struct Capabilities { - vec supportedOperationTypes; + vec supportedOperationTuples; // TODO Do the same for baseline model IDs bool cachesCompilation; // TODO revisit the data types and scales. @@ -142,8 +149,8 @@ struct Operand { // Describes one operation of the graph. struct Operation { - // The type of operation. - OperationType type; + // The tuple describing the operation type and input type. + OperationTuple opTuple; // Describes the table that contains the indexes of the inputs of the // operation. The offset is the index in the operandIndexes table. vec inputs; diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp index 9fa694dfde..5e6b1bd63f 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -66,8 +66,8 @@ TEST_F(NeuralnetworksHidlTest, StatusTest) { // initialization TEST_F(NeuralnetworksHidlTest, InitializeTest) { Return ret = device->initialize([](const Capabilities& capabilities) { - EXPECT_NE(nullptr, capabilities.supportedOperationTypes.data()); - EXPECT_NE(0ull, capabilities.supportedOperationTypes.size()); + EXPECT_NE(nullptr, capabilities.supportedOperationTuples.data()); + EXPECT_NE(0ull, capabilities.supportedOperationTuples.size()); EXPECT_EQ(0u, static_cast(capabilities.cachesCompilation) & ~0x1); EXPECT_LT(0.0f, capabilities.bootupTime); EXPECT_LT(0.0f, capabilities.float16Performance.execTime); @@ -92,7 +92,7 @@ Model createTestModel() { const std::vector operands = { { - .type = OperandType::FLOAT32, + .type = OperandType::TENSOR_FLOAT32, .dimensions = {1, 2, 2, 1}, .numberOfConsumers = 1, .scale = 0.0f, @@ -102,7 +102,7 @@ Model createTestModel() { .length = 0}, }, { - .type = OperandType::FLOAT32, + .type = OperandType::TENSOR_FLOAT32, .dimensions = {1, 2, 2, 1}, .numberOfConsumers = 1, .scale = 0.0f, @@ -112,7 +112,7 @@ Model createTestModel() { .length = size}, }, { - .type = OperandType::FLOAT32, + .type = OperandType::TENSOR_FLOAT32, .dimensions = {1, 2, 2, 1}, .numberOfConsumers = 0, .scale = 0.0f, @@ -124,7 +124,9 @@ Model createTestModel() { }; const std::vector operations = {{ - .type = OperationType::ADD_FLOAT32, .inputs = {operand1, operand2}, .outputs = {operand3}, + .opTuple = {OperationType::ADD, OperandType::TENSOR_FLOAT32}, + .inputs = {operand1, operand2}, + .outputs = {operand3}, }}; const std::vector inputIndexes = {operand1}; From 36591cb5f57761b500127aad93a9477585d180fb Mon Sep 17 00:00:00 2001 From: Etan Cohen Date: Mon, 14 Aug 2017 12:10:42 -0700 Subject: [PATCH 138/265] [AWARE] Fix maxNdpSessions documentation Clarify meaning of maxNdpSessions capability. Total, not per interface. Bug: 64685830 Test: builds Change-Id: I24fc0a97172a4ca161f432b6c5c1dc55a44dfb12 --- current.txt | 1 + wifi/1.0/types.hal | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/current.txt b/current.txt index bb5f2ac2b1..f8cdc930b3 100644 --- a/current.txt +++ b/current.txt @@ -195,6 +195,7 @@ dc7e6d4f537b9943e27edc4f86c5a03bb643b18f18f866f8c3c71c0ac4ea8cbc android.hardwar e822cb7f4a1bdd45689c5e92ccd19a2201c20b771bd4b2ec1ae627e324591f9d android.hardware.radio@1.0::IRadioResponse 6e69adb24d7c0b0ca3a54a38c49a5625b161b3f5d5f7d6fda0befdbbfc8e9e06 android.hardware.radio@1.0::IRadioResponse 28e929b453df3d9f5060af2764e6cdb123ddb893e3e86923c877f6ff7e5f02c9 android.hardware.wifi@1.0::types +df1d7b27e644bfed0a4f606a8c44d35d45cafce82c7c648494c8a25c7cd4a949 android.hardware.wifi@1.0::types # HALs released in Android O MR1 diff --git a/wifi/1.0/types.hal b/wifi/1.0/types.hal index 1b5f8f7dad..b9fb0bded9 100644 --- a/wifi/1.0/types.hal +++ b/wifi/1.0/types.hal @@ -1355,8 +1355,8 @@ struct NanCapabilities { */ uint32_t maxNdiInterfaces; /** - * Maximum number of data paths (NDP) which can be created concurrently on each individual - * data interface (NDI). + * Maximum number of data paths (NDP) which can be created concurrently on the device, across all + * data interfaces (NDI). */ uint32_t maxNdpSessions; /** From 96743b42576bb508cd0820e9503a7d82003a682b Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Wed, 9 Aug 2017 12:11:23 +0530 Subject: [PATCH 139/265] bug fix: configure input port buffer size In video decoders, size of a single input frame (elementary-stream) is dependent on width, height, color format, profile settings, ... Most of this information is part of sps, pps and requires parsing. But as the max size of the stream is known ahead, use it to configure the input buffer size requirements Bug: 63875287 Bug: 63796949 Change-Id: Ib760c4f55b094260a0abd120f852dcf1899df4e0 --- .../common/media_hidl_test_common.cpp | 19 +++++++++++ .../common/media_hidl_test_common.h | 6 ++++ .../VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 34 ++++++++++++++++--- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp index 863731aa2a..b7d53ed9b3 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp @@ -60,6 +60,25 @@ Return setRole( return setParam(omxNode, OMX_IndexParamStandardComponentRole, ¶ms); } +Return setPortBufferSize( + sp omxNode, OMX_U32 portIndex, OMX_U32 size) { + android::hardware::media::omx::V1_0::Status status; + OMX_PARAM_PORTDEFINITIONTYPE portDef; + + status = getPortParam(omxNode, OMX_IndexParamPortDefinition, portIndex, + &portDef); + if (status != ::android::hardware::media::omx::V1_0::Status::OK) + return status; + if (portDef.nBufferSize < size) { + portDef.nBufferSize = size; + status = setPortParam(omxNode, OMX_IndexParamPortDefinition, portIndex, + &portDef); + if (status != ::android::hardware::media::omx::V1_0::Status::OK) + return status; + } + return status; +} + // get/set video component port format Return setVideoPortFormat( sp omxNode, OMX_U32 portIndex, diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h index 29e6450ff6..d3ecc598c5 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h @@ -54,6 +54,9 @@ */ #define RANDOM_INDEX 1729 +#define ALIGN_POWER_OF_TWO(value, n) \ + (((value) + ((1 << (n)) - 1)) & ~((1 << (n)) - 1)) + enum bufferOwner { client, component, @@ -282,6 +285,9 @@ Return setPortConfig( Return setRole( sp omxNode, const char* role); +Return setPortBufferSize( + sp omxNode, OMX_U32 portIndex, OMX_U32 size); + Return setVideoPortFormat( sp omxNode, OMX_U32 portIndex, OMX_VIDEO_CODINGTYPE eCompressionFormat, OMX_COLOR_FORMATTYPE eColorFormat, diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index 0771719c67..72777c40d0 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -897,7 +897,7 @@ TEST_F(VideoDecHidlTest, DecodeTest) { eleInfo.open(info); ASSERT_EQ(eleInfo.is_open(), true); android::Vector Info; - int bytesCount = 0; + int bytesCount = 0, maxBytesCount = 0; uint32_t flags = 0; uint32_t timestamp = 0; timestampDevTest = true; @@ -908,9 +908,15 @@ TEST_F(VideoDecHidlTest, DecodeTest) { Info.push_back({bytesCount, flags, timestamp}); if (flags != OMX_BUFFERFLAG_CODECCONFIG) timestampUslist.push_back(timestamp); + if (maxBytesCount < bytesCount) maxBytesCount = bytesCount; } eleInfo.close(); + // As the frame sizes are known ahead, use it to configure i/p buffer size + maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10); + status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + // set port mode portMode[0] = PortMode::PRESET_BYTE_BUFFER; portMode[1] = PortMode::DYNAMIC_ANW_BUFFER; @@ -938,6 +944,8 @@ TEST_F(VideoDecHidlTest, DecodeTest) { EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); + + // disabling adaptive playback. omxNode->prepareForAdaptivePlayback(kPortIndexOutput, false, 1920, 1080); android::Vector iBuffer, oBuffer; @@ -1067,7 +1075,7 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) { eleInfo.open(info); ASSERT_EQ(eleInfo.is_open(), true); android::Vector Info; - int bytesCount = 0; + int bytesCount = 0, maxBytesCount = 0; uint32_t flags = 0; uint32_t timestamp = 0; while (1) { @@ -1075,9 +1083,15 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) { eleInfo >> flags; eleInfo >> timestamp; Info.push_back({bytesCount, flags, timestamp}); + if (maxBytesCount < bytesCount) maxBytesCount = bytesCount; } eleInfo.close(); + // As the frame sizes are known ahead, use it to configure i/p buffer size + maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10); + status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + // set port mode status = omxNode->setPortMode(kPortIndexInput, portMode[0]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); @@ -1174,7 +1188,7 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) { eleInfo.open(info); ASSERT_EQ(eleInfo.is_open(), true); android::Vector Info; - int bytesCount = 0; + int bytesCount = 0, maxBytesCount = 0; uint32_t flags = 0; uint32_t timestamp = 0; while (1) { @@ -1182,9 +1196,15 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) { eleInfo >> flags; eleInfo >> timestamp; Info.push_back({bytesCount, flags, timestamp}); + if (maxBytesCount < bytesCount) maxBytesCount = bytesCount; } eleInfo.close(); + // As the frame sizes are known ahead, use it to configure i/p buffer size + maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10); + status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + // set port mode status = omxNode->setPortMode(kPortIndexInput, portMode[0]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); @@ -1263,7 +1283,7 @@ TEST_F(VideoDecHidlTest, FlushTest) { eleInfo.open(info); ASSERT_EQ(eleInfo.is_open(), true); android::Vector Info; - int bytesCount = 0; + int bytesCount = 0, maxBytesCount = 0; uint32_t flags = 0; uint32_t timestamp = 0; while (1) { @@ -1271,9 +1291,15 @@ TEST_F(VideoDecHidlTest, FlushTest) { eleInfo >> flags; eleInfo >> timestamp; Info.push_back({bytesCount, flags, timestamp}); + if (maxBytesCount < bytesCount) maxBytesCount = bytesCount; } eleInfo.close(); + // As the frame sizes are known ahead, use it to configure i/p buffer size + maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10); + status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + // set port mode status = omxNode->setPortMode(kPortIndexInput, portMode[0]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); From 285f8b116ec6381991a4e20a4a2fa58a2176b30b Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Wed, 9 Aug 2017 14:52:20 +0530 Subject: [PATCH 140/265] bug fix: close file pointer Bug: 63796949 Change-Id: Ifd8a27d851cbc659ea8108e0879747cd9169680a --- .../functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index 72777c40d0..c75bd7c64c 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -1361,6 +1361,7 @@ TEST_F(VideoDecHidlTest, FlushTest) { kPortIndexOutput, eleStream, &Info, index, Info.size() - index, portMode[1], false); } + eleStream.close(); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); framesReceived = 0; From 0bd706936f3736881c132ffe088d5f9f09fc1d51 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Wed, 28 Jun 2017 10:59:59 +0530 Subject: [PATCH 141/265] Modify StateTransitions test During loaded <-> idle state transition, check for events is done after allocating all the buffers on a port. This is now done after allocation of every single buffer. This is done to improve scope of testing Bug: 63796949 Change-Id: Icf3405ac6716f9533d31189f6c4a4c4ac908da5f --- .../common/media_hidl_test_common.cpp | 129 +++++++++--------- .../common/media_hidl_test_common.h | 3 + .../VtsHalMediaOmxV1_0TargetComponentTest.cpp | 113 +++++++++------ 3 files changed, 141 insertions(+), 104 deletions(-) diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp index b7d53ed9b3..1ef645c6b3 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp @@ -186,6 +186,66 @@ Return setAudioPortFormat( return status; } +// allocate buffers needed on a component port +void allocateBuffer(sp omxNode, BufferInfo* buffer, OMX_U32 portIndex, + OMX_U32 nBufferSize, PortMode portMode) { + android::hardware::media::omx::V1_0::Status status; + + if (portMode == PortMode::PRESET_SECURE_BUFFER) { + buffer->owner = client; + buffer->omxBuffer.type = CodecBuffer::Type::NATIVE_HANDLE; + omxNode->allocateSecureBuffer( + portIndex, nBufferSize, + [&status, &buffer]( + android::hardware::media::omx::V1_0::Status _s, uint32_t id, + ::android::hardware::hidl_handle const& nativeHandle) { + status = _s; + buffer->id = id; + buffer->omxBuffer.nativeHandle = nativeHandle; + }); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + } else if (portMode == PortMode::PRESET_BYTE_BUFFER || + portMode == PortMode::DYNAMIC_ANW_BUFFER) { + sp allocator = IAllocator::getService("ashmem"); + EXPECT_NE(allocator.get(), nullptr); + + buffer->owner = client; + buffer->omxBuffer.type = CodecBuffer::Type::SHARED_MEM; + buffer->omxBuffer.attr.preset.rangeOffset = 0; + buffer->omxBuffer.attr.preset.rangeLength = 0; + bool success = false; + if (portMode != PortMode::PRESET_BYTE_BUFFER) { + nBufferSize = sizeof(android::VideoNativeMetadata); + } + allocator->allocate( + nBufferSize, + [&success, &buffer](bool _s, + ::android::hardware::hidl_memory const& mem) { + success = _s; + buffer->omxBuffer.sharedMemory = mem; + }); + ASSERT_EQ(success, true); + ASSERT_EQ(buffer->omxBuffer.sharedMemory.size(), nBufferSize); + buffer->mMemory = mapMemory(buffer->omxBuffer.sharedMemory); + ASSERT_NE(buffer->mMemory, nullptr); + if (portMode == PortMode::DYNAMIC_ANW_BUFFER) { + android::VideoNativeMetadata* metaData = + static_cast( + static_cast(buffer->mMemory->getPointer())); + metaData->nFenceFd = -1; + buffer->slot = -1; + } + omxNode->useBuffer( + portIndex, buffer->omxBuffer, + [&status, &buffer](android::hardware::media::omx::V1_0::Status _s, + uint32_t id) { + status = _s; + buffer->id = id; + }); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + } +} + // allocate buffers needed on a component port void allocatePortBuffers(sp omxNode, android::Vector* buffArray, @@ -199,70 +259,11 @@ void allocatePortBuffers(sp omxNode, &portDef); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); - if (portMode == PortMode::PRESET_SECURE_BUFFER) { - for (size_t i = 0; i < portDef.nBufferCountActual; i++) { - BufferInfo buffer; - buffer.owner = client; - buffer.omxBuffer.type = CodecBuffer::Type::NATIVE_HANDLE; - omxNode->allocateSecureBuffer( - portIndex, portDef.nBufferSize, - [&status, &buffer]( - android::hardware::media::omx::V1_0::Status _s, uint32_t id, - ::android::hardware::hidl_handle const& nativeHandle) { - status = _s; - buffer.id = id; - buffer.omxBuffer.nativeHandle = nativeHandle; - }); - buffArray->push(buffer); - ASSERT_EQ(status, - ::android::hardware::media::omx::V1_0::Status::OK); - } - } else if (portMode == PortMode::PRESET_BYTE_BUFFER || - portMode == PortMode::DYNAMIC_ANW_BUFFER) { - sp allocator = IAllocator::getService("ashmem"); - EXPECT_NE(allocator.get(), nullptr); - - for (size_t i = 0; i < portDef.nBufferCountActual; i++) { - BufferInfo buffer; - buffer.owner = client; - buffer.omxBuffer.type = CodecBuffer::Type::SHARED_MEM; - buffer.omxBuffer.attr.preset.rangeOffset = 0; - buffer.omxBuffer.attr.preset.rangeLength = 0; - bool success = false; - if (portMode != PortMode::PRESET_BYTE_BUFFER) { - portDef.nBufferSize = sizeof(android::VideoNativeMetadata); - } - allocator->allocate( - portDef.nBufferSize, - [&success, &buffer]( - bool _s, ::android::hardware::hidl_memory const& mem) { - success = _s; - buffer.omxBuffer.sharedMemory = mem; - }); - ASSERT_EQ(success, true); - ASSERT_EQ(buffer.omxBuffer.sharedMemory.size(), - portDef.nBufferSize); - buffer.mMemory = mapMemory(buffer.omxBuffer.sharedMemory); - ASSERT_NE(buffer.mMemory, nullptr); - if (portMode == PortMode::DYNAMIC_ANW_BUFFER) { - android::VideoNativeMetadata* metaData = - static_cast( - static_cast(buffer.mMemory->getPointer())); - metaData->nFenceFd = -1; - buffer.slot = -1; - } - omxNode->useBuffer( - portIndex, buffer.omxBuffer, - [&status, &buffer]( - android::hardware::media::omx::V1_0::Status _s, - uint32_t id) { - status = _s; - buffer.id = id; - }); - buffArray->push(buffer); - ASSERT_EQ(status, - ::android::hardware::media::omx::V1_0::Status::OK); - } + for (size_t i = 0; i < portDef.nBufferCountActual; i++) { + BufferInfo buffer; + allocateBuffer(omxNode, &buffer, portIndex, portDef.nBufferSize, + portMode); + buffArray->push(buffer); } } diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h index d3ecc598c5..94a0194db9 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h @@ -296,6 +296,9 @@ Return setVideoPortFormat( Return setAudioPortFormat( sp omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding); +void allocateBuffer(sp omxNode, BufferInfo* buffer, OMX_U32 portIndex, + OMX_U32 nBufferSize, PortMode portMode); + void allocatePortBuffers(sp omxNode, android::Vector* buffArray, OMX_U32 portIndex, diff --git a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp index 200b6cb484..0f29d91f99 100644 --- a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp +++ b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp @@ -467,9 +467,6 @@ TEST_F(ComponentHidlTest, DISABLED_PopulatePort) { portBase = params.nStartPortNumber; } - sp allocator = IAllocator::getService("ashmem"); - EXPECT_NE(allocator.get(), nullptr); - OMX_PARAM_PORTDEFINITIONTYPE portDef; status = getPortParam(omxNode, OMX_IndexParamPortDefinition, portBase, &portDef); @@ -482,30 +479,9 @@ TEST_F(ComponentHidlTest, DISABLED_PopulatePort) { for (size_t i = 0; i < portDef.nBufferCountActual; i++) { BufferInfo buffer; - buffer.owner = client; - buffer.omxBuffer.type = CodecBuffer::Type::SHARED_MEM; - buffer.omxBuffer.attr.preset.rangeOffset = 0; - buffer.omxBuffer.attr.preset.rangeLength = 0; - bool success = false; - allocator->allocate( - nBufferSize, - [&success, &buffer](bool _s, - ::android::hardware::hidl_memory const& mem) { - success = _s; - buffer.omxBuffer.sharedMemory = mem; - }); - ASSERT_EQ(success, true); - ASSERT_EQ(buffer.omxBuffer.sharedMemory.size(), nBufferSize); - - omxNode->useBuffer( - portBase, buffer.omxBuffer, - [&status, &buffer](android::hardware::media::omx::V1_0::Status _s, - uint32_t id) { - status = _s; - buffer.id = id; - }); + allocateBuffer(omxNode, &buffer, portBase, nBufferSize, + PortMode::PRESET_BYTE_BUFFER); pBuffer.push(buffer); - ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); } status = @@ -586,8 +562,8 @@ TEST_F(ComponentHidlTest, StateTransitions) { if (disableTest) return; android::hardware::media::omx::V1_0::Status status; uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; + OMX_U32 portBase = 0; Message msg; - status = setRole(omxNode, gEnv->getRole().c_str()); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); OMX_PORT_PARAM_TYPE params; @@ -598,11 +574,12 @@ TEST_F(ComponentHidlTest, StateTransitions) { } if (status == ::android::hardware::media::omx::V1_0::Status::OK) { ASSERT_EQ(params.nPorts, 2U); - kPortIndexInput = params.nStartPortNumber; - kPortIndexOutput = kPortIndexInput + 1; + portBase = params.nStartPortNumber; } + kPortIndexInput = portBase; + kPortIndexOutput = portBase + 1; - android::Vector iBuffer, oBuffer; + android::Vector pBuffer[2]; // set port mode PortMode portMode[2]; @@ -613,28 +590,84 @@ TEST_F(ComponentHidlTest, StateTransitions) { EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), + OMX_StateIdle); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + + for (size_t j = portBase; j < portBase + 2; j++) { + pBuffer[j - portBase].clear(); + + OMX_PARAM_PORTDEFINITIONTYPE def; + status = getPortParam(omxNode, OMX_IndexParamPortDefinition, j, &def); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + + for (size_t i = 0; i < def.nBufferCountActual; i++) { + // Dont switch states until the ports are populated + status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, + &pBuffer[0], &pBuffer[1]); + ASSERT_EQ(status, + android::hardware::media::omx::V1_0::Status::TIMED_OUT); + + BufferInfo buffer; + allocateBuffer(omxNode, &buffer, j, def.nBufferSize, + portMode[j - portBase]); + pBuffer[j - portBase].push(buffer); + } + } + + // As the ports are populated, check if the state transition is complete + status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0], + &pBuffer[1]); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(msg.type, Message::Type::EVENT); + ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete); + ASSERT_EQ(msg.data.eventData.data1, OMX_CommandStateSet); + ASSERT_EQ(msg.data.eventData.data2, OMX_StateIdle); + // set state to executing changeStateIdletoExecute(omxNode, observer); // dispatch buffers - for (size_t i = 0; i < oBuffer.size(); i++) { - dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1]); + for (size_t i = 0; i < pBuffer[1].size(); i++) { + dispatchOutputBuffer(omxNode, &pBuffer[1], i, portMode[1]); } // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1]); // // set state to executing // changeStateIdletoExecute(omxNode, observer); // // TODO: Sending empty input buffers is slightly tricky. // // dispatch buffers - // for (size_t i = 0; i < iBuffer.size(); i++) { - // dispatchInputBuffer(omxNode, &iBuffer, i, 0, 0, 0, portMode[0]); + // for (size_t i = 0; i < pBuffer[0].size(); i++) { + // dispatchInputBuffer(omxNode, &pBuffer[0], i, 0, 0, 0, + // portMode[0]); // } // // set state to idle - // changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + // changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1]); + // set state to loaded - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), + OMX_StateLoaded); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + + for (size_t j = portBase; j < portBase + 2; j++) { + for (size_t i = 0; i < pBuffer[j].size(); ++i) { + // Dont switch states until the ports are populated + status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, + &pBuffer[0], &pBuffer[1]); + ASSERT_EQ(status, + android::hardware::media::omx::V1_0::Status::TIMED_OUT); + + status = omxNode->freeBuffer(j, pBuffer[j][i].id); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + } + } + + status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0], + &pBuffer[1]); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(msg.type, Message::Type::EVENT); + ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete); + ASSERT_EQ(msg.data.eventData.data1, OMX_CommandStateSet); + ASSERT_EQ(msg.data.eventData.data2, OMX_StateLoaded); } // state transitions test - monkeying From d6ce8268948618d6b1511f0ae15176741f188b19 Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Tue, 15 Aug 2017 08:42:50 -0700 Subject: [PATCH 142/265] wifi(implementation): Reduce logging severity IE elements should not be present in the batched scan results, but it being there doesn't cause any problems. The IE elements will be ignored when we send it over the HIDL interface, so reduce the log level to prevent log spamming. Bug: 64448186 Test: None Change-Id: Ia0d0312a113c907bb0992bb8f41e734fe9d05114 --- wifi/1.1/default/wifi_legacy_hal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wifi/1.1/default/wifi_legacy_hal.cpp b/wifi/1.1/default/wifi_legacy_hal.cpp index 7d683d3fe9..151a6009bb 100644 --- a/wifi/1.1/default/wifi_legacy_hal.cpp +++ b/wifi/1.1/default/wifi_legacy_hal.cpp @@ -1284,7 +1284,7 @@ WifiLegacyHal::getGscanCachedResults() { for (int i = 0; i < num_scan_results; i++) { auto& scan_result = cached_scan_result.results[i]; if (scan_result.ie_length > 0) { - LOG(ERROR) << "Cached scan result has non-zero IE length " + LOG(DEBUG) << "Cached scan result has non-zero IE length " << scan_result.ie_length; scan_result.ie_length = 0; } From eb8dfd8c01f86844e3cc303fdf319a91b2da924a Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Fri, 4 Aug 2017 15:27:06 -0700 Subject: [PATCH 143/265] Audio test statically links to dependencies. This test now statically links to libs not guaranteed to be on the device. Bug: 64040096 Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --primary-abi-only --skip-preconditions --module VtsHalAudioEffectV2_0Target Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --primary-abi-only --skip-preconditions --module VtsHalAudioV2_0Target Change-Id: I331d7e4abdf7e520df6d508a8059b6358ad4398f --- audio/2.0/vts/functional/Android.bp | 29 +++++++-------------- audio/effect/2.0/vts/functional/Android.bp | 30 ++++++++-------------- 2 files changed, 19 insertions(+), 40 deletions(-) diff --git a/audio/2.0/vts/functional/Android.bp b/audio/2.0/vts/functional/Android.bp index b289709fda..f3b2ca72cd 100644 --- a/audio/2.0/vts/functional/Android.bp +++ b/audio/2.0/vts/functional/Android.bp @@ -16,29 +16,18 @@ cc_test { name: "VtsHalAudioV2_0TargetTest", - defaults: ["hidl_defaults"], - srcs: ["AudioPrimaryHidlHalTest.cpp", - "ValidateAudioConfiguration.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libhidlbase", - "libhidltransport", - "libutils", - "libcutils", - "libxml2", - "android.hardware.audio@2.0", - "android.hardware.audio.common@2.0", + defaults: ["VtsHalTargetTestDefaults"], + srcs: [ + "AudioPrimaryHidlHalTest.cpp", + "ValidateAudioConfiguration.cpp" ], static_libs: [ - "VtsHalHidlTargetTestBase", "android.hardware.audio.common.test.utility", + "android.hardware.audio@2.0", + "android.hardware.audio.common@2.0", + "libxml2", ], - cflags: [ - "-O0", - "-g", - "-Wall", - "-Wextra", - "-Werror", + shared_libs: [ + "libicuuc", ], } diff --git a/audio/effect/2.0/vts/functional/Android.bp b/audio/effect/2.0/vts/functional/Android.bp index 15f1e645c7..7b421cb7e7 100644 --- a/audio/effect/2.0/vts/functional/Android.bp +++ b/audio/effect/2.0/vts/functional/Android.bp @@ -16,30 +16,20 @@ cc_test { name: "VtsHalAudioEffectV2_0TargetTest", - defaults: ["hidl_defaults"], - srcs: ["VtsHalAudioEffectV2_0TargetTest.cpp", - "ValidateAudioEffectsConfiguration.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libnativehelper", - "libutils", - "libxml2", + defaults: ["VtsHalTargetTestDefaults"], + srcs: [ + "VtsHalAudioEffectV2_0TargetTest.cpp", + "ValidateAudioEffectsConfiguration.cpp" + ], + static_libs: [ + "android.hardware.audio.common.test.utility", "android.hardware.audio.common@2.0", "android.hardware.audio.effect@2.0", "android.hidl.allocator@1.0", "android.hidl.memory@1.0", + "libxml2", ], - static_libs: [ - "VtsHalHidlTargetTestBase", - "android.hardware.audio.common.test.utility", - ], - cflags: [ - "-O0", - "-g", - "-Wextra", + shared_libs: [ + "libicuuc", ], } From e2ecbe00f0951baaaaa965540b1ecd44ae28bb1d Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Fri, 11 Aug 2017 10:33:22 +0100 Subject: [PATCH 144/265] Camera: Switch 'cancelPictureFail' to 'cancelPictureNOP' Calls to 'cancelPicture' should be no-ops in case image capture is not active. Bug: 64569316 Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --skip-preconditions --primary-abi-only --module VtsHalCameraProviderV2_4Target -l INFO Change-Id: I5fad0a5b7aafd208c3a1b2f62a2b9046cde858d1 --- .../vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index 8ff9847d77..e6cd3b4508 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -1417,8 +1417,8 @@ TEST_F(CameraHidlTest, cancelPicture) { } } -// Image capture cancel should fail when image capture is not running. -TEST_F(CameraHidlTest, cancelPictureFail) { +// Image capture cancel is a no-op when image capture is not running. +TEST_F(CameraHidlTest, cancelPictureNOP) { hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); for (const auto& name : cameraDeviceNames) { @@ -1433,7 +1433,7 @@ TEST_F(CameraHidlTest, cancelPictureFail) { Return returnStatus = device1->cancelPicture(); ASSERT_TRUE(returnStatus.isOk()); - ASSERT_NE(Status::OK, returnStatus); + ASSERT_EQ(Status::OK, returnStatus); stopPreviewAndClose(device1); } From a7ef697a0a520015f961012d53d852a8cece20df Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Wed, 16 Aug 2017 23:30:42 +0900 Subject: [PATCH 145/265] Load libRS_internal.so from the rs namespace Bug: 64747884 Test: VtsHalRenderscriptV1_0TargetTest successful on the device built with BOARD_VNDK_VERSION=current and [system] namespace config is applied to /data/nativetest[64]/* processes. Change-Id: I9e967c80ac2dba718cd47e1f378bcbf18abe9ad2 --- renderscript/1.0/default/Device.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/renderscript/1.0/default/Device.cpp b/renderscript/1.0/default/Device.cpp index 3aae060975..4831a8b987 100644 --- a/renderscript/1.0/default/Device.cpp +++ b/renderscript/1.0/default/Device.cpp @@ -1,6 +1,9 @@ #include "Context.h" #include "Device.h" +#include +#include + namespace android { namespace hardware { namespace renderscript { @@ -39,7 +42,25 @@ dispatchTable loadHAL() { static_assert(sizeof(size_t) <= sizeof(uint64_t), "RenderScript HIDL Error: sizeof(size_t) > sizeof(uint64_t)"); const char* filename = "libRS_internal.so"; - void* handle = dlopen(filename, RTLD_LAZY | RTLD_LOCAL); + // Try to load libRS_internal.so from the "rs" namespace directly. + typedef struct android_namespace_t* (*GetExportedNamespaceFnPtr)(const char*); + GetExportedNamespaceFnPtr getExportedNamespace = + (GetExportedNamespaceFnPtr)dlsym(RTLD_DEFAULT, "android_get_exported_namespace"); + void* handle = nullptr; + if (getExportedNamespace != nullptr) { + android_namespace_t* rs_namespace = getExportedNamespace("rs"); + if (rs_namespace != nullptr) { + const android_dlextinfo dlextinfo = { + .flags = ANDROID_DLEXT_USE_NAMESPACE, .library_namespace = rs_namespace, + }; + handle = android_dlopen_ext(filename, RTLD_LAZY | RTLD_LOCAL, &dlextinfo); + } + } + if (handle == nullptr) { + // if there is no "rs" namespace (in case when this HAL impl is loaded + // into a vendor process), then use the plain dlopen. + handle = dlopen(filename, RTLD_LAZY | RTLD_LOCAL); + } dispatchTable dispatchHal = { .SetNativeLibDir = (SetNativeLibDirFnPtr) nullptr, From 1441864f4c22ec7ae3fc8dd0e7bd525c45b52f13 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Tue, 4 Jul 2017 19:21:19 +0530 Subject: [PATCH 146/265] bug fix: output colorformat configuration fixed The eColorFormat field in OMX_PARAM_PORTDEFINITIONTYPE structure has no effect on the component. This has to be configured from OMX_VIDEO_PARAM_PORTFORMATTYPE. This is corrected. This color format information is passed to graphic buffer during its allocation Bug: 63796949 Merged-In: I51b1e59631647d1291ecfac373781ac5e5a0ffd5 Change-Id: I51b1e59631647d1291ecfac373781ac5e5a0ffd5 --- .../omx/1.0/vts/functional/common/Android.bp | 0 .../common/media_hidl_test_common.cpp | 0 .../VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 224 ++++++++++++++---- 3 files changed, 179 insertions(+), 45 deletions(-) mode change 100755 => 100644 media/omx/1.0/vts/functional/common/Android.bp mode change 100755 => 100644 media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp diff --git a/media/omx/1.0/vts/functional/common/Android.bp b/media/omx/1.0/vts/functional/common/Android.bp old mode 100755 new mode 100644 diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp old mode 100755 new mode 100644 diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index deb70bd1da..c17ed20428 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -27,6 +27,7 @@ #include #include #include +#include using ::android::hardware::graphics::common::V1_0::BufferUsage; using ::android::hardware::graphics::common::V1_0::PixelFormat; @@ -47,6 +48,7 @@ using ::android::sp; #include #include +#include #include #include #include @@ -399,7 +401,7 @@ void GetURLForComponent(VideoDecHidlTest::standardComp comp, char* mURL, void allocateGraphicBuffers(sp omxNode, OMX_U32 portIndex, android::Vector* buffArray, uint32_t nFrameWidth, uint32_t nFrameHeight, - int32_t* nStride, uint32_t count) { + int32_t* nStride, int format, uint32_t count) { android::hardware::media::omx::V1_0::Status status; sp allocator = android::hardware::graphics::allocator::V2_0::IAllocator::getService(); @@ -416,7 +418,7 @@ void allocateGraphicBuffers(sp omxNode, OMX_U32 portIndex, descriptorInfo.width = nFrameWidth; descriptorInfo.height = nFrameHeight; descriptorInfo.layerCount = 1; - descriptorInfo.format = PixelFormat::RGBA_8888; + descriptorInfo.format = static_cast(format); descriptorInfo.usage = static_cast(BufferUsage::CPU_READ_OFTEN); omxNode->getGraphicBufferUsage( portIndex, @@ -441,6 +443,9 @@ void allocateGraphicBuffers(sp omxNode, OMX_U32 portIndex, EXPECT_EQ(error, android::hardware::graphics::mapper::V2_0::Error::NONE); EXPECT_EQ(buffArray->size(), count); + + static volatile int32_t nextId = 0; + uint64_t id = static_cast(getpid()) << 32; allocator->allocate( descriptor, count, [&](android::hardware::graphics::mapper::V2_0::Error _s, uint32_t _n1, @@ -464,7 +469,7 @@ void allocateGraphicBuffers(sp omxNode, OMX_U32 portIndex, buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.layerCount = descriptorInfo.layerCount; buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.id = - (*buffArray)[i].id; + id | static_cast(android_atomic_inc(&nextId)); } }); } @@ -510,12 +515,15 @@ void portReconfiguration(sp omxNode, sp observer, // set Port Params uint32_t nFrameWidth, nFrameHeight, xFramerate; - OMX_COLOR_FORMATTYPE eColorFormat = - OMX_COLOR_FormatYUV420Planar; getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, &xFramerate); + // get configured color format + OMX_PARAM_PORTDEFINITIONTYPE portDef; + status = getPortParam(omxNode, OMX_IndexParamPortDefinition, + kPortIndexOutput, &portDef); setDefaultPortParam(omxNode, kPortIndexOutput, - OMX_VIDEO_CodingUnused, eColorFormat, + OMX_VIDEO_CodingUnused, + portDef.format.video.eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); // If you can disable a port, then you should be able to @@ -547,6 +555,7 @@ void portReconfiguration(sp omxNode, sp observer, portDef.format.video.nFrameWidth, portDef.format.video.nFrameHeight, &portDef.format.video.nStride, + portDef.format.video.eColorFormat, portDef.nBufferCountActual); } status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, @@ -707,6 +716,116 @@ void decodeNFrames(sp omxNode, sp observer, } } +// DescribeColorFormatParams Copy Constructor (Borrowed from OMXUtils.cpp) +android::DescribeColorFormatParams::DescribeColorFormatParams( + const android::DescribeColorFormat2Params& params) { + eColorFormat = params.eColorFormat; + nFrameWidth = params.nFrameWidth; + nFrameHeight = params.nFrameHeight; + nStride = params.nStride; + nSliceHeight = params.nSliceHeight; + bUsingNativeBuffers = params.bUsingNativeBuffers; +}; + +bool isColorFormatFlexibleYUV(sp omxNode, + OMX_COLOR_FORMATTYPE eColorFormat) { + android::hardware::media::omx::V1_0::Status status; + unsigned int index = OMX_IndexMax, index2 = OMX_IndexMax; + omxNode->getExtensionIndex( + "OMX.google.android.index.describeColorFormat", + [&index](android::hardware::media::omx::V1_0::Status _s, + unsigned int _nl) { + if (_s == ::android::hardware::media::omx::V1_0::Status::OK) + index = _nl; + }); + omxNode->getExtensionIndex( + "OMX.google.android.index.describeColorFormat2", + [&index2](android::hardware::media::omx::V1_0::Status _s, + unsigned int _nl) { + if (_s == ::android::hardware::media::omx::V1_0::Status::OK) + index2 = _nl; + }); + + android::DescribeColorFormat2Params describeParams; + describeParams.eColorFormat = eColorFormat; + describeParams.nFrameWidth = 128; + describeParams.nFrameHeight = 128; + describeParams.nStride = 128; + describeParams.nSliceHeight = 128; + describeParams.bUsingNativeBuffers = OMX_FALSE; + if (index != OMX_IndexMax) { + android::DescribeColorFormatParams describeParamsV1(describeParams); + status = getParam(omxNode, static_cast(index), + &describeParamsV1); + if (status == ::android::hardware::media::omx::V1_0::Status::OK) { + android::MediaImage& img = describeParamsV1.sMediaImage; + if (img.mType == android::MediaImage::MEDIA_IMAGE_TYPE_YUV) { + if (img.mNumPlanes == 3 && + img.mPlane[img.Y].mHorizSubsampling == 1 && + img.mPlane[img.Y].mVertSubsampling == 1) { + if (img.mPlane[img.U].mHorizSubsampling == 2 && + img.mPlane[img.U].mVertSubsampling == 2 && + img.mPlane[img.V].mHorizSubsampling == 2 && + img.mPlane[img.V].mVertSubsampling == 2) { + if (img.mBitDepth <= 8) { + return true; + } + } + } + } + } + } else if (index2 != OMX_IndexMax) { + status = getParam(omxNode, static_cast(index2), + &describeParams); + android::MediaImage2& img = describeParams.sMediaImage; + if (img.mType == android::MediaImage2::MEDIA_IMAGE_TYPE_YUV) { + if (img.mNumPlanes == 3 && + img.mPlane[img.Y].mHorizSubsampling == 1 && + img.mPlane[img.Y].mVertSubsampling == 1) { + if (img.mPlane[img.U].mHorizSubsampling == 2 && + img.mPlane[img.U].mVertSubsampling == 2 && + img.mPlane[img.V].mHorizSubsampling == 2 && + img.mPlane[img.V].mVertSubsampling == 2) { + if (img.mBitDepth <= 8) { + return true; + } + } + } + } + } + return false; +} + +// get default color format for output port +void getDefaultColorFormat(sp omxNode, OMX_U32 kPortIndexOutput, + PortMode oPortMode, + OMX_COLOR_FORMATTYPE* eColorFormat) { + android::hardware::media::omx::V1_0::Status status; + OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; + *eColorFormat = OMX_COLOR_FormatUnused; + portFormat.nIndex = 0; + while (1) { + status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, + kPortIndexOutput, &portFormat); + if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; + EXPECT_EQ(portFormat.eCompressionFormat, OMX_VIDEO_CodingUnused); + if (oPortMode != PortMode::PRESET_BYTE_BUFFER) { + *eColorFormat = portFormat.eColorFormat; + break; + } + if (isColorFormatFlexibleYUV(omxNode, portFormat.eColorFormat)) { + *eColorFormat = portFormat.eColorFormat; + break; + } + if (OMX_COLOR_FormatYUV420SemiPlanar == portFormat.eColorFormat || + OMX_COLOR_FormatYUV420Planar == portFormat.eColorFormat) { + *eColorFormat = portFormat.eColorFormat; + break; + } + portFormat.nIndex++; + } +} + // set component role TEST_F(VideoDecHidlTest, SetRole) { description("Test Set Component Role"); @@ -802,9 +921,17 @@ TEST_F(VideoDecHidlTest, DecodeTest) { // set Port Params uint32_t nFrameWidth, nFrameHeight, xFramerate; - OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, &xFramerate); + // get default color format + OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; + getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], + &eColorFormat); + ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); + status = + setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, xFramerate); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); @@ -828,7 +955,8 @@ TEST_F(VideoDecHidlTest, DecodeTest) { allocateGraphicBuffers( omxNode, kPortIndexOutput, &oBuffer, portDef.format.video.nFrameWidth, portDef.format.video.nFrameHeight, - &portDef.format.video.nStride, portDef.nBufferCountActual); + &portDef.format.video.nStride, portDef.format.video.eColorFormat, + portDef.nBufferCountActual); } // Port Reconfiguration @@ -866,22 +994,28 @@ TEST_F(VideoDecHidlTest, EOSTest_M) { kPortIndexOutput = kPortIndexInput + 1; } - // set Port Params - uint32_t nFrameWidth, nFrameHeight, xFramerate; - OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; - getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, - &xFramerate); - setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, - eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); - // set port mode - PortMode portMode[2]; - portMode[0] = portMode[1] = PortMode::PRESET_BYTE_BUFFER; status = omxNode->setPortMode(kPortIndexInput, portMode[0]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + // set Port Params + uint32_t nFrameWidth, nFrameHeight, xFramerate; + getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, + &xFramerate); + // get default color format + OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; + getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], + &eColorFormat); + ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); + status = + setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, xFramerate); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); + android::Vector iBuffer, oBuffer; // set state to idle @@ -956,20 +1090,20 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) { // set Port Params uint32_t nFrameWidth, nFrameHeight, xFramerate; - OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, &xFramerate); + // get default color format + OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; + getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], + &eColorFormat); + ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); + status = + setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, xFramerate); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); - // set port mode - PortMode portMode[2]; - portMode[0] = portMode[1] = PortMode::PRESET_BYTE_BUFFER; - status = omxNode->setPortMode(kPortIndexInput, portMode[0]); - ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); - status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); - android::Vector iBuffer, oBuffer; // set state to idle @@ -1069,20 +1203,20 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) { // set Port Params uint32_t nFrameWidth, nFrameHeight, xFramerate; - OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, &xFramerate); + // get default color format + OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; + getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], + &eColorFormat); + ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); + status = + setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, xFramerate); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); - // set port mode - PortMode portMode[2]; - portMode[0] = portMode[1] = PortMode::PRESET_BYTE_BUFFER; - status = omxNode->setPortMode(kPortIndexInput, portMode[0]); - ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); - status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); - android::Vector iBuffer, oBuffer; // set state to idle @@ -1164,20 +1298,20 @@ TEST_F(VideoDecHidlTest, FlushTest) { // set Port Params uint32_t nFrameWidth, nFrameHeight, xFramerate; - OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, &xFramerate); + // get default color format + OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; + getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], + &eColorFormat); + ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); + status = + setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, xFramerate); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); - // set port mode - PortMode portMode[2]; - portMode[0] = portMode[1] = PortMode::PRESET_BYTE_BUFFER; - status = omxNode->setPortMode(kPortIndexInput, portMode[0]); - ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); - status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); - android::Vector iBuffer, oBuffer; // set state to idle From d4ffeb71bca34ef8f793a04361649998e8016408 Mon Sep 17 00:00:00 2001 From: Pavel Maltsev Date: Wed, 16 Aug 2017 16:43:44 -0700 Subject: [PATCH 147/265] Increase thread pool for VHAL 2.1 Fixes: 36510399 Test: runtest -x packages/services/Car/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/E2ePerformanceTest.java Change-Id: Id5638f63c6ff23bb78675fa07a2f3922bb7e3d73 --- automotive/vehicle/2.1/default/service.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automotive/vehicle/2.1/default/service.cpp b/automotive/vehicle/2.1/default/service.cpp index bae64fde9f..03a0a5df16 100644 --- a/automotive/vehicle/2.1/default/service.cpp +++ b/automotive/vehicle/2.1/default/service.cpp @@ -88,7 +88,7 @@ int main(int /* argc */, char* /* argv */ []) { Vehicle_V2_1 vehicle21(vehicleManager.get()); - configureRpcThreadpool(1, true /* callerWillJoin */); + configureRpcThreadpool(4, true /* callerWillJoin */); ALOGI("Registering as service..."); status_t status = vehicle21.registerAsService(); From e637aa32b86dec4778ac8dd934266bb3755bc773 Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Fri, 18 Aug 2017 10:00:44 -0700 Subject: [PATCH 148/265] biometrics: fingerprint: add locking to default impl There exists the following race condition: a). thread A receives setNotify and sets the callback to some object b). thread B of the wrapped implementation calls BiometricsFingerprint::notify which it was given a handle to. Thread B executes past the nullptr check: c). thread A receives setNotify and sets the callback to some other object (or nullptr) d). thread B resumes in notify with unknown state Add mutex to protect access to mClientCallback. Change-Id: I9163204ff5802e9246056caeb2a7857e6138531c Fixes: 64802340 Test: VtsHalBiometricsFingerprintV2_1IfaceFuzzer --- biometrics/fingerprint/2.1/default/BiometricsFingerprint.cpp | 2 ++ biometrics/fingerprint/2.1/default/BiometricsFingerprint.h | 1 + 2 files changed, 3 insertions(+) diff --git a/biometrics/fingerprint/2.1/default/BiometricsFingerprint.cpp b/biometrics/fingerprint/2.1/default/BiometricsFingerprint.cpp index c6774ca222..f68795955a 100644 --- a/biometrics/fingerprint/2.1/default/BiometricsFingerprint.cpp +++ b/biometrics/fingerprint/2.1/default/BiometricsFingerprint.cpp @@ -145,6 +145,7 @@ FingerprintAcquiredInfo BiometricsFingerprint::VendorAcquiredFilter( Return BiometricsFingerprint::setNotify( const sp& clientCallback) { + std::lock_guard lock(mClientCallbackMutex); mClientCallback = clientCallback; // This is here because HAL 2.1 doesn't have a way to propagate a // unique token for its driver. Subsequent versions should send a unique @@ -259,6 +260,7 @@ fingerprint_device_t* BiometricsFingerprint::openHal() { void BiometricsFingerprint::notify(const fingerprint_msg_t *msg) { BiometricsFingerprint* thisPtr = static_cast( BiometricsFingerprint::getInstance()); + std::lock_guard lock(thisPtr->mClientCallbackMutex); if (thisPtr == nullptr || thisPtr->mClientCallback == nullptr) { ALOGE("Receiving callbacks before the client callback is registered."); return; diff --git a/biometrics/fingerprint/2.1/default/BiometricsFingerprint.h b/biometrics/fingerprint/2.1/default/BiometricsFingerprint.h index 5923c849c8..6d64e3d38d 100644 --- a/biometrics/fingerprint/2.1/default/BiometricsFingerprint.h +++ b/biometrics/fingerprint/2.1/default/BiometricsFingerprint.h @@ -69,6 +69,7 @@ private: static FingerprintAcquiredInfo VendorAcquiredFilter(int32_t error, int32_t* vendorCode); static BiometricsFingerprint* sInstance; + std::mutex mClientCallbackMutex; sp mClientCallback; fingerprint_device_t *mDevice; }; From f75f596289ad519cad6934a5592f89c59db2d2d6 Mon Sep 17 00:00:00 2001 From: Peng Xu Date: Fri, 18 Aug 2017 17:50:57 -0700 Subject: [PATCH 149/265] Sensor VTS testBatchingOperation flakiness fix Bug: 64732324 Bug: 63529148 Test: testBatchingOperation passes consistently Change-Id: Id4e8075e249f3658f5683d53d6dc8403ee32bc4a --- .../functional/VtsHalSensorsV1_0TargetTest.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sensors/1.0/vts/functional/VtsHalSensorsV1_0TargetTest.cpp b/sensors/1.0/vts/functional/VtsHalSensorsV1_0TargetTest.cpp index 2cf4ef9cd4..388c77c9d5 100644 --- a/sensors/1.0/vts/functional/VtsHalSensorsV1_0TargetTest.cpp +++ b/sensors/1.0/vts/functional/VtsHalSensorsV1_0TargetTest.cpp @@ -1180,16 +1180,17 @@ void SensorsHidlTest::testBatchingOperation(SensorType type) { usleep(batchingPeriodInNs / 1000 * 8 / 10); SensorsHidlEnvironment::Instance()->setCollection(true); - // 0.8 + 0.3 times the batching period - // plus some time for the event to deliver - events = collectEvents( - batchingPeriodInNs / 1000 * 3 / 10, - minFifoCount, true /*clearBeforeStart*/, false /*change collection*/); + // clean existing collections + collectEvents(0 /*timeLimitUs*/, 0/*nEventLimit*/, + true /*clearBeforeStart*/, false /*change collection*/); + // 0.8 + 0.2 times the batching period + usleep(batchingPeriodInNs / 1000 * 8 / 10); ASSERT_EQ(flush(handle), Result::OK); + // plus some time for the event to deliver events = collectEvents(allowedBatchDeliverTimeNs / 1000, - minFifoCount, true /*clearBeforeStart*/, false /*change collection*/); + minFifoCount, false /*clearBeforeStart*/, false /*change collection*/); SensorsHidlEnvironment::Instance()->setCollection(false); ASSERT_EQ(activate(handle, 0), Result::OK); @@ -1202,7 +1203,7 @@ void SensorsHidlTest::testBatchingOperation(SensorType type) { } // at least reach 90% of advertised capacity - ASSERT_GT(nEvent, (size_t)(batchingPeriodInNs / minSamplingPeriodInNs * 9 / 10)); + ASSERT_GT(nEvent, (size_t)(minFifoCount * 9 / 10)); } // Test if sensor hal can do accelerometer batching properly From 7d2358011752847a691736abe94bfaab29188d78 Mon Sep 17 00:00:00 2001 From: Yang Ni Date: Mon, 21 Aug 2017 09:21:24 -0700 Subject: [PATCH 150/265] Replace LOOKUP with EMBEDDING and HASHTABLE_LOOKUP Bug: 63905942 Test: adb shell /data/nativetest64/embedding_lookup_test/embedding_lookup_test Change-Id: Ic9ac31f60ac8a6e2c59700a34909004f4b5dc9ff --- neuralnetworks/1.0/types.hal | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index 0adebb85d0..4bd6a08634 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -73,7 +73,8 @@ enum OperationType : uint32_t { SVDF = 29, RNN = 30, N_GRAM = 31, - LOOKUP = 32, + EMBEDDING_LOOKUP = 32, + HASHTABLE_LOOKUP = 33, }; // Two special values that can be used instead of a regular poolIndex. From 78e8902160ac3ef9af229793aa8966b2ff6d4c95 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Thu, 3 Aug 2017 17:29:21 -0700 Subject: [PATCH 151/265] Drm test static links to HAL def libs. Bug: 64040096 Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --skip-preconditions --module VtsHalDrmV1_0Target Change-Id: If23f1fda06e9188b84fc94ada0e22ca7e5b45aa9 --- drm/1.0/vts/functional/Android.bp | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/drm/1.0/vts/functional/Android.bp b/drm/1.0/vts/functional/Android.bp index b45ce848df..57678fb46c 100644 --- a/drm/1.0/vts/functional/Android.bp +++ b/drm/1.0/vts/functional/Android.bp @@ -16,33 +16,20 @@ cc_test { name: "VtsHalDrmV1_0TargetTest", + defaults: ["VtsHalTargetTestDefaults"], srcs: [ "drm_hal_clearkey_test.cpp", "drm_hal_vendor_test.cpp", "vendor_modules.cpp" - ], - shared_libs: [ + ], + static_libs: [ "android.hardware.drm@1.0", + "android.hardware.drm@1.0-helper", "android.hidl.allocator@1.0", "android.hidl.memory@1.0", - "libbase", - "libcutils", - "libhidlbase", "libhidlmemory", - "libhidltransport", - "libhwbinder", - "liblog", "libnativehelper", "libssl", "libcrypto", - "libutils", - ], - static_libs: [ - "VtsHalHidlTargetTestBase", - "android.hardware.drm@1.0-helper", - ], - cflags: [ - "-O0", - "-g", ], } From a2d49d10076d12844db30be949682e954df1d7a7 Mon Sep 17 00:00:00 2001 From: Brian Duddie Date: Fri, 18 Aug 2017 17:57:00 -0700 Subject: [PATCH 152/265] contexthub: Pass target API version in new fields Update default implementation to use the new fields defined explicitly for passing in target CHRE API version information, rather than adding this data into the reserved area. Bug: 64852297 Test: run CHQTS on Nanohub, rebuild test app targeting 1.2 and confirm it's interpreted correctly Change-Id: Id11f9b510a2d239d285436e119b7b8dbece4c5df --- contexthub/1.0/default/Contexthub.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/contexthub/1.0/default/Contexthub.cpp b/contexthub/1.0/default/Contexthub.cpp index bf459005b4..3626a0948f 100644 --- a/contexthub/1.0/default/Contexthub.cpp +++ b/contexthub/1.0/default/Contexthub.cpp @@ -440,18 +440,15 @@ Return Contexthub::loadNanoApp(uint32_t hubId, // Data from the nanoapp header is passed through HIDL as explicit fields, // but the legacy HAL expects it prepended to the binary, therefore we must // reconstruct it here prior to passing to the legacy HAL. - uint32_t targetChreApiVersion = - (appBinary.targetChreApiMajorVersion << 24) | - (appBinary.targetChreApiMinorVersion << 16); const struct nano_app_binary_t header = { .header_version = htole32(1), - .magic = htole32(NANOAPP_MAGIC), - .app_id.id = htole64(appBinary.appId), - .app_version = htole32(appBinary.appVersion), - .flags = htole32(appBinary.flags), - .hw_hub_type = htole64(0), - .reserved[0] = htole32(targetChreApiVersion), - .reserved[1] = 0, + .magic = htole32(NANOAPP_MAGIC), + .app_id.id = htole64(appBinary.appId), + .app_version = htole32(appBinary.appVersion), + .flags = htole32(appBinary.flags), + .hw_hub_type = htole64(0), + .target_chre_api_major_version = appBinary.targetChreApiMajorVersion, + .target_chre_api_minor_version = appBinary.targetChreApiMinorVersion, }; const uint8_t *headerBytes = reinterpret_cast(&header); From 6dcc7132816d65cc8ccd9c300c65083886fd841f Mon Sep 17 00:00:00 2001 From: Kevin Rocard Date: Mon, 21 Aug 2017 18:32:49 -0700 Subject: [PATCH 153/265] Audio VTS: Look for Audio policy config in all supported folders audio_policy_configuration.xml can be loaded from the following places: - /system/etc/ - /vendor/etc - /odm/etc Nevertheless the config validation test was expecting it to be in /vendor/etc exclusively. This patch changes the test logic to: - look for the config files in all 3 folders - make sure the config is unique Test: run the following script to check for regressions and test that invalid config make the test fail. ( set -xe runVTS() { vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalAudioV2_0Target \ -t CheckConfig.audioPolicyConfigurationValidation; } echo "# Test valid config" runVTS echo "# Test multiple invalid match" adb shell touch /system/etc/audio_policy_configuration.xml ! runVTS adb shell rm /system/etc/audio_policy_configuration.xml echo "# Test multiple valid match" adb shell cp /{vendor,system}/etc/audio_policy_configuration.xml ! runVTS adb shell rm /system/etc/audio_policy_configuration.xml echo "# Test invalid config" adb shell sed -i /defaultOutputDevice/p /vendor/etc/audio_policy_configuration.xml ! runVTS adb shell sed -i '"/defaultOutputDevice/{p;N;d}"' /vendor/etc/audio_policy_configuration.xml echo "# Test that the test did not break the config" runVTS ) Bug: 64881365 Change-Id: I9db5e6f727d19fd654a3cc543a2aaab196682001 Signed-off-by: Kevin Rocard --- .../functional/ValidateAudioConfiguration.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/audio/2.0/vts/functional/ValidateAudioConfiguration.cpp b/audio/2.0/vts/functional/ValidateAudioConfiguration.cpp index 01324c87d3..5fc1b3d3e4 100644 --- a/audio/2.0/vts/functional/ValidateAudioConfiguration.cpp +++ b/audio/2.0/vts/functional/ValidateAudioConfiguration.cpp @@ -14,9 +14,24 @@ * limitations under the License. */ +#include +#include + #include "utility/ValidateXml.h" TEST(CheckConfig, audioPolicyConfigurationValidation) { - ASSERT_VALID_XML("/vendor/etc/audio_policy_configuration.xml", - "/data/local/tmp/audio_policy_configuration.xsd"); + const char* configName = "audio_policy_configuration.xml"; + const char* possibleConfigLocations[] = {"/odm/etc", "/vendor/etc", "/system/etc"}; + const char* configSchemaPath = "/data/local/tmp/audio_policy_configuration.xsd"; + + bool found = false; + for (std::string folder : possibleConfigLocations) { + const auto configPath = folder + '/' + configName; + if (access(configPath.c_str(), R_OK) == 0) { + ASSERT_FALSE(found) << "Multiple " << configName << " found in " + << ::testing::PrintToString(possibleConfigLocations); + found = true; + ASSERT_VALID_XML(configPath.c_str(), configSchemaPath); + } + } } From d09e5651ede3b1e5a24da828904af0aca0c0b5a6 Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Mon, 21 Aug 2017 14:50:28 -0700 Subject: [PATCH 154/265] Camera: Add new minor revision camera.device@3.3 This adds a single new member to the HalStream structure, used by camera.device@3.2::ICameraDeviceSession.configureStreams, for HALs to override the requested stream dataSpace. This override may be used when the requested format is IMPLEMENTATION_DEFINED. Test: Builds Bug: 62358514 Change-Id: Ie43e6cfd2ac52657c9366ff5297daa22c0bfa46c --- camera/Android.bp | 1 + camera/device/3.3/Android.bp | 72 ++++++++++++++++++++++ camera/device/3.3/ICameraDeviceSession.hal | 50 +++++++++++++++ camera/device/3.3/types.hal | 57 +++++++++++++++++ camera/device/README.md | 13 ++++ 5 files changed, 193 insertions(+) create mode 100644 camera/device/3.3/Android.bp create mode 100644 camera/device/3.3/ICameraDeviceSession.hal create mode 100644 camera/device/3.3/types.hal diff --git a/camera/Android.bp b/camera/Android.bp index 3869766db5..83a2803580 100644 --- a/camera/Android.bp +++ b/camera/Android.bp @@ -6,6 +6,7 @@ subdirs = [ "device/1.0/default", "device/3.2", "device/3.2/default", + "device/3.3", "metadata/3.2", "provider/2.4", "provider/2.4/default", diff --git a/camera/device/3.3/Android.bp b/camera/device/3.3/Android.bp new file mode 100644 index 0000000000..2a1999165c --- /dev/null +++ b/camera/device/3.3/Android.bp @@ -0,0 +1,72 @@ +// This file is autogenerated by hidl-gen. Do not edit manually. + +filegroup { + name: "android.hardware.camera.device@3.3_hal", + srcs: [ + "types.hal", + "ICameraDeviceSession.hal", + ], +} + +genrule { + name: "android.hardware.camera.device@3.3_genc++", + tools: ["hidl-gen"], + cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.camera.device@3.3", + srcs: [ + ":android.hardware.camera.device@3.3_hal", + ], + out: [ + "android/hardware/camera/device/3.3/types.cpp", + "android/hardware/camera/device/3.3/CameraDeviceSessionAll.cpp", + ], +} + +genrule { + name: "android.hardware.camera.device@3.3_genc++_headers", + tools: ["hidl-gen"], + cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.camera.device@3.3", + srcs: [ + ":android.hardware.camera.device@3.3_hal", + ], + out: [ + "android/hardware/camera/device/3.3/types.h", + "android/hardware/camera/device/3.3/hwtypes.h", + "android/hardware/camera/device/3.3/ICameraDeviceSession.h", + "android/hardware/camera/device/3.3/IHwCameraDeviceSession.h", + "android/hardware/camera/device/3.3/BnHwCameraDeviceSession.h", + "android/hardware/camera/device/3.3/BpHwCameraDeviceSession.h", + "android/hardware/camera/device/3.3/BsCameraDeviceSession.h", + ], +} + +cc_library { + name: "android.hardware.camera.device@3.3", + defaults: ["hidl-module-defaults"], + generated_sources: ["android.hardware.camera.device@3.3_genc++"], + generated_headers: ["android.hardware.camera.device@3.3_genc++_headers"], + export_generated_headers: ["android.hardware.camera.device@3.3_genc++_headers"], + vendor_available: true, + vndk: { + enabled: true, + }, + shared_libs: [ + "libhidlbase", + "libhidltransport", + "libhwbinder", + "liblog", + "libutils", + "libcutils", + "android.hardware.camera.common@1.0", + "android.hardware.camera.device@3.2", + "android.hardware.graphics.common@1.0", + ], + export_shared_lib_headers: [ + "libhidlbase", + "libhidltransport", + "libhwbinder", + "libutils", + "android.hardware.camera.common@1.0", + "android.hardware.camera.device@3.2", + "android.hardware.graphics.common@1.0", + ], +} diff --git a/camera/device/3.3/ICameraDeviceSession.hal b/camera/device/3.3/ICameraDeviceSession.hal new file mode 100644 index 0000000000..764392f1cf --- /dev/null +++ b/camera/device/3.3/ICameraDeviceSession.hal @@ -0,0 +1,50 @@ +/* + * Copyright (C) 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. + */ + +package android.hardware.camera.device@3.3; + +import android.hardware.camera.common@1.0::Status; +import android.hardware.camera.device@3.2::ICameraDeviceSession; +import android.hardware.camera.device@3.2::StreamConfiguration; + +/** + * Camera device active session interface. + * + * Obtained via ICameraDevice::open(), this interface contains the methods to + * configure and request captures from an active camera device. + * + */ +interface ICameraDeviceSession extends @3.2::ICameraDeviceSession { + + /** + * configureStreams_3_3: + * + * Identical to @3.2::ICameraDeviceSession.configureStreams, except that: + * + * - The output HalStreamConfiguration now contains an overrideDataspace + * field, to be used by the HAL to select a different dataspace for some + * use cases when dealing with the IMPLEMENTATION_DEFINED pixel format. + * + * Clients may invoke either this method or + * @3.2::ICameraDeviceSession.configureStreams() for stream configuration. + * This method is recommended for clients to use since it provides more + * flexibility. + */ + configureStreams_3_3(StreamConfiguration requestedConfiguration) + generates (Status status, + @3.3::HalStreamConfiguration halConfiguration); + +}; diff --git a/camera/device/3.3/types.hal b/camera/device/3.3/types.hal new file mode 100644 index 0000000000..b4ad702292 --- /dev/null +++ b/camera/device/3.3/types.hal @@ -0,0 +1,57 @@ +/* + * Copyright (C) 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. + */ + +package android.hardware.camera.device@3.3; + +import android.hardware.camera.device@3.2::DataspaceFlags; +import android.hardware.camera.device@3.2::HalStream; + +/** + * HalStream: + * + * The camera HAL's response to each requested stream configuration. + * + * This version extends the @3.2 HalStream with the overrideDataspace + * field + */ +struct HalStream { + /** + * The definition of HalStream from the prior version. + */ + @3.2::HalStream v3_2; + + /** + * An override dataSpace for the buffers in this stream. + * + * The HAL must respect the requested dataSpace in Stream unless it is + * IMPLEMENTATION_DEFINED, in which case the override dataSpace here must be + * used by the client instead, for this stream. This allows cross-platform + * HALs to use a specific dataSpace since IMPLEMENTATION_DEFINED formats often + * require device-specific information for correct selection. In all other cases, the + * overrideFormat must match the requested format. + */ + DataspaceFlags overrideDataSpace; +}; + +/** + * HalStreamConfiguration: + * + * Identical to @3.2::HalStreamConfiguration, except that it contains @3.3::HalStream entries. + * + */ +struct HalStreamConfiguration { + vec streams; +}; diff --git a/camera/device/README.md b/camera/device/README.md index 6e5703a578..9f607816d8 100644 --- a/camera/device/README.md +++ b/camera/device/README.md @@ -33,6 +33,8 @@ support for ICameraDevice@1.0 will be removed with the Android R release. This HAL interface version only allows support at the LEGACY level for the android.hardware.camera2 API. +Added in Android 8.0. + Subsidiary HALs: #### ICameraDevice1PreviewCallback.hal@1.0: @@ -62,6 +64,8 @@ The open() method actually opens the camera device for use, returning a Session interface for operating the active camera. It takes a Callback interface as an argument. +Added in Android 8.0. + Subsidiary HALs: #### ICameraDevice3Session.hal@3.2: @@ -74,3 +78,12 @@ capture requests to it. Callback interface for sending completed captures and other asynchronous events from tehe HAL to the client. + +### ICameraDevice.hal@3.3: + +A minor revision to the ICameraDevice.hal@3.2. + + - Adds support for overriding the output dataspace of a stream, which was + supported in the legacy camera HAL. + +Added in Android 8.1. From f378b7ffe2be2b4f8ab35e89dfac2aad4a1e9724 Mon Sep 17 00:00:00 2001 From: Jeff Vander Stoep Date: Fri, 18 Aug 2017 13:51:43 -0700 Subject: [PATCH 155/265] configstore: Allow syscalls needed by crash_dump Information such as tombstones and callstack are important when debugging why a process crashed. configstore's seccomp filter and selinux policy are currently overly strict and are blocking the collection of crash data. In order to keep configstore's sandbox as strict as possible, use Crash_dump's fallback mechanism to collect crash data. This uses a local socket to send crash data to tombstoned. Bug: 64768925 Test: killall -ABRT android.hardware.configstore@1.1-service Verify that configstore callstack gets dumped to logcat. Verify that a crash tombstone gets recorded to /data/tombstones Test: proto_fuzzer runs without crashing Change-Id: I3c3e13d6aa1c1e2dda2a619dfa815375ee7ebff6 (cherry picked from commit 60ced291129198d7c7a954c32811dec9bd71d83a) --- .../seccomp_policy/configstore@1.1-arm64.policy | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/configstore/1.1/default/seccomp_policy/configstore@1.1-arm64.policy b/configstore/1.1/default/seccomp_policy/configstore@1.1-arm64.policy index 8c901eb8de..7e3dfe0c54 100644 --- a/configstore/1.1/default/seccomp_policy/configstore@1.1-arm64.policy +++ b/configstore/1.1/default/seccomp_policy/configstore@1.1-arm64.policy @@ -15,9 +15,9 @@ futex: 1 # ioctl: arg1 == BINDER_WRITE_READ ioctl: arg1 == 0xc0306201 -ioctl: 1 # prctl: arg0 == PR_SET_NAME || arg0 == PR_SET_VMA || arg0 == PR_SET_TIMERSLACK -prctl: arg0 == 15 || arg0 == 0x53564d41 || arg0 == 29 +# || arg0 == PR_GET_NO_NEW_PRIVS # used by crash_dump +prctl: arg0 == 15 || arg0 == 0x53564d41 || arg0 == 29 || arg0 == 39 openat: 1 mmap: 1 mprotect: 1 @@ -38,3 +38,13 @@ exit: 1 exit_group: 1 rt_sigreturn: 1 getrlimit: 1 +madvise: 1 + +# used during process crash by crash_dump to dump process info +rt_sigprocmask: 1 +rt_sigaction: 1 +# socket: arg0 == AF_LOCAL +socket: arg0 == 1 +connect: 1 +recvmsg: 1 +rt_tgsigqueueinfo: 1 From 250139c8b076609e59ab9137fd8a04dc93fa5afe Mon Sep 17 00:00:00 2001 From: Pavel Maltsev Date: Thu, 24 Aug 2017 15:09:41 -0700 Subject: [PATCH 156/265] Merge Vehicle HAL 2.1 iface to 2.0 Vehicle HAL is property based and all properties are considered optional. It is quite a bit of pain to create new versions of VHAL only to extend properties. Bug: 64303350 Test: build and flash, verefied system works stable. Change-Id: I8adb858f53a5d9d31f7444bf97ae09baf2fffafa --- automotive/Android.bp | 2 - automotive/vehicle/2.0/Android.mk | 608 +++++++ automotive/vehicle/2.0/default/Android.bp | 1 + .../include/vhal_v2_0}/Obd2SensorStore.h | 31 +- .../default/common/src/Obd2SensorStore.cpp | 54 +- .../default/impl/vhal_v2_0/DefaultConfig.h | 74 +- .../impl/vhal_v2_0/EmulatedVehicleHal.cpp | 184 ++- .../impl/vhal_v2_0/EmulatedVehicleHal.h | 9 +- automotive/vehicle/2.0/types.hal | 1430 ++++++++++++----- automotive/vehicle/2.1/Android.bp | 68 - automotive/vehicle/2.1/Android.mk | 724 --------- automotive/vehicle/2.1/IVehicle.hal | 31 - automotive/vehicle/2.1/default/Android.bp | 86 - ...hardware.automotive.vehicle@2.1-service.rc | 4 - .../default/impl/vhal_v2_1/DefaultConfig.h | 108 -- .../impl/vhal_v2_1/EmulatedVehicleHal.cpp | 265 --- .../impl/vhal_v2_1/EmulatedVehicleHal.h | 77 - automotive/vehicle/2.1/default/service.cpp | 104 -- .../default/tests/Obd2SensorStore_test.cpp | 285 ---- automotive/vehicle/2.1/types.hal | 715 --------- current.txt | 1 + 21 files changed, 1973 insertions(+), 2888 deletions(-) rename automotive/vehicle/{2.1/default/common/include/vhal_v2_1 => 2.0/default/common/include/vhal_v2_0}/Obd2SensorStore.h (74%) rename automotive/vehicle/{2.1 => 2.0}/default/common/src/Obd2SensorStore.cpp (61%) delete mode 100644 automotive/vehicle/2.1/Android.bp delete mode 100644 automotive/vehicle/2.1/Android.mk delete mode 100644 automotive/vehicle/2.1/IVehicle.hal delete mode 100644 automotive/vehicle/2.1/default/Android.bp delete mode 100644 automotive/vehicle/2.1/default/android.hardware.automotive.vehicle@2.1-service.rc delete mode 100644 automotive/vehicle/2.1/default/impl/vhal_v2_1/DefaultConfig.h delete mode 100644 automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.cpp delete mode 100644 automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.h delete mode 100644 automotive/vehicle/2.1/default/service.cpp delete mode 100644 automotive/vehicle/2.1/default/tests/Obd2SensorStore_test.cpp delete mode 100644 automotive/vehicle/2.1/types.hal diff --git a/automotive/Android.bp b/automotive/Android.bp index d9a6355024..8cde817d03 100644 --- a/automotive/Android.bp +++ b/automotive/Android.bp @@ -6,6 +6,4 @@ subdirs = [ "vehicle/2.0", "vehicle/2.0/default", "vehicle/2.0/default/impl/vhal_v2_0/proto", - "vehicle/2.1", - "vehicle/2.1/default", ] diff --git a/automotive/vehicle/2.0/Android.mk b/automotive/vehicle/2.0/Android.mk index eb05f35eca..5919487471 100644 --- a/automotive/vehicle/2.0/Android.mk +++ b/automotive/vehicle/2.0/Android.mk @@ -16,6 +16,177 @@ LOCAL_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java \ +# +# Build types.hal (DiagnosticFloatSensorIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/DiagnosticFloatSensorIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.DiagnosticFloatSensorIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (DiagnosticIntegerSensorIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/DiagnosticIntegerSensorIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.DiagnosticIntegerSensorIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2CommonIgnitionMonitors) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Obd2CommonIgnitionMonitors.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Obd2CommonIgnitionMonitors + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2CompressionIgnitionMonitors) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Obd2CompressionIgnitionMonitors.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Obd2CompressionIgnitionMonitors + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2FuelSystemStatus) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Obd2FuelSystemStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Obd2FuelSystemStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2FuelType) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Obd2FuelType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Obd2FuelType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2IgnitionMonitorKind) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Obd2IgnitionMonitorKind.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Obd2IgnitionMonitorKind + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2SecondaryAirStatus) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Obd2SecondaryAirStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Obd2SecondaryAirStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2SparkIgnitionMonitors) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Obd2SparkIgnitionMonitors.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Obd2SparkIgnitionMonitors + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + # # Build types.hal (StatusCode) # @@ -909,6 +1080,139 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) +# +# Build types.hal (VmsAvailabilityStateIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VmsAvailabilityStateIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VmsAvailabilityStateIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsBaseMessageIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VmsBaseMessageIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VmsBaseMessageIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsMessageType) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VmsMessageType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VmsMessageType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsMessageWithLayerAndPublisherIdIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VmsMessageWithLayerAndPublisherIdIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VmsMessageWithLayerAndPublisherIdIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsMessageWithLayerIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VmsMessageWithLayerIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VmsMessageWithLayerIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsOfferingMessageIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VmsOfferingMessageIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VmsOfferingMessageIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsSubscriptionsStateIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VmsSubscriptionsStateIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VmsSubscriptionsStateIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + # # Build types.hal (Wheel) # @@ -988,6 +1292,177 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ android.hidl.base-V1.0-java-static \ +# +# Build types.hal (DiagnosticFloatSensorIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/DiagnosticFloatSensorIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.DiagnosticFloatSensorIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (DiagnosticIntegerSensorIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/DiagnosticIntegerSensorIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.DiagnosticIntegerSensorIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2CommonIgnitionMonitors) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Obd2CommonIgnitionMonitors.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Obd2CommonIgnitionMonitors + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2CompressionIgnitionMonitors) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Obd2CompressionIgnitionMonitors.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Obd2CompressionIgnitionMonitors + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2FuelSystemStatus) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Obd2FuelSystemStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Obd2FuelSystemStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2FuelType) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Obd2FuelType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Obd2FuelType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2IgnitionMonitorKind) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Obd2IgnitionMonitorKind.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Obd2IgnitionMonitorKind + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2SecondaryAirStatus) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Obd2SecondaryAirStatus.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Obd2SecondaryAirStatus + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (Obd2SparkIgnitionMonitors) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/Obd2SparkIgnitionMonitors.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.Obd2SparkIgnitionMonitors + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + # # Build types.hal (StatusCode) # @@ -1881,6 +2356,139 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) +# +# Build types.hal (VmsAvailabilityStateIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VmsAvailabilityStateIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VmsAvailabilityStateIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsBaseMessageIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VmsBaseMessageIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VmsBaseMessageIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsMessageType) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VmsMessageType.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VmsMessageType + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsMessageWithLayerAndPublisherIdIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VmsMessageWithLayerAndPublisherIdIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VmsMessageWithLayerAndPublisherIdIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsMessageWithLayerIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VmsMessageWithLayerIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VmsMessageWithLayerIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsOfferingMessageIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VmsOfferingMessageIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VmsOfferingMessageIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (VmsSubscriptionsStateIntegerValuesIndex) +# +GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_0/VmsSubscriptionsStateIntegerValuesIndex.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava \ + -randroid.hardware:hardware/interfaces \ + -randroid.hidl:system/libhidl/transport \ + android.hardware.automotive.vehicle@2.0::types.VmsSubscriptionsStateIntegerValuesIndex + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + # # Build types.hal (Wheel) # diff --git a/automotive/vehicle/2.0/default/Android.bp b/automotive/vehicle/2.0/default/Android.bp index 3e3ff2c852..1690163d2a 100644 --- a/automotive/vehicle/2.0/default/Android.bp +++ b/automotive/vehicle/2.0/default/Android.bp @@ -40,6 +40,7 @@ cc_library_static { vendor: true, defaults: ["vhal_v2_0_defaults"], srcs: [ + "common/src/Obd2SensorStore.cpp", "common/src/SubscriptionManager.cpp", "common/src/VehicleHalManager.cpp", "common/src/VehicleObjectPool.cpp", diff --git a/automotive/vehicle/2.1/default/common/include/vhal_v2_1/Obd2SensorStore.h b/automotive/vehicle/2.0/default/common/include/vhal_v2_0/Obd2SensorStore.h similarity index 74% rename from automotive/vehicle/2.1/default/common/include/vhal_v2_1/Obd2SensorStore.h rename to automotive/vehicle/2.0/default/common/include/vhal_v2_0/Obd2SensorStore.h index 8000695543..191a565c61 100644 --- a/automotive/vehicle/2.1/default/common/include/vhal_v2_1/Obd2SensorStore.h +++ b/automotive/vehicle/2.0/default/common/include/vhal_v2_0/Obd2SensorStore.h @@ -14,38 +14,37 @@ * limitations under the License. */ -#ifndef android_hardware_automotive_vehicle_V2_1_Obd2SensorStore_H_ -#define android_hardware_automotive_vehicle_V2_1_Obd2SensorStore_H_ +#ifndef android_hardware_automotive_vehicle_V2_0_Obd2SensorStore_H_ +#define android_hardware_automotive_vehicle_V2_0_Obd2SensorStore_H_ #include -#include +#include namespace android { namespace hardware { namespace automotive { namespace vehicle { -namespace V2_1 { +namespace V2_0 { // This class wraps all the logic required to create an OBD2 frame. // It allows storing sensor values, setting appropriate bitmasks as needed, // and returning appropriately laid out storage of sensor values suitable // for being returned via a VehicleHal implementation. class Obd2SensorStore { -public: + public: // Creates a sensor storage with a given number of vendor-specific sensors. - Obd2SensorStore(size_t numVendorIntegerSensors, - size_t numVendorFloatSensors); + Obd2SensorStore(size_t numVendorIntegerSensors, size_t numVendorFloatSensors); // Stores an integer-valued sensor. - V2_0::StatusCode setIntegerSensor(DiagnosticIntegerSensorIndex index, int32_t value); + StatusCode setIntegerSensor(DiagnosticIntegerSensorIndex index, int32_t value); // Stores an integer-valued sensor. - V2_0::StatusCode setIntegerSensor(size_t index, int32_t value); + StatusCode setIntegerSensor(size_t index, int32_t value); // Stores a float-valued sensor. - V2_0::StatusCode setFloatSensor(DiagnosticFloatSensorIndex index, float value); + StatusCode setFloatSensor(DiagnosticFloatSensorIndex index, float value); // Stores a float-valued sensor. - V2_0::StatusCode setFloatSensor(size_t index, float value); + StatusCode setFloatSensor(size_t index, float value); // Returns a vector that contains all integer sensors stored. const std::vector& getIntegerSensors() const; @@ -55,11 +54,11 @@ public: const std::vector& getSensorsBitmask() const; // Given a stringValue, fill in a VehiclePropValue - void fillPropValue(const std::string& dtc, V2_0::VehiclePropValue *propValue) const; + void fillPropValue(const std::string& dtc, VehiclePropValue* propValue) const; -private: + private: class BitmaskInVector { - public: + public: BitmaskInVector(size_t numBits = 0); void resize(size_t numBits); bool get(size_t index) const; @@ -67,7 +66,7 @@ private: const std::vector& getBitmask() const; - private: + private: std::vector mStorage; }; @@ -76,7 +75,7 @@ private: BitmaskInVector mSensorsBitmask; }; -} // namespace V2_1 +} // namespace V2_0 } // namespace vehicle } // namespace automotive } // namespace hardware diff --git a/automotive/vehicle/2.1/default/common/src/Obd2SensorStore.cpp b/automotive/vehicle/2.0/default/common/src/Obd2SensorStore.cpp similarity index 61% rename from automotive/vehicle/2.1/default/common/src/Obd2SensorStore.cpp rename to automotive/vehicle/2.0/default/common/src/Obd2SensorStore.cpp index 8705e00b4c..65174f7a00 100644 --- a/automotive/vehicle/2.1/default/common/src/Obd2SensorStore.cpp +++ b/automotive/vehicle/2.0/default/common/src/Obd2SensorStore.cpp @@ -23,23 +23,21 @@ namespace android { namespace hardware { namespace automotive { namespace vehicle { -namespace V2_1 { +namespace V2_0 { -Obd2SensorStore::BitmaskInVector::BitmaskInVector(size_t numBits) -{ +Obd2SensorStore::BitmaskInVector::BitmaskInVector(size_t numBits) { resize(numBits); } void Obd2SensorStore::BitmaskInVector::resize(size_t numBits) { - mStorage = std::vector((numBits+7)/8, 0); + mStorage = std::vector((numBits + 7) / 8, 0); } void Obd2SensorStore::BitmaskInVector::set(size_t index, bool value) { const size_t byteIndex = index / 8; const size_t bitIndex = index % 8; const uint8_t byte = mStorage[byteIndex]; - uint8_t newValue = value ? (byte | (1 << bitIndex)) : - (byte & ~(1 << bitIndex)); + uint8_t newValue = value ? (byte | (1 << bitIndex)) : (byte & ~(1 << bitIndex)); mStorage[byteIndex] = newValue; } @@ -54,40 +52,33 @@ const std::vector& Obd2SensorStore::BitmaskInVector::getBitmask() const return mStorage; } -Obd2SensorStore::Obd2SensorStore(size_t numVendorIntegerSensors, - size_t numVendorFloatSensors) { - using V2_0::toInt; - // because the last index is valid *inclusive* - const size_t numSystemIntegerSensors = - toInt(DiagnosticIntegerSensorIndex::LAST_SYSTEM_INDEX)+1; - const size_t numSystemFloatSensors = - toInt(DiagnosticFloatSensorIndex::LAST_SYSTEM_INDEX)+1; - mIntegerSensors = std::vector( - numSystemIntegerSensors+numVendorIntegerSensors, 0); - mFloatSensors = std::vector( - numSystemFloatSensors+numVendorFloatSensors, 0); - mSensorsBitmask.resize(mIntegerSensors.size()+mFloatSensors.size()); +Obd2SensorStore::Obd2SensorStore(size_t numVendorIntegerSensors, size_t numVendorFloatSensors) { + // because the last index is valid *inclusive* + const size_t numSystemIntegerSensors = + toInt(DiagnosticIntegerSensorIndex::LAST_SYSTEM_INDEX) + 1; + const size_t numSystemFloatSensors = toInt(DiagnosticFloatSensorIndex::LAST_SYSTEM_INDEX) + 1; + mIntegerSensors = std::vector(numSystemIntegerSensors + numVendorIntegerSensors, 0); + mFloatSensors = std::vector(numSystemFloatSensors + numVendorFloatSensors, 0); + mSensorsBitmask.resize(mIntegerSensors.size() + mFloatSensors.size()); } -V2_0::StatusCode Obd2SensorStore::setIntegerSensor(DiagnosticIntegerSensorIndex index, - int32_t value) { - return setIntegerSensor(V2_0::toInt(index), value); +StatusCode Obd2SensorStore::setIntegerSensor(DiagnosticIntegerSensorIndex index, int32_t value) { + return setIntegerSensor(toInt(index), value); } -V2_0::StatusCode Obd2SensorStore::setFloatSensor(DiagnosticFloatSensorIndex index, - float value) { - return setFloatSensor(V2_0::toInt(index), value); +StatusCode Obd2SensorStore::setFloatSensor(DiagnosticFloatSensorIndex index, float value) { + return setFloatSensor(toInt(index), value); } -V2_0::StatusCode Obd2SensorStore::setIntegerSensor(size_t index, int32_t value) { +StatusCode Obd2SensorStore::setIntegerSensor(size_t index, int32_t value) { mIntegerSensors[index] = value; mSensorsBitmask.set(index, true); - return V2_0::StatusCode::OK; + return StatusCode::OK; } -V2_0::StatusCode Obd2SensorStore::setFloatSensor(size_t index, float value) { +StatusCode Obd2SensorStore::setFloatSensor(size_t index, float value) { mFloatSensors[index] = value; mSensorsBitmask.set(index + mIntegerSensors.size(), true); - return V2_0::StatusCode::OK; + return StatusCode::OK; } const std::vector& Obd2SensorStore::getIntegerSensors() const { @@ -102,8 +93,7 @@ const std::vector& Obd2SensorStore::getSensorsBitmask() const { return mSensorsBitmask.getBitmask(); } -void Obd2SensorStore::fillPropValue(const std::string& dtc, - V2_0::VehiclePropValue *propValue) const { +void Obd2SensorStore::fillPropValue(const std::string& dtc, VehiclePropValue* propValue) const { propValue->timestamp = elapsedRealtimeNano(); propValue->value.int32Values = getIntegerSensors(); propValue->value.floatValues = getFloatSensors(); @@ -111,8 +101,6 @@ void Obd2SensorStore::fillPropValue(const std::string& dtc, propValue->value.stringValue = dtc; } - - } // namespace V2_0 } // namespace vehicle } // namespace automotive diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h index fb63e3645e..08d3d79446 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h @@ -27,6 +27,18 @@ namespace vehicle { namespace V2_0 { namespace impl { +// +// Some handy constants to avoid conversions from enum to int. +constexpr int ABS_ACTIVE = (int)VehicleProperty::ABS_ACTIVE; +constexpr int OBD2_LIVE_FRAME = (int)VehicleProperty::OBD2_LIVE_FRAME; +constexpr int OBD2_FREEZE_FRAME = (int)VehicleProperty::OBD2_FREEZE_FRAME; +constexpr int OBD2_FREEZE_FRAME_INFO = (int)VehicleProperty::OBD2_FREEZE_FRAME_INFO; +constexpr int OBD2_FREEZE_FRAME_CLEAR = (int)VehicleProperty::OBD2_FREEZE_FRAME_CLEAR; +constexpr int TRACTION_CONTROL_ACTIVE = (int)VehicleProperty::TRACTION_CONTROL_ACTIVE; +constexpr int VEHICLE_MAP_SERVICE = (int)VehicleProperty::VEHICLE_MAP_SERVICE; +constexpr int WHEEL_TICK = (int)VehicleProperty::WHEEL_TICK; +constexpr int ALL_WHEELS = + (int)(Wheel::LEFT_FRONT | Wheel::RIGHT_FRONT | Wheel::LEFT_REAR | Wheel::RIGHT_REAR); /* * This property is used for test purpose to generate fake events. @@ -283,8 +295,68 @@ const ConfigDeclaration kVehicleProperties[]{ .access = VehiclePropertyAccess::READ, .changeMode = VehiclePropertyChangeMode::ON_CHANGE, }, - .initialValue = {.int32Values = {1}}} + .initialValue = {.int32Values = {1}}}, + { + .config = + { + .prop = WHEEL_TICK, + .access = VehiclePropertyAccess::READ, + .changeMode = VehiclePropertyChangeMode::CONTINUOUS, + .configArray = {ALL_WHEELS, 50000, 50000, 50000, 50000}, + .minSampleRate = 1.0f, + .maxSampleRate = 100.0f, + }, + }, + + { + .config = + { + .prop = ABS_ACTIVE, + .access = VehiclePropertyAccess::READ, + .changeMode = VehiclePropertyChangeMode::ON_CHANGE, + }, + }, + + { + .config = + { + .prop = TRACTION_CONTROL_ACTIVE, + .access = VehiclePropertyAccess::READ, + .changeMode = VehiclePropertyChangeMode::ON_CHANGE, + }, + }, + + { + .config = {.prop = OBD2_LIVE_FRAME, + .access = VehiclePropertyAccess::READ, + .changeMode = VehiclePropertyChangeMode::ON_CHANGE, + .configArray = {0, 0}}, + }, + + { + .config = {.prop = OBD2_FREEZE_FRAME, + .access = VehiclePropertyAccess::READ, + .changeMode = VehiclePropertyChangeMode::ON_CHANGE, + .configArray = {0, 0}}, + }, + + { + .config = {.prop = OBD2_FREEZE_FRAME_INFO, + .access = VehiclePropertyAccess::READ, + .changeMode = VehiclePropertyChangeMode::ON_CHANGE}, + }, + + { + .config = {.prop = OBD2_FREEZE_FRAME_CLEAR, + .access = VehiclePropertyAccess::WRITE, + .changeMode = VehiclePropertyChangeMode::ON_CHANGE, + .configArray = {1}}, + }, + + {.config = {.prop = VEHICLE_MAP_SERVICE, + .access = VehiclePropertyAccess::READ_WRITE, + .changeMode = VehiclePropertyChangeMode::ON_CHANGE}}, }; } // impl diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp index 4800cd8054..385f03de5c 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp @@ -19,6 +19,7 @@ #include #include "EmulatedVehicleHal.h" +#include "Obd2SensorStore.h" namespace android { namespace hardware { @@ -28,6 +29,62 @@ namespace V2_0 { namespace impl { +static std::unique_ptr fillDefaultObd2Frame(size_t numVendorIntegerSensors, + size_t numVendorFloatSensors) { + std::unique_ptr sensorStore( + new Obd2SensorStore(numVendorIntegerSensors, numVendorFloatSensors)); + + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::FUEL_SYSTEM_STATUS, + toInt(Obd2FuelSystemStatus::CLOSED_LOOP)); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::MALFUNCTION_INDICATOR_LIGHT_ON, 0); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::IGNITION_MONITORS_SUPPORTED, + toInt(Obd2IgnitionMonitorKind::SPARK)); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::IGNITION_SPECIFIC_MONITORS, + Obd2CommonIgnitionMonitors::COMPONENTS_AVAILABLE | + Obd2CommonIgnitionMonitors::MISFIRE_AVAILABLE | + Obd2SparkIgnitionMonitors::AC_REFRIGERANT_AVAILABLE | + Obd2SparkIgnitionMonitors::EVAPORATIVE_SYSTEM_AVAILABLE); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::INTAKE_AIR_TEMPERATURE, 35); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::COMMANDED_SECONDARY_AIR_STATUS, + toInt(Obd2SecondaryAirStatus::FROM_OUTSIDE_OR_OFF)); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::NUM_OXYGEN_SENSORS_PRESENT, 1); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::RUNTIME_SINCE_ENGINE_START, 500); + sensorStore->setIntegerSensor( + DiagnosticIntegerSensorIndex::DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON, 0); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::WARMUPS_SINCE_CODES_CLEARED, 51); + sensorStore->setIntegerSensor( + DiagnosticIntegerSensorIndex::DISTANCE_TRAVELED_SINCE_CODES_CLEARED, 365); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::ABSOLUTE_BAROMETRIC_PRESSURE, 30); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::CONTROL_MODULE_VOLTAGE, 12); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::AMBIENT_AIR_TEMPERATURE, 18); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::MAX_FUEL_AIR_EQUIVALENCE_RATIO, 1); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::FUEL_TYPE, + toInt(Obd2FuelType::GASOLINE)); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::CALCULATED_ENGINE_LOAD, 0.153); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::SHORT_TERM_FUEL_TRIM_BANK1, -0.16); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::LONG_TERM_FUEL_TRIM_BANK1, -0.16); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::SHORT_TERM_FUEL_TRIM_BANK2, -0.16); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::LONG_TERM_FUEL_TRIM_BANK2, -0.16); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::INTAKE_MANIFOLD_ABSOLUTE_PRESSURE, 7.5); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::ENGINE_RPM, 1250.); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::VEHICLE_SPEED, 40.); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::TIMING_ADVANCE, 2.5); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::THROTTLE_POSITION, 19.75); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::OXYGEN_SENSOR1_VOLTAGE, 0.265); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::FUEL_TANK_LEVEL_INPUT, 0.824); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::EVAPORATION_SYSTEM_VAPOR_PRESSURE, + -0.373); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::CATALYST_TEMPERATURE_BANK1_SENSOR1, + 190.); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::RELATIVE_THROTTLE_POSITION, 3.); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::ABSOLUTE_THROTTLE_POSITION_B, 0.306); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::ACCELERATOR_PEDAL_POSITION_D, 0.188); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::ACCELERATOR_PEDAL_POSITION_E, 0.094); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::COMMANDED_THROTTLE_ACTUATOR, 0.024); + + return sensorStore; +} + enum class FakeDataCommand : int32_t { Stop = 0, Start = 1, @@ -40,7 +97,7 @@ EmulatedVehicleHal::EmulatedVehicleHal(VehiclePropertyStore* propStore) this, std::placeholders::_1)), mFakeValueGenerator(std::bind(&EmulatedVehicleHal::onFakeValueGenerated, this, std::placeholders::_1, std::placeholders::_2)) { - + initStaticConfig(); for (size_t i = 0; i < arraysize(kVehicleProperties); i++) { mPropStore->registerProperty(kVehicleProperties[i].config); } @@ -48,14 +105,29 @@ EmulatedVehicleHal::EmulatedVehicleHal(VehiclePropertyStore* propStore) VehicleHal::VehiclePropValuePtr EmulatedVehicleHal::get( const VehiclePropValue& requestedPropValue, StatusCode* outStatus) { + auto propId = requestedPropValue.prop; + auto& pool = *getValuePool(); VehiclePropValuePtr v = nullptr; - auto internalPropValue = mPropStore->readValueOrNull(requestedPropValue); - if (internalPropValue != nullptr) { - v = getValuePool()->obtain(*internalPropValue); + switch (propId) { + case OBD2_FREEZE_FRAME: + v = pool.obtainComplex(); + *outStatus = fillObd2FreezeFrame(requestedPropValue, v.get()); + break; + case OBD2_FREEZE_FRAME_INFO: + v = pool.obtainComplex(); + *outStatus = fillObd2DtcInfo(v.get()); + break; + default: + auto internalPropValue = mPropStore->readValueOrNull(requestedPropValue); + if (internalPropValue != nullptr) { + v = getValuePool()->obtain(*internalPropValue); + } + + *outStatus = v != nullptr ? StatusCode::OK : StatusCode::INVALID_ARG; + break; } - *outStatus = v != nullptr ? StatusCode::OK : StatusCode::INVALID_ARG; return v; } @@ -73,6 +145,12 @@ StatusCode EmulatedVehicleHal::set(const VehiclePropValue& propValue) { && hvacPowerOn->value.int32Values[0] == 0) { return StatusCode::NOT_AVAILABLE; } + } else if (propValue.prop == OBD2_FREEZE_FRAME_CLEAR) { + return clearObd2FreezeFrames(propValue); + } else if (propValue.prop == VEHICLE_MAP_SERVICE) { + // Placeholder for future implementation of VMS property in the default hal. For now, just + // returns OK; otherwise, hal clients crash with property not supported. + return StatusCode::OK; } if (!mPropStore->writeValue(propValue)) { @@ -121,6 +199,8 @@ void EmulatedVehicleHal::onCreate() { } while (supportedAreas != 0); } + initObd2LiveFrame(*mPropStore->getConfigOrDie(OBD2_LIVE_FRAME)); + initObd2FreezeFrame(*mPropStore->getConfigOrDie(OBD2_FREEZE_FRAME)); } std::vector EmulatedVehicleHal::listProperties() { @@ -271,6 +351,100 @@ void EmulatedVehicleHal::onFakeValueGenerated(int32_t propId, float value) { } } +void EmulatedVehicleHal::initStaticConfig() { + for (auto&& it = std::begin(kVehicleProperties); it != std::end(kVehicleProperties); ++it) { + const auto& cfg = it->config; + VehiclePropertyStore::TokenFunction tokenFunction = nullptr; + + switch (cfg.prop) { + case OBD2_FREEZE_FRAME: { + tokenFunction = [](const VehiclePropValue& propValue) { + return propValue.timestamp; + }; + break; + } + default: + break; + } + + mPropStore->registerProperty(cfg, tokenFunction); + } +} + +void EmulatedVehicleHal::initObd2LiveFrame(const VehiclePropConfig& propConfig) { + auto liveObd2Frame = createVehiclePropValue(VehiclePropertyType::COMPLEX, 0); + auto sensorStore = fillDefaultObd2Frame(static_cast(propConfig.configArray[0]), + static_cast(propConfig.configArray[1])); + sensorStore->fillPropValue("", liveObd2Frame.get()); + liveObd2Frame->prop = OBD2_LIVE_FRAME; + + mPropStore->writeValue(*liveObd2Frame); +} + +void EmulatedVehicleHal::initObd2FreezeFrame(const VehiclePropConfig& propConfig) { + auto sensorStore = fillDefaultObd2Frame(static_cast(propConfig.configArray[0]), + static_cast(propConfig.configArray[1])); + + static std::vector sampleDtcs = {"P0070", + "P0102" + "P0123"}; + for (auto&& dtc : sampleDtcs) { + auto freezeFrame = createVehiclePropValue(VehiclePropertyType::COMPLEX, 0); + sensorStore->fillPropValue(dtc, freezeFrame.get()); + freezeFrame->prop = OBD2_FREEZE_FRAME; + + mPropStore->writeValue(*freezeFrame); + } +} + +StatusCode EmulatedVehicleHal::fillObd2FreezeFrame(const VehiclePropValue& requestedPropValue, + VehiclePropValue* outValue) { + if (requestedPropValue.value.int64Values.size() != 1) { + ALOGE("asked for OBD2_FREEZE_FRAME without valid timestamp"); + return StatusCode::INVALID_ARG; + } + auto timestamp = requestedPropValue.value.int64Values[0]; + auto freezeFrame = mPropStore->readValueOrNull(OBD2_FREEZE_FRAME, 0, timestamp); + if (freezeFrame == nullptr) { + ALOGE("asked for OBD2_FREEZE_FRAME at invalid timestamp"); + return StatusCode::INVALID_ARG; + } + outValue->prop = OBD2_FREEZE_FRAME; + outValue->value.int32Values = freezeFrame->value.int32Values; + outValue->value.floatValues = freezeFrame->value.floatValues; + outValue->value.bytes = freezeFrame->value.bytes; + outValue->value.stringValue = freezeFrame->value.stringValue; + outValue->timestamp = freezeFrame->timestamp; + return StatusCode::OK; +} + +StatusCode EmulatedVehicleHal::clearObd2FreezeFrames(const VehiclePropValue& propValue) { + if (propValue.value.int64Values.size() == 0) { + mPropStore->removeValuesForProperty(OBD2_FREEZE_FRAME); + return StatusCode::OK; + } else { + for (int64_t timestamp : propValue.value.int64Values) { + auto freezeFrame = mPropStore->readValueOrNull(OBD2_FREEZE_FRAME, 0, timestamp); + if (freezeFrame == nullptr) { + ALOGE("asked for OBD2_FREEZE_FRAME at invalid timestamp"); + return StatusCode::INVALID_ARG; + } + mPropStore->removeValue(*freezeFrame); + } + } + return StatusCode::OK; +} + +StatusCode EmulatedVehicleHal::fillObd2DtcInfo(VehiclePropValue* outValue) { + std::vector timestamps; + for (const auto& freezeFrame : mPropStore->readValuesForProperty(OBD2_FREEZE_FRAME)) { + timestamps.push_back(freezeFrame.timestamp); + } + outValue->value.int64Values = timestamps; + outValue->prop = OBD2_FREEZE_FRAME_INFO; + return StatusCode::OK; +} + } // impl } // namespace V2_0 diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.h index c25e0838c5..99d7edbc78 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.h +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.h @@ -70,8 +70,15 @@ private: void onContinuousPropertyTimer(const std::vector& properties); bool isContinuousProperty(int32_t propId) const; + void initStaticConfig(); + void initObd2LiveFrame(const VehiclePropConfig& propConfig); + void initObd2FreezeFrame(const VehiclePropConfig& propConfig); + StatusCode fillObd2FreezeFrame(const VehiclePropValue& requestedPropValue, + VehiclePropValue* outValue); + StatusCode fillObd2DtcInfo(VehiclePropValue* outValue); + StatusCode clearObd2FreezeFrames(const VehiclePropValue& propValue); -private: + /* Private members */ VehiclePropertyStore* mPropStore; std::unordered_set mHvacPowerProps; RecurrentTimer mRecurrentTimer; diff --git a/automotive/vehicle/2.0/types.hal b/automotive/vehicle/2.0/types.hal index f1fb6bf2b9..12b92dd352 100644 --- a/automotive/vehicle/2.0/types.hal +++ b/automotive/vehicle/2.0/types.hal @@ -225,6 +225,50 @@ enum VehicleProperty: int32_t { | VehiclePropertyType:FLOAT | VehicleArea:GLOBAL), + /** + * Reports wheel ticks + * + * The first four elements represent ticks for individual wheels in the + * following order: front left, front right, rear right, rear left. All + * tick counts are cumulative. Tick counts increment when the vehicle + * moves forward, and decrement when vehicles moves in reverse. The ticks + * should be reset to 0 when the vehicle is started by the user. + * + * The next element in the vector is a reset count. A reset indicates + * previous tick counts are not comparable with this and future ones. Some + * sort of discontinuity in tick counting has occurred. + * + * int64Values[0] = reset count + * int64Values[1] = front left ticks + * int64Values[2] = front right ticks + * int64Values[3] = rear right ticks + * int64Values[4] = rear left ticks + * + * configArray is used to indicate the micrometers-per-wheel-tick value as well as + * which wheels are supported. configArray is set as follows: + * + * configArray[0], bits [0:3] = supported wheels. Uses enum Wheel. + * configArray[1] = micrometers per front left wheel tick + * configArray[2] = micrometers per front right wheel tick + * configArray[3] = micrometers per rear right wheel tick + * configArray[4] = micrometers per rear left wheel tick + * + * NOTE: If a wheel is not supported, its value shall always be set to 0. + * + * VehiclePropValue.timestamp must be correctly filled in. + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + * + * @since o.mr1 + */ + WHEEL_TICK = ( + 0x0306 + | VehiclePropertyGroup:SYSTEM + | VehiclePropertyType:COMPLEX + | VehicleArea:GLOBAL), + + /** * Currently selected gear * @@ -327,6 +371,34 @@ enum VehicleProperty: int32_t { | VehiclePropertyType:INT32 | VehicleArea:GLOBAL), + /** + * ABS is active. Set to true whenever ABS is activated. Reset to false when ABS is off. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * + * @since o.mr1 + */ + ABS_ACTIVE = ( + 0x040A + | VehiclePropertyGroup:SYSTEM + | VehiclePropertyType:BOOLEAN + | VehicleArea:GLOBAL), + + /** + * Traction Control is active. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * + * @since o.mr1 + */ + TRACTION_CONTROL_ACTIVE = ( + 0x040B + | VehiclePropertyGroup:SYSTEM + | VehiclePropertyType:BOOLEAN + | VehicleArea:GLOBAL), + /** * Fan speed setting * @@ -603,6 +675,24 @@ enum VehicleProperty: int32_t { | VehiclePropertyType:INT32 | VehicleArea:ZONE), + /** + * Represents power state for HVAC. Some HVAC properties must require + * matching power to be turned on to get out of OFF state. For non-zoned + * HVAC properties, VEHICLE_ALL_ZONE corresponds to global power state. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @config_string list of HVAC properties whose power is controlled by this + * property. Format is hexa-decimal number (0x...) separated + * by comma like "0x500,0x503". All zones defined in these + * affected properties must be available in the property. + */ + HVAC_POWER_ON = ( + 0x0510 + | VehiclePropertyGroup:SYSTEM + | VehiclePropertyType:BOOLEAN + | VehicleArea:ZONE), + /** * Fan Positions Available * @@ -623,19 +713,18 @@ enum VehicleProperty: int32_t { | VehicleArea:ZONE), /** - * Represents power state for HVAC. Some HVAC properties must require - * matching power to be turned on to get out of OFF state. For non-zoned - * HVAC properties, VEHICLE_ALL_ZONE corresponds to global power state. + * Automatic re-circulation on/off + * + * IVehicle#set and IVehicle#get must return StatusCode::NOT_AVAILABLE when HVAC unit is off. + * See HVAC_POWER_ON property for details. * * @change_mode VehiclePropertyChangeMode:ON_CHANGE * @access VehiclePropertyAccess:READ_WRITE - * @config_string list of HVAC properties whose power is controlled by this - * property. Format is hexa-decimal number (0x...) separated - * by comma like "0x500,0x503". All zones defined in these - * affected properties must be available in the property. + * + * @since o.mr1 */ - HVAC_POWER_ON = ( - 0x0510 + HVAC_AUTO_RECIRC_ON = ( + 0x0512 | VehiclePropertyGroup:SYSTEM | VehiclePropertyType:BOOLEAN | VehicleArea:ZONE), @@ -742,18 +831,21 @@ enum VehicleProperty: int32_t { * 0 means no active audio focus holder outside Android. * The state must have following values for each * VehicleAudioFocusState: - * GAIN: 0 or VehicleAudioExtFocusFlag#PLAY_ONLY_FLAG - * when radio is active in Android side. - * GAIN_TRANSIENT: 0. Can be + * GAIN: VehicleAudioExtFocusFlag#PLAY_ONLY_FLAG + * when radio is active in Android side. Otherwise, + * VehicleAudioExtFocusFlag#NONE_FLAG. + * GAIN_TRANSIENT: Can be * VehicleAudioExtFocusFlag#PERMANENT_FLAG or * VehicleAudioExtFocusFlag#TRANSIENT_FLAG if android * side has requested * REQUEST_GAIN_TRANSIENT_MAY_DUCK and car side is - * ducking. - * LOSS: 0 when no focus is audio is active in car side. + * ducking. Otherwise + * VehicleAudioExtFocusFlag#NONE_FLAG. + * LOSS: VehicleAudioExtFocusFlag#NONE_FLAG when no focus + * is active in car side. * VehicleAudioExtFocusFlag#PERMANENT_FLAG when car * side is playing something permanent. - * LOSS_TRANSIENT: always must be + * LOSS_TRANSIENT: must always be * VehicleAudioExtFocusFlag#PERMANENT_FLAG * int32Values[3]: context requested by android side when responding to * focus request. When car side is taking focus away, @@ -857,12 +949,12 @@ enum VehicleProperty: int32_t { * to represent audio module's capability. * * Data type looks like: - * int32Values[0] : stream context as defined in VehicleAudioFocusFlag. + * int32Values[0] : stream context as defined in VehicleAudioContextFlag. * If only physical stream is supported * (configArray[0] == 0), this must represent physical * stream number. * int32Values[1] : maximum volume set to the stream. If there is no - * restriction, this value must be bigger than + * restriction, this value must be bigger than * AUDIO_VOLUME's max value. * * If car does not support this feature, this property must not be @@ -893,7 +985,7 @@ enum VehicleProperty: int32_t { * still use different audio stream for whatever reason. * int32Values[1] : All audio contexts that must be sent through the * physical stream. Flag is defined in - * VehicleAudioFocusFlag. + * VehicleAudioContextFlag. * Setting of this property must be done for all available physical streams * based on audio H/W variant information acquired from AUDIO_HW_VARIANT @@ -942,14 +1034,13 @@ enum VehicleProperty: int32_t { * for the routing. * This property can support up to 128 external routings. * To give full flexibility, there is no standard definition for each bit - * flag and assigning each big flag to specific routing type is decided by + * flag and assigning each bit flag to specific routing type is decided by * VehiclePropConfig#configString. VehiclePropConfig#configString has * format of each entry separated by ',' and each entry has format of * bitFlagPositon:typeString[:physicalStreamNumber]. - * bitFlagPosition: represents which big flag will be set to enable this - * routing. 0 means - * LSB in int32Values[0]. 31 will be MSB in int32Values[0]. 127 will MSB - * in int32Values[3]. + * bitFlagPosition: represents which bit flag will be set to enable this + * routing. 0 means LSB in int32Values[0]. 31 will be MSB in + * int32Values[0]. 127 will MSB in int32Values[3]. * typeString: string representation of external routing. Some types are * already defined in AUDIO_EXT_ROUTING_SOURCE_* and use them first * before adding something custom. Applications will find each routing @@ -1126,10 +1217,11 @@ enum VehicleProperty: int32_t { * change. Instrument cluster still needs to send * event with new mode to trigger actual mode change. * int32Values[1] : The current app context relevant for instrument - * cluster. Use the same flag with VehicleAudioFocusFlag - * but this context represents active apps, not - * active audio. Instrument cluster side may change mode - * depending on the currently active contexts. + * cluster. Use the same flag with + * VehicleAudioContextFlag but this context represents + * active apps, not active audio. Instrument cluster + * side may change mode depending on the currently + * active contexts. * When system boots up, Android side will write {0, 0, 0, 0} when it is * ready to render to instrument cluster. Before this message, rendering * from android must not be visible in the cluster. @@ -1790,85 +1882,240 @@ enum VehicleProperty: int32_t { | VehiclePropertyGroup:SYSTEM | VehiclePropertyType:BOOLEAN | VehicleArea:GLOBAL), + + + /** + * Vehicle Maps Service (VMS) message + * + * This property uses COMPLEX data to communicate vms messages. + * + * Its contents are to be interpreted as follows: + * the indices defined in VmsMessageIntegerValuesIndex are to be used to + * read from int32Values; + * bytes is a serialized VMS message as defined in the vms protocol + * which is opaque to the framework; + * + * IVehicle#get must always return StatusCode::NOT_AVAILABLE. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * + * @since o.mr1 + */ + VEHICLE_MAP_SERVICE = ( + 0x0C00 + | VehiclePropertyGroup:SYSTEM + | VehiclePropertyType:COMPLEX + | VehicleArea:GLOBAL), + + /** + * OBD2 Live Sensor Data + * + * Reports a snapshot of the current (live) values of the OBD2 sensors available. + * + * The configArray is set as follows: + * configArray[0] = number of vendor-specific integer-valued sensors + * configArray[1] = number of vendor-specific float-valued sensors + * + * The values of this property are to be interpreted as in the following example. + * Considering a configArray = {2,3} + * int32Values must be a vector containing Obd2IntegerSensorIndex.LAST_SYSTEM_INDEX + 2 + * elements (that is, 33 elements); + * floatValues must be a vector containing Obd2FloatSensorIndex.LAST_SYSTEM_INDEX + 3 + * elements (that is, 73 elements); + * + * It is possible for each frame to contain a different subset of sensor values, both system + * provided sensors, and vendor-specific ones. In order to support that, the bytes element + * of the property value is used as a bitmask,. + * + * bytes must have a sufficient number of bytes to represent the total number of possible + * sensors (in this case, 14 bytes to represent 106 possible values); it is to be read as + * a contiguous bitmask such that each bit indicates the presence or absence of a sensor + * from the frame, starting with as many bits as the size of int32Values, immediately + * followed by as many bits as the size of floatValues. + * + * For example, should bytes[0] = 0x4C (0b01001100) it would mean that: + * int32Values[0 and 1] are not valid sensor values + * int32Values[2 and 3] are valid sensor values + * int32Values[4 and 5] are not valid sensor values + * int32Values[6] is a valid sensor value + * int32Values[7] is not a valid sensor value + * Should bytes[5] = 0x61 (0b01100001) it would mean that: + * int32Values[32] is a valid sensor value + * floatValues[0 thru 3] are not valid sensor values + * floatValues[4 and 5] are valid sensor values + * floatValues[6] is not a valid sensor value + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * + * @since o.mr1 + */ + OBD2_LIVE_FRAME = ( + 0x0D00 + | VehiclePropertyGroup:SYSTEM + | VehiclePropertyType:COMPLEX + | VehicleArea:GLOBAL), + + /** + * OBD2 Freeze Frame Sensor Data + * + * Reports a snapshot of the value of the OBD2 sensors available at the time that a fault + * occurred and was detected. + * + * A configArray must be provided with the same meaning as defined for OBD2_LIVE_FRAME. + * + * The values of this property are to be interpreted in a similar fashion as those for + * OBD2_LIVE_FRAME, with the exception that the stringValue field may contain a non-empty + * diagnostic troubleshooting code (DTC). + * + * A IVehicle#get request of this property must provide a value for int64Values[0]. + * This will be interpreted as the timestamp of the freeze frame to retrieve. A list of + * timestamps can be obtained by a IVehicle#get of OBD2_FREEZE_FRAME_INFO. + * + * Should no freeze frame be available at the given timestamp, a response of NOT_AVAILABLE + * must be returned by the implementation. Because vehicles may have limited storage for + * freeze frames, it is possible for a frame request to respond with NOT_AVAILABLE even if + * the associated timestamp has been recently obtained via OBD2_FREEZE_FRAME_INFO. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * + * @since o.mr1 + */ + OBD2_FREEZE_FRAME = ( + 0x0D01 + | VehiclePropertyGroup:SYSTEM + | VehiclePropertyType:COMPLEX + | VehicleArea:GLOBAL), + + /** + * OBD2 Freeze Frame Information + * + * This property describes the current freeze frames stored in vehicle + * memory and available for retrieval via OBD2_FREEZE_FRAME. + * + * The values are to be interpreted as follows: + * each element of int64Values must be the timestamp at which a a fault code + * has been detected and the corresponding freeze frame stored, and each + * such element can be used as the key to OBD2_FREEZE_FRAME to retrieve + * the corresponding freeze frame. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * + * @since o.mr1 + */ + OBD2_FREEZE_FRAME_INFO = ( + 0x0D02 + | VehiclePropertyGroup:SYSTEM + | VehiclePropertyType:COMPLEX + | VehicleArea:GLOBAL), + + /** + * OBD2 Freeze Frame Clear + * + * This property allows deletion of any of the freeze frames stored in + * vehicle memory, as described by OBD2_FREEZE_FRAME_INFO. + * + * The configArray is set as follows: + * configArray[0] = 1 if the implementation is able to clear individual freeze frames + * by timestamp, 0 otherwise + * + * IVehicle#set of this property is to be interpreted as follows: + * if int64Values contains no elements, then all frames stored must be cleared; + * if int64Values contains one or more elements, then frames at the timestamps + * stored in int64Values must be cleared, and the others not cleared. Should the + * vehicle not support selective clearing of freeze frames, this latter mode must + * return NOT_AVAILABLE. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:WRITE + * + * @since o.mr1 + */ + OBD2_FREEZE_FRAME_CLEAR = ( + 0x0D03 + | VehiclePropertyGroup:SYSTEM + | VehiclePropertyType:COMPLEX + | VehicleArea:GLOBAL), }; /** * Bit flags for fan direction */ enum VehicleHvacFanDirection : int32_t { - FACE = 0x1, - FLOOR = 0x2, - FACE_AND_FLOOR = 0x3, - DEFROST = 0x4, - DEFROST_AND_FLOOR = 0x5, + FACE = 0x1, + FLOOR = 0x2, + FACE_AND_FLOOR = 0x3, + DEFROST = 0x4, + DEFROST_AND_FLOOR = 0x5, }; /** * Constants relevant to radio. */ enum VehicleRadioConstants : int32_t { - /** Minimum value for the radio preset */ - VEHICLE_RADIO_PRESET_MIN_VALUE = 1, + /** Minimum value for the radio preset */ + VEHICLE_RADIO_PRESET_MIN_VALUE = 1, }; enum VehicleAudioFocusRequest : int32_t { - REQUEST_GAIN = 0x1, - REQUEST_GAIN_TRANSIENT = 0x2, - REQUEST_GAIN_TRANSIENT_MAY_DUCK = 0x3, - /** - * This is for the case where android side plays sound like UI feedback - * and car side does not need to duck existing playback as long as - * requested stream is available. - */ - REQUEST_GAIN_TRANSIENT_NO_DUCK = 0x4, - REQUEST_RELEASE = 0x5, - + REQUEST_GAIN = 0x1, + REQUEST_GAIN_TRANSIENT = 0x2, + REQUEST_GAIN_TRANSIENT_MAY_DUCK = 0x3, + /** + * This is for the case where android side plays sound like UI feedback + * and car side does not need to duck existing playback as long as + * requested stream is available. + */ + REQUEST_GAIN_TRANSIENT_NO_DUCK = 0x4, + REQUEST_RELEASE = 0x5, }; enum VehicleAudioFocusState : int32_t { - /** - * Android side has permanent focus and can play allowed streams. - */ - STATE_GAIN = 0x1, + /** + * Android side has permanent focus and can play allowed streams. + */ + STATE_GAIN = 0x1, - /** - * Android side has transient focus and can play allowed streams. - */ - STATE_GAIN_TRANSIENT = 0x2, + /** + * Android side has transient focus and can play allowed streams. + */ + STATE_GAIN_TRANSIENT = 0x2, - /** - * Car audio module is playing guidance kind of sound outside Android. - * Android side can still play through allowed streams with ducking. - */ - STATE_LOSS_TRANSIENT_CAN_DUCK = 0x3, + /** + * Car audio module is playing guidance kind of sound outside Android. + * Android side can still play through allowed streams with ducking. + */ + STATE_LOSS_TRANSIENT_CAN_DUCK = 0x3, - /** - * Car audio module is playing transient sound outside Android. Android side - * must stop playing any sounds. - */ - STATE_LOSS_TRANSIENT = 0x4, + /** + * Car audio module is playing transient sound outside Android. Android side + * must stop playing any sounds. + */ + STATE_LOSS_TRANSIENT = 0x4, - /** - * Android side has lost focus and cannot play any sound. - */ - STATE_LOSS = 0x5, - - /** - * car audio module is playing safety critical sound, and Android side cannot - * request focus until the current state is finished. car audio module - * restore it to the previous state when it can allow Android to play. - */ - STATE_LOSS_TRANSIENT_EXLCUSIVE = 0x6, + /** + * Android side has lost focus and cannot play any sound. + */ + STATE_LOSS = 0x5, + /** + * car audio module is playing safety critical sound, and Android side cannot + * request focus until the current state is finished. car audio module + * restore it to the previous state when it can allow Android to play. + */ + STATE_LOSS_TRANSIENT_EXLCUSIVE = 0x6, }; /** * Flags to represent multiple streams by combining these. */ enum VehicleAudioStreamFlag : int32_t { - STREAM0_FLAG = (0x1 << 0), - STREAM1_FLAG = (0x1 << 1), - STREAM2_FLAG = (0x1 << 2), + STREAM0_FLAG = (0x1 << 0), + STREAM1_FLAG = (0x1 << 1), + STREAM2_FLAG = (0x1 << 2), }; /** @@ -1876,107 +2123,107 @@ enum VehicleAudioStreamFlag : int32_t { * Can be used for audio related property expecting one stream. */ enum VehicleAudioStream : int32_t { - STREAM0 = 0, - STREAM1 = 1, + STREAM0 = 0, + STREAM1 = 1, }; /** * Flag to represent external focus state (outside Android). */ enum VehicleAudioExtFocusFlag : int32_t { - /** - * No external focus holder. - */ - NONE_FLAG = 0x0, + /** + * No external focus holder. + */ + NONE_FLAG = 0x0, - /** - * Car side (outside Android) has component holding GAIN kind of focus state. - */ - PERMANENT_FLAG = 0x1, + /** + * Car side (outside Android) has component holding GAIN kind of focus state. + */ + PERMANENT_FLAG = 0x1, - /** - * Car side (outside Android) has component holding GAIN_TRANSIENT kind of - * focus state. - */ - TRANSIENT_FLAG = 0x2, + /** + * Car side (outside Android) has component holding GAIN_TRANSIENT kind of + * focus state. + */ + TRANSIENT_FLAG = 0x2, - /** - * Car side is expected to play something while focus is held by Android side. - * One example can be radio attached in car side. But Android's radio app - * still must have focus, and Android side must be in GAIN state, but - * media stream will not be allocated to Android side and car side can play - * radio any time while this flag is active. - */ - PLAY_ONLY_FLAG = 0x4, + /** + * Car side is expected to play something while focus is held by Android side. + * One example can be radio attached in car side. But Android's radio app + * still must have focus, and Android side must be in GAIN state, but + * media stream will not be allocated to Android side and car side can play + * radio any time while this flag is active. + */ + PLAY_ONLY_FLAG = 0x4, - /** - * Car side must mute any media including radio. This can be used with any - * focus request including GAIN* and RELEASE. - */ - MUTE_MEDIA_FLAG = 0x8, + /** + * Car side must mute any media including radio. This can be used with any + * focus request including GAIN* and RELEASE. + */ + MUTE_MEDIA_FLAG = 0x8, }; /** * Index in int32Values for VehicleProperty#AUDIO_FOCUS property. */ enum VehicleAudioFocusIndex : int32_t { - FOCUS = 0, - STREAMS = 1, - EXTERNAL_FOCUS_STATE = 2, - AUDIO_CONTEXTS = 3, + FOCUS = 0, + STREAMS = 1, + EXTERNAL_FOCUS_STATE = 2, + AUDIO_CONTEXTS = 3, }; /** * Flags to tell the current audio context. */ enum VehicleAudioContextFlag : int32_t { - /** Music playback is currently active. */ - MUSIC_FLAG = 0x1, + /** Music playback is currently active. */ + MUSIC_FLAG = 0x1, - /** Navigation is currently running. */ - NAVIGATION_FLAG = 0x2, + /** Navigation is currently running. */ + NAVIGATION_FLAG = 0x2, - /** Voice command session is currently running. */ - VOICE_COMMAND_FLAG = 0x4, + /** Voice command session is currently running. */ + VOICE_COMMAND_FLAG = 0x4, - /** Voice call is currently active. */ - CALL_FLAG = 0x8, + /** Voice call is currently active. */ + CALL_FLAG = 0x8, - /** - * Alarm is active. - * This must be only used in VehicleProperty#AUDIO_ROUTING_POLICY. - */ - ALARM_FLAG = 0x10, + /** + * Alarm is active. + * This must be only used in VehicleProperty#AUDIO_ROUTING_POLICY. + */ + ALARM_FLAG = 0x10, - /** - * Notification sound is active. - * This must be only used in VehicleProperty#AUDIO_ROUTING_POLICY. - */ - NOTIFICATION_FLAG = 0x20, + /** + * Notification sound is active. + * This must be only used in VehicleProperty#AUDIO_ROUTING_POLICY. + */ + NOTIFICATION_FLAG = 0x20, - /** - * Context unknown. Only used for VehicleProperty#AUDIO_ROUTING_POLICY to - * represent default stream for unknown contents. - */ - UNKNOWN_FLAG = 0x40, + /** + * Context unknown. Only used for VehicleProperty#AUDIO_ROUTING_POLICY to + * represent default stream for unknown contents. + */ + UNKNOWN_FLAG = 0x40, - /** Safety alert / warning is played. */ - SAFETY_ALERT_FLAG = 0x80, + /** Safety alert / warning is played. */ + SAFETY_ALERT_FLAG = 0x80, - /** CD / DVD kind of audio is played */ - CD_ROM_FLAG = 0x100, + /** CD / DVD kind of audio is played */ + CD_ROM_FLAG = 0x100, - /** Aux audio input is played */ - AUX_AUDIO_FLAG = 0x200, + /** Aux audio input is played */ + AUX_AUDIO_FLAG = 0x200, - /** system sound like UI feedback */ - SYSTEM_SOUND_FLAG = 0x400, + /** system sound like UI feedback */ + SYSTEM_SOUND_FLAG = 0x400, - /** Radio is played */ - RADIO_FLAG = 0x800, + /** Radio is played */ + RADIO_FLAG = 0x800, - /** Ext source is played. This is for tagging generic ext sources. */ - EXT_SOURCE_FLAG = 0x1000, + /** Ext source is played. This is for tagging generic ext sources. */ + EXT_SOURCE_FLAG = 0x1000, }; /** @@ -1984,65 +2231,65 @@ enum VehicleAudioContextFlag : int32_t { * used in configArray[1] of VehiclePropConfig. */ enum VehicleAudioVolumeCapabilityFlag : int32_t { - /** - * External audio module or vehicle hal has persistent storage - * to keep the volume level. This must be set only when per context - * volume level is supported. When this is set, audio volume level per - * each context will be retrieved from the property when system starts up. - * And external audio module is also expected to adjust volume automatically - * whenever there is an audio context change. - * When this flag is not set, android side will assume that there is no - * persistent storage and stored value in android side will be used to - * initialize the volume level. And android side will set volume level - * of each physical streams whenever there is an audio context change. - */ - PERSISTENT_STORAGE = 0x1, + /** + * External audio module or vehicle hal has persistent storage + * to keep the volume level. This must be set only when per context + * volume level is supported. When this is set, audio volume level per + * each context will be retrieved from the property when system starts up. + * And external audio module is also expected to adjust volume automatically + * whenever there is an audio context change. + * When this flag is not set, android side will assume that there is no + * persistent storage and stored value in android side will be used to + * initialize the volume level. And android side will set volume level + * of each physical streams whenever there is an audio context change. + */ + PERSISTENT_STORAGE = 0x1, - /** - * When this flag is set, the H/W can support only single master volume for - * all streams. - * There is no way to set volume level differently per each stream or context. - */ - MASTER_VOLUME_ONLY = 0x2, + /** + * When this flag is set, the H/W can support only single master volume for + * all streams. + * There is no way to set volume level differently per each stream or context. + */ + MASTER_VOLUME_ONLY = 0x2, }; /** * enum to represent audio volume state. */ enum VehicleAudioVolumeState : int32_t { - STATE_OK = 0, + STATE_OK = 0, - /** - * Audio volume has reached volume limit set in - * VehicleProperty#AUDIO_VOLUME_LIMIT and user's request to increase volume - * further is not allowed. - */ - LIMIT_REACHED = 1, + /** + * Audio volume has reached volume limit set in + * VehicleProperty#AUDIO_VOLUME_LIMIT and user's request to increase volume + * further is not allowed. + */ + LIMIT_REACHED = 1, }; /** * Index in int32Values for VehicleProperty#AUDIO_VOLUME property. */ enum VehicleAudioVolumeIndex : int32_t { - INDEX_STREAM = 0, - INDEX_VOLUME = 1, - INDEX_STATE = 2, + INDEX_STREAM = 0, + INDEX_VOLUME = 1, + INDEX_STATE = 2, }; /** * Index in int32Values for VehicleProperty#AUDIO_VOLUME_LIMIT property. */ enum VehicleAudioVolumeLimitIndex : int32_t { - STREAM = 0, - MAX_VOLUME = 1, + STREAM = 0, + MAX_VOLUME = 1, }; /** * Index in int32Values for VehicleProperty#AUDIO_ROUTING_POLICY property. */ enum VehicleAudioRoutingPolicyIndex : int32_t { - STREAM = 0, - CONTEXTS = 1, + STREAM = 0, + CONTEXTS = 1, }; /** @@ -2054,172 +2301,172 @@ enum VehicleAudioHwVariantConfigFlag : int32_t { * Flag to tell that radio is internal to android and radio must * be treated like other android stream like media. * When this flag is not set or AUDIO_HW_VARIANT does not exist, - * radio is treated as external module. This brins some delta in audio focus + * radio is treated as external module. This may affect audio focus * handling as well. */ INTERNAL_RADIO_FLAG = 0x1, }; enum VehicleApPowerStateConfigFlag : int32_t /* NOTE: type is guessed */ { - /** - * AP can enter deep sleep state. If not set, AP will always shutdown from - * VehicleApPowerState#SHUTDOWN_PREPARE power state. - */ - ENABLE_DEEP_SLEEP_FLAG = 0x1, + /** + * AP can enter deep sleep state. If not set, AP will always shutdown from + * VehicleApPowerState#SHUTDOWN_PREPARE power state. + */ + ENABLE_DEEP_SLEEP_FLAG = 0x1, - /** - * The power controller can power on AP from off state after timeout - * specified in VehicleApPowerSet VEHICLE_AP_POWER_SET_SHUTDOWN_READY message. - */ - CONFIG_SUPPORT_TIMER_POWER_ON_FLAG = 0x2, + /** + * The power controller can power on AP from off state after timeout + * specified in VehicleApPowerSet VEHICLE_AP_POWER_SET_SHUTDOWN_READY message. + */ + CONFIG_SUPPORT_TIMER_POWER_ON_FLAG = 0x2, }; enum VehicleApPowerState : int32_t /* NOTE: type is guessed */ { - /** vehicle HAL will never publish this state to AP */ - OFF = 0, + /** vehicle HAL will never publish this state to AP */ + OFF = 0, - /** vehicle HAL will never publish this state to AP */ - DEEP_SLEEP = 1, + /** vehicle HAL will never publish this state to AP */ + DEEP_SLEEP = 1, - /** AP is on but display must be off. */ - ON_DISP_OFF = 2, + /** AP is on but display must be off. */ + ON_DISP_OFF = 2, - /** AP is on with display on. This state allows full user interaction. */ - ON_FULL = 3, + /** AP is on with display on. This state allows full user interaction. */ + ON_FULL = 3, - /** - * The power controller has requested AP to shutdown. AP can either enter - * sleep state or start full shutdown. AP can also request postponing - * shutdown by sending VehicleApPowerSetState#SHUTDOWN_POSTPONE message. The - * power controller must change power state to this state to shutdown - * system. - * - * int32Values[1] : one of enum_vehicle_ap_power_state_shutdown_param_type - */ - SHUTDOWN_PREPARE = 4, + /** + * The power controller has requested AP to shutdown. AP can either enter + * sleep state or start full shutdown. AP can also request postponing + * shutdown by sending VehicleApPowerSetState#SHUTDOWN_POSTPONE message. The + * power controller must change power state to this state to shutdown + * system. + * + * int32Values[1] : one of enum_vehicle_ap_power_state_shutdown_param_type + */ + SHUTDOWN_PREPARE = 4, }; enum VehicleApPowerStateShutdownParam : int32_t { - /** AP must shutdown immediately. Postponing is not allowed. */ - SHUTDOWN_IMMEDIATELY = 1, + /** AP must shutdown immediately. Postponing is not allowed. */ + SHUTDOWN_IMMEDIATELY = 1, - /** AP can enter deep sleep instead of shutting down completely. */ - CAN_SLEEP = 2, + /** AP can enter deep sleep instead of shutting down completely. */ + CAN_SLEEP = 2, - /** AP can only shutdown with postponing allowed. */ - SHUTDOWN_ONLY = 3, + /** AP can only shutdown with postponing allowed. */ + SHUTDOWN_ONLY = 3, }; enum VehicleApPowerSetState : int32_t /* NOTE: type is guessed */ { - /** - * AP has finished boot up, and can start shutdown if requested by power - * controller. - */ - BOOT_COMPLETE = 0x1, + /** + * AP has finished boot up, and can start shutdown if requested by power + * controller. + */ + BOOT_COMPLETE = 0x1, - /** - * AP is entering deep sleep state. How this state is implemented may vary - * depending on each H/W, but AP's power must be kept in this state. - */ - DEEP_SLEEP_ENTRY = 0x2, + /** + * AP is entering deep sleep state. How this state is implemented may vary + * depending on each H/W, but AP's power must be kept in this state. + */ + DEEP_SLEEP_ENTRY = 0x2, - /** - * AP is exiting from deep sleep state, and is in - * VehicleApPowerState#SHUTDOWN_PREPARE state. - * The power controller may change state to other ON states based on the - * current state. - */ - DEEP_SLEEP_EXIT = 0x3, + /** + * AP is exiting from deep sleep state, and is in + * VehicleApPowerState#SHUTDOWN_PREPARE state. + * The power controller may change state to other ON states based on the + * current state. + */ + DEEP_SLEEP_EXIT = 0x3, - /** - * int32Values[1]: Time to postpone shutdown in ms. Maximum value can be - * 5000 ms. - * If AP needs more time, it will send another POSTPONE - * message before the previous one expires. - */ - SHUTDOWN_POSTPONE = 0x4, + /** + * int32Values[1]: Time to postpone shutdown in ms. Maximum value can be + * 5000 ms. + * If AP needs more time, it will send another POSTPONE + * message before the previous one expires. + */ + SHUTDOWN_POSTPONE = 0x4, - /** - * AP is starting shutting down. When system completes shutdown, everything - * will stop in AP as kernel will stop all other contexts. It is - * responsibility of vehicle HAL or lower level to synchronize that state - * with external power controller. As an example, some kind of ping - * with timeout in power controller can be a solution. - * - * int32Values[1]: Time to turn on AP in secs. Power controller may turn on - * AP after specified time so that AP can run tasks like - * update. If it is set to 0, there is no wake up, and power - * controller may not necessarily support wake-up. If power - * controller turns on AP due to timer, it must start with - * VehicleApPowerState#ON_DISP_OFF state, and after - * receiving VehicleApPowerSetState#BOOT_COMPLETE, it shall - * do state transition to - * VehicleApPowerState#SHUTDOWN_PREPARE. - */ - SHUTDOWN_START = 0x5, + /** + * AP is starting shutting down. When system completes shutdown, everything + * will stop in AP as kernel will stop all other contexts. It is + * responsibility of vehicle HAL or lower level to synchronize that state + * with external power controller. As an example, some kind of ping + * with timeout in power controller can be a solution. + * + * int32Values[1]: Time to turn on AP in secs. Power controller may turn on + * AP after specified time so that AP can run tasks like + * update. If it is set to 0, there is no wake up, and power + * controller may not necessarily support wake-up. If power + * controller turns on AP due to timer, it must start with + * VehicleApPowerState#ON_DISP_OFF state, and after + * receiving VehicleApPowerSetState#BOOT_COMPLETE, it shall + * do state transition to + * VehicleApPowerState#SHUTDOWN_PREPARE. + */ + SHUTDOWN_START = 0x5, - /** - * User has requested to turn off headunit's display, which is detected in - * android side. - * The power controller may change the power state to - * VehicleApPowerState#ON_DISP_OFF. - */ - DISPLAY_OFF = 0x6, + /** + * User has requested to turn off headunit's display, which is detected in + * android side. + * The power controller may change the power state to + * VehicleApPowerState#ON_DISP_OFF. + */ + DISPLAY_OFF = 0x6, - /** - * User has requested to turn on headunit's display, most probably from power - * key input which is attached to headunit. The power controller may change - * the power state to VehicleApPowerState#ON_FULL. - */ - DISPLAY_ON = 0x7, + /** + * User has requested to turn on headunit's display, most probably from power + * key input which is attached to headunit. The power controller may change + * the power state to VehicleApPowerState#ON_FULL. + */ + DISPLAY_ON = 0x7, }; /** * Index in int32Values for VehicleProperty#AP_POWER_STATE property. */ enum VehicleApPowerStateIndex : int32_t { - STATE = 0, - ADDITIONAL = 1, + STATE = 0, + ADDITIONAL = 1, }; /** * Enum to represent bootup reason. */ enum VehicleApPowerBootupReason : int32_t { - /** - * Power on due to user's pressing of power key or rotating of ignition - * switch. - */ - USER_POWER_ON = 0, + /** + * Power on due to user's pressing of power key or rotating of ignition + * switch. + */ + USER_POWER_ON = 0, - /** - * Automatic power on triggered by door unlock or any other kind of automatic - * user detection. - */ - USER_UNLOCK = 1, + /** + * Automatic power on triggered by door unlock or any other kind of automatic + * user detection. + */ + USER_UNLOCK = 1, - /** - * Automatic power on triggered by timer. This only happens when AP has asked - * wake-up after - * certain time through time specified in - * VehicleApPowerSetState#SHUTDOWN_START. - */ - TIMER = 2, + /** + * Automatic power on triggered by timer. This only happens when AP has asked + * wake-up after + * certain time through time specified in + * VehicleApPowerSetState#SHUTDOWN_START. + */ + TIMER = 2, }; enum VehicleHwKeyInputAction : int32_t { - /** Key down */ - ACTION_DOWN = 0, + /** Key down */ + ACTION_DOWN = 0, - /** Key up */ - ACTION_UP = 1, + /** Key up */ + ACTION_UP = 1, }; enum VehicleDisplay : int32_t { - /** center console */ - MAIN = 0, + /** center console */ + MAIN = 0, - INSTRUMENT_CLUSTER = 1, + INSTRUMENT_CLUSTER = 1, }; /** @@ -2312,11 +2559,11 @@ enum VehiclePropertyChangeMode : int32_t { * the expected output. */ enum VehiclePropertyAccess : int32_t { - NONE = 0x00, + NONE = 0x00, - READ = 0x01, - WRITE = 0x02, - READ_WRITE = 0x03, + READ = 0x01, + WRITE = 0x02, + READ_WRITE = 0x03, }; /** @@ -2325,32 +2572,32 @@ enum VehiclePropertyAccess : int32_t { * The driving states determine what features of the UI will be accessible. */ enum VehicleDrivingStatus : int32_t { - UNRESTRICTED = 0x00, - NO_VIDEO = 0x01, - NO_KEYBOARD_INPUT = 0x02, - NO_VOICE_INPUT = 0x04, - NO_CONFIG = 0x08, - LIMIT_MESSAGE_LEN = 0x10, + UNRESTRICTED = 0x00, + NO_VIDEO = 0x01, + NO_KEYBOARD_INPUT = 0x02, + NO_VOICE_INPUT = 0x04, + NO_CONFIG = 0x08, + LIMIT_MESSAGE_LEN = 0x10, }; /** * Various gears which can be selected by user and chosen in system. */ enum VehicleGear: int32_t { - GEAR_NEUTRAL = 0x0001, - GEAR_REVERSE = 0x0002, - GEAR_PARK = 0x0004, - GEAR_DRIVE = 0x0008, - GEAR_LOW = 0x0010, - GEAR_1 = 0x0010, - GEAR_2 = 0x0020, - GEAR_3 = 0x0040, - GEAR_4 = 0x0080, - GEAR_5 = 0x0100, - GEAR_6 = 0x0200, - GEAR_7 = 0x0400, - GEAR_8 = 0x0800, - GEAR_9 = 0x1000, + GEAR_NEUTRAL = 0x0001, + GEAR_REVERSE = 0x0002, + GEAR_PARK = 0x0004, + GEAR_DRIVE = 0x0008, + GEAR_LOW = 0x0010, + GEAR_1 = 0x0010, + GEAR_2 = 0x0020, + GEAR_3 = 0x0040, + GEAR_4 = 0x0080, + GEAR_5 = 0x0100, + GEAR_6 = 0x0200, + GEAR_7 = 0x0400, + GEAR_8 = 0x0800, + GEAR_9 = 0x1000, }; /** @@ -2610,73 +2857,73 @@ enum VehiclePropertyOperation : int32_t { enum SubscribeFlags : int32_t { - UNDEFINED = 0x0, + UNDEFINED = 0x0, - /** - * Subscribe to event that was originated in vehicle HAL - * (most likely this event came from the vehicle itself). - */ - HAL_EVENT = 0x1, + /** + * Subscribe to event that was originated in vehicle HAL + * (most likely this event came from the vehicle itself). + */ + HAL_EVENT = 0x1, - /** - * Use this flag to subscribe on events when IVehicle#set(...) was called by - * vehicle HAL's client (e.g. Car Service). - */ - SET_CALL = 0x2, + /** + * Use this flag to subscribe on events when IVehicle#set(...) was called by + * vehicle HAL's client (e.g. Car Service). + */ + SET_CALL = 0x2, - DEFAULT = HAL_EVENT, + DEFAULT = HAL_EVENT, }; /** * Encapsulates information about subscription to vehicle property events. */ struct SubscribeOptions { - /** Property to subscribe */ - int32_t propId; + /** Property to subscribe */ + int32_t propId; - /** - * Area ids - this must be a bit mask of areas to subscribe or 0 to subscribe - * to all areas. - */ - int32_t vehicleAreas; + /** + * Area ids - this must be a bit mask of areas to subscribe or 0 to subscribe + * to all areas. + */ + int32_t vehicleAreas; - /** - * Sample rate in Hz. - * - * Must be provided for properties with - * VehiclePropertyChangeMode::CONTINUOUS. The value must be within - * VehiclePropConfig#minSamplingRate .. VehiclePropConfig#maxSamplingRate - * for a given property. - * This value indicates how many updates per second client wants to receive. - */ - float sampleRate; + /** + * Sample rate in Hz. + * + * Must be provided for properties with + * VehiclePropertyChangeMode::CONTINUOUS. The value must be within + * VehiclePropConfig#minSamplingRate .. VehiclePropConfig#maxSamplingRate + * for a given property. + * This value indicates how many updates per second client wants to receive. + */ + float sampleRate; - /** Flags that indicate what kind of events listen to. */ - SubscribeFlags flags; + /** Flags that indicate what kind of events listen to. */ + SubscribeFlags flags; }; /** Error codes used in vehicle HAL interface. */ enum StatusCode : int32_t { - OK = 0, + OK = 0, - /** Try again. */ - TRY_AGAIN = 1, + /** Try again. */ + TRY_AGAIN = 1, - /** Invalid argument provided. */ - INVALID_ARG = 2, + /** Invalid argument provided. */ + INVALID_ARG = 2, - /** - * This code must be returned when device that associated with the vehicle - * property is not available. For example, when client tries to set HVAC - * temperature when the whole HVAC unit is turned OFF. - */ - NOT_AVAILABLE = 3, + /** + * This code must be returned when device that associated with the vehicle + * property is not available. For example, when client tries to set HVAC + * temperature when the whole HVAC unit is turned OFF. + */ + NOT_AVAILABLE = 3, - /** Access denied */ - ACCESS_DENIED = 4, + /** Access denied */ + ACCESS_DENIED = 4, - /** Something unexpected has happened in Vehicle HAL */ - INTERNAL_ERROR = 5, + /** Something unexpected has happened in Vehicle HAL */ + INTERNAL_ERROR = 5, }; enum Wheel : int32_t { @@ -2687,3 +2934,460 @@ enum Wheel : int32_t { LEFT_REAR = 0x4, RIGHT_REAR = 0x8, }; + +/** + * The status of the vehicle's fuel system. + * These values come from the SAE J1979 standard. + */ +enum Obd2FuelSystemStatus : int32_t { + OPEN_INSUFFICIENT_ENGINE_TEMPERATURE = 1, + CLOSED_LOOP = 2, + OPEN_ENGINE_LOAD_OR_DECELERATION = 4, + OPEN_SYSTEM_FAILURE = 8, + CLOSED_LOOP_BUT_FEEDBACK_FAULT = 16, +}; + +/** Defines which ignition monitors are available to be read. */ +enum Obd2IgnitionMonitorKind : int32_t { + SPARK = 0, + COMPRESSION = 1, +}; + +/** + * Ignition monitors common to both SPARK and COMPRESSION. + * These values come from the SAE J1979 standard. + */ +enum Obd2CommonIgnitionMonitors : int32_t { + COMPONENTS_AVAILABLE = 0x1 << 0, + COMPONENTS_INCOMPLETE = 0x1 << 1, + + FUEL_SYSTEM_AVAILABLE = 0x1 << 2, + FUEL_SYSTEM_INCOMPLETE = 0x1 << 3, + + MISFIRE_AVAILABLE = 0x1 << 4, + MISFIRE_INCOMPLETE = 0x1 << 5, +}; + +/** + * Ignition monitors available for SPARK vehicles. + * These values come from the SAE J1979 standard. + */ +enum Obd2SparkIgnitionMonitors : Obd2CommonIgnitionMonitors { + EGR_AVAILABLE = 0x1 << 6, + EGR_INCOMPLETE = 0x1 << 7, + + OXYGEN_SENSOR_HEATER_AVAILABLE = 0x1 << 8, + OXYGEN_SENSOR_HEATER_INCOMPLETE = 0x1 << 9, + + OXYGEN_SENSOR_AVAILABLE = 0x1 << 10, + OXYGEN_SENSOR_INCOMPLETE = 0x1 << 11, + + AC_REFRIGERANT_AVAILABLE = 0x1 << 12, + AC_REFRIGERANT_INCOMPLETE = 0x1 << 13, + + SECONDARY_AIR_SYSTEM_AVAILABLE = 0x1 << 14, + SECONDARY_AIR_SYSTEM_INCOMPLETE = 0x1 << 15, + + EVAPORATIVE_SYSTEM_AVAILABLE = 0x1 << 16, + EVAPORATIVE_SYSTEM_INCOMPLETE = 0x1 << 17, + + HEATED_CATALYST_AVAILABLE = 0x1 << 18, + HEATED_CATALYST_INCOMPLETE = 0x1 << 19, + + CATALYST_AVAILABLE = 0x1 << 20, + CATALYST_INCOMPLETE = 0x1 << 21, +}; + +/** + * Ignition monitors only available for COMPRESSION vehicles. + * These values come from the SAE J1979 standard. + */ +enum Obd2CompressionIgnitionMonitors : Obd2CommonIgnitionMonitors { + EGR_OR_VVT_AVAILABLE = 0x1 << 6, + EGR_OR_VVT_INCOMPLETE = 0x1 << 7, + + PM_FILTER_AVAILABLE = 0x1 << 8, + PM_FILTER_INCOMPLETE = 0x1 << 9, + + EXHAUST_GAS_SENSOR_AVAILABLE = 0x1 << 10, + EXHAUST_GAS_SENSOR_INCOMPLETE = 0x1 << 11, + + BOOST_PRESSURE_AVAILABLE = 0x1 << 12, + BOOST_PRESSURE_INCOMPLETE = 0x1 << 13, + + NOx_SCR_AVAILABLE = 0x1 << 14, + NOx_SCR_INCOMPLETE = 0x1 << 15, + + NMHC_CATALYST_AVAILABLE = 0x1 << 16, + NMHC_CATALYST_INCOMPLETE = 0x1 << 17, +}; + +/** + * The status of the vehicle's secondary air system. + * These values come from the SAE J1979 standard. + */ +enum Obd2SecondaryAirStatus : int32_t { + UPSTREAM = 1, + DOWNSTREAM_OF_CATALYCIC_CONVERTER = 2, + FROM_OUTSIDE_OR_OFF = 4, + PUMP_ON_FOR_DIAGNOSTICS = 8, +}; + +/** + * The fuel type(s) supported by a vehicle. + * These values come from the SAE J1979 standard. + */ +enum Obd2FuelType : int32_t { + NOT_AVAILABLE = 0, + GASOLINE = 1, + METHANOL = 2, + ETHANOL = 3, + DIESEL = 4, + LPG = 5, + CNG = 6, + PROPANE = 7, + ELECTRIC = 8, + BIFUEL_RUNNING_GASOLINE = 9, + BIFUEL_RUNNING_METHANOL = 10, + BIFUEL_RUNNING_ETHANOL = 11, + BIFUEL_RUNNING_LPG = 12, + BIFUEL_RUNNING_CNG = 13, + BIFUEL_RUNNING_PROPANE = 14, + BIFUEL_RUNNING_ELECTRIC = 15, + BIFUEL_RUNNING_ELECTRIC_AND_COMBUSTION = 16, + HYBRID_GASOLINE = 17, + HYBRID_ETHANOL = 18, + HYBRID_DIESEL = 19, + HYBRID_ELECTRIC = 20, + HYBRID_RUNNING_ELECTRIC_AND_COMBUSTION = 21, + HYBRID_REGENERATIVE = 22, + BIFUEL_RUNNING_DIESEL = 23, +}; + +/** + * This enum provides the canonical mapping for sensor properties that have an integer value. + * The ordering of the values is taken from the OBD2 specification. + * Some of the properties are represented as an integer mapping to another enum. In those cases + * expect a comment by the property definition describing the enum to look at for the mapping. + * Any value greater than the last reserved index is available to vendors to map their extensions. + * While these values do not directly map to SAE J1979 PIDs, an equivalence is listed next + * to each one to aid implementors. + */ +enum DiagnosticIntegerSensorIndex : int32_t { + /** refer to FuelSystemStatus for a description of this value. */ + FUEL_SYSTEM_STATUS = 0, /* PID 0x03 */ + MALFUNCTION_INDICATOR_LIGHT_ON = 1, /* PID 0x01 */ + + /** refer to IgnitionMonitorKind for a description of this value. */ + IGNITION_MONITORS_SUPPORTED = 2, /* PID 0x01 */ + + /** + * The value of this sensor is a bitmask that specifies whether ignition-specific + * tests are available and whether they are complete. The semantics of the individual + * bits in this value are given by, respectively, SparkIgnitionMonitors and + * CompressionIgnitionMonitors depending on the value of IGNITION_MONITORS_SUPPORTED. + */ + IGNITION_SPECIFIC_MONITORS = 3, /* PID 0x01 */ + INTAKE_AIR_TEMPERATURE = 4, /* PID 0x0F */ + + /** refer to SecondaryAirStatus for a description of this value. */ + COMMANDED_SECONDARY_AIR_STATUS = 5, /* PID 0x12 */ + NUM_OXYGEN_SENSORS_PRESENT = 6, /* PID 0x13 */ + RUNTIME_SINCE_ENGINE_START = 7, /* PID 0x1F */ + DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON = 8, /* PID 0x21 */ + WARMUPS_SINCE_CODES_CLEARED = 9, /* PID 0x30 */ + DISTANCE_TRAVELED_SINCE_CODES_CLEARED = 10, /* PID 0x31 */ + ABSOLUTE_BAROMETRIC_PRESSURE = 11, /* PID 0x33 */ + CONTROL_MODULE_VOLTAGE = 12, /* PID 0x42 */ + AMBIENT_AIR_TEMPERATURE = 13, /* PID 0x46 */ + TIME_WITH_MALFUNCTION_LIGHT_ON = 14, /* PID 0x4D */ + TIME_SINCE_TROUBLE_CODES_CLEARED = 15, /* PID 0x4E */ + MAX_FUEL_AIR_EQUIVALENCE_RATIO = 16, /* PID 0x4F */ + MAX_OXYGEN_SENSOR_VOLTAGE = 17, /* PID 0x4F */ + MAX_OXYGEN_SENSOR_CURRENT = 18, /* PID 0x4F */ + MAX_INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 19, /* PID 0x4F */ + MAX_AIR_FLOW_RATE_FROM_MASS_AIR_FLOW_SENSOR = 20, /* PID 0x50 */ + + /** refer to FuelType for a description of this value. */ + FUEL_TYPE = 21, /* PID 0x51 */ + FUEL_RAIL_ABSOLUTE_PRESSURE = 22, /* PID 0x59 */ + ENGINE_OIL_TEMPERATURE = 23, /* PID 0x5C */ + DRIVER_DEMAND_PERCENT_TORQUE = 24, /* PID 0x61 */ + ENGINE_ACTUAL_PERCENT_TORQUE = 25, /* PID 0x62 */ + ENGINE_REFERENCE_PERCENT_TORQUE = 26, /* PID 0x63 */ + ENGINE_PERCENT_TORQUE_DATA_IDLE = 27, /* PID 0x64 */ + ENGINE_PERCENT_TORQUE_DATA_POINT1 = 28, /* PID 0x64 */ + ENGINE_PERCENT_TORQUE_DATA_POINT2 = 29, /* PID 0x64 */ + ENGINE_PERCENT_TORQUE_DATA_POINT3 = 30, /* PID 0x64 */ + ENGINE_PERCENT_TORQUE_DATA_POINT4 = 31, /* PID 0x64 */ + LAST_SYSTEM_INDEX = ENGINE_PERCENT_TORQUE_DATA_POINT4, +}; + +/** + * This enum provides the canonical mapping for sensor properties that have a floating-point value. + * The ordering of the values is taken from the OBD2 specification. + * Any value greater than the last reserved index is available to vendors to map their extensions. + * While these values do not directly map to SAE J1979 PIDs, an equivalence is listed next + * to each one to aid implementors. + */ +enum DiagnosticFloatSensorIndex : int32_t { + CALCULATED_ENGINE_LOAD = 0, /* PID 0x04 */ + ENGINE_COOLANT_TEMPERATURE = 1, /* PID 0x05 */ + SHORT_TERM_FUEL_TRIM_BANK1 = 2, /* PID 0x06 */ + LONG_TERM_FUEL_TRIM_BANK1 = 3, /* PID 0x07 */ + SHORT_TERM_FUEL_TRIM_BANK2 = 4, /* PID 0x08 */ + LONG_TERM_FUEL_TRIM_BANK2 = 5, /* PID 0x09 */ + FUEL_PRESSURE = 6, /* PID 0x0A */ + INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 7, /* PID 0x0B */ + ENGINE_RPM = 8, /* PID 0x0C */ + VEHICLE_SPEED = 9, /* PID 0x0D */ + TIMING_ADVANCE = 10, /* PID 0x0E */ + MAF_AIR_FLOW_RATE = 11, /* PID 0x10 */ + THROTTLE_POSITION = 12, /* PID 0x11 */ + OXYGEN_SENSOR1_VOLTAGE = 13, /* PID 0x14 */ + OXYGEN_SENSOR1_SHORT_TERM_FUEL_TRIM = 14, /* PID 0x14 */ + OXYGEN_SENSOR1_FUEL_AIR_EQUIVALENCE_RATIO = 15, /* PID 0x24 */ + OXYGEN_SENSOR2_VOLTAGE = 16, /* PID 0x15 */ + OXYGEN_SENSOR2_SHORT_TERM_FUEL_TRIM = 17, /* PID 0x15 */ + OXYGEN_SENSOR2_FUEL_AIR_EQUIVALENCE_RATIO = 18, /* PID 0x25 */ + OXYGEN_SENSOR3_VOLTAGE = 19, /* PID 0x16 */ + OXYGEN_SENSOR3_SHORT_TERM_FUEL_TRIM = 20, /* PID 0x16 */ + OXYGEN_SENSOR3_FUEL_AIR_EQUIVALENCE_RATIO = 21, /* PID 0x26 */ + OXYGEN_SENSOR4_VOLTAGE = 22, /* PID 0x17 */ + OXYGEN_SENSOR4_SHORT_TERM_FUEL_TRIM = 23, /* PID 0x17 */ + OXYGEN_SENSOR4_FUEL_AIR_EQUIVALENCE_RATIO = 24, /* PID 0x27 */ + OXYGEN_SENSOR5_VOLTAGE = 25, /* PID 0x18 */ + OXYGEN_SENSOR5_SHORT_TERM_FUEL_TRIM = 26, /* PID 0x18 */ + OXYGEN_SENSOR5_FUEL_AIR_EQUIVALENCE_RATIO = 27, /* PID 0x28 */ + OXYGEN_SENSOR6_VOLTAGE = 28, /* PID 0x19 */ + OXYGEN_SENSOR6_SHORT_TERM_FUEL_TRIM = 29, /* PID 0x19 */ + OXYGEN_SENSOR6_FUEL_AIR_EQUIVALENCE_RATIO = 30, /* PID 0x29 */ + OXYGEN_SENSOR7_VOLTAGE = 31, /* PID 0x1A */ + OXYGEN_SENSOR7_SHORT_TERM_FUEL_TRIM = 32, /* PID 0x1A */ + OXYGEN_SENSOR7_FUEL_AIR_EQUIVALENCE_RATIO = 33, /* PID 0x2A */ + OXYGEN_SENSOR8_VOLTAGE = 34, /* PID 0x1B */ + OXYGEN_SENSOR8_SHORT_TERM_FUEL_TRIM = 35, /* PID 0x1B */ + OXYGEN_SENSOR8_FUEL_AIR_EQUIVALENCE_RATIO = 36, /* PID 0x2B */ + FUEL_RAIL_PRESSURE = 37, /* PID 0x22 */ + FUEL_RAIL_GAUGE_PRESSURE = 38, /* PID 0x23 */ + COMMANDED_EXHAUST_GAS_RECIRCULATION = 39, /* PID 0x2C */ + EXHAUST_GAS_RECIRCULATION_ERROR = 40, /* PID 0x2D */ + COMMANDED_EVAPORATIVE_PURGE = 41, /* PID 0x2E */ + FUEL_TANK_LEVEL_INPUT = 42, /* PID 0x2F */ + EVAPORATION_SYSTEM_VAPOR_PRESSURE = 43, /* PID 0x32 */ + CATALYST_TEMPERATURE_BANK1_SENSOR1 = 44, /* PID 0x3C */ + CATALYST_TEMPERATURE_BANK2_SENSOR1 = 45, /* PID 0x3D */ + CATALYST_TEMPERATURE_BANK1_SENSOR2 = 46, /* PID 0x3E */ + CATALYST_TEMPERATURE_BANK2_SENSOR2 = 47, /* PID 0x3F */ + ABSOLUTE_LOAD_VALUE = 48, /* PID 0x43 */ + FUEL_AIR_COMMANDED_EQUIVALENCE_RATIO = 49, /* PID 0x44 */ + RELATIVE_THROTTLE_POSITION = 50, /* PID 0x45 */ + ABSOLUTE_THROTTLE_POSITION_B = 51, /* PID 0x47 */ + ABSOLUTE_THROTTLE_POSITION_C = 52, /* PID 0x48 */ + ACCELERATOR_PEDAL_POSITION_D = 53, /* PID 0x49 */ + ACCELERATOR_PEDAL_POSITION_E = 54, /* PID 0x4A */ + ACCELERATOR_PEDAL_POSITION_F = 55, /* PID 0x4B */ + COMMANDED_THROTTLE_ACTUATOR = 56, /* PID 0x4C */ + ETHANOL_FUEL_PERCENTAGE = 57,/* PID 0x52 */ + ABSOLUTE_EVAPORATION_SYSTEM_VAPOR_PRESSURE = 58, /* PID 0x53 */ + SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK1 = 59, /* PID 0x55 */ + SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK2 = 60, /* PID 0x57 */ + SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK3 = 61,/* PID 0x55 */ + SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK4 = 62, /* PID 0x57 */ + LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK1 = 63, /* PID 0x56 */ + LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK2 = 64, /* PID 0x58 */ + LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK3 = 65, /* PID 0x56 */ + LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK4 = 66, /* PID 0x58 */ + RELATIVE_ACCELERATOR_PEDAL_POSITION = 67, /* PID 0x5A */ + HYBRID_BATTERY_PACK_REMAINING_LIFE = 68, /* PID 0x5B */ + FUEL_INJECTION_TIMING = 69, /* PID 0x5D */ + ENGINE_FUEL_RATE = 70, /* PID 0x5E */ + LAST_SYSTEM_INDEX = ENGINE_FUEL_RATE, +}; + +/** + * This enum lists the types of supported VMS messages. It is used as the first + * integer in the vehicle property integers array and determines how the rest of + * the message is decoded. + */ +enum VmsMessageType : int32_t { + /** + * A request from the subscribers to the VMS service to subscribe to a layer. + * + * This message type uses enum VmsMessageWithLayerIntegerValuesIndex. + */ + SUBSCRIBE = 1, + + /** + * A request from the subscribers to the VMS service to subscribe to a layer from a specific publisher. + * + * This message type uses enum VmsMessageWithLayerAndPublisherIdIntegerValuesIndex. + */ + SUBSCRIBE_TO_PUBLISHER = 2, + + /** + * A request from the subscribers to the VMS service to unsubscribes from a layer. + * + * This message type uses enum VmsMessageWithLayerIntegerValuesIndex. + */ + UNSUBSCRIBE = 3, + + /** + * A request from the subscribers to the VMS service to unsubscribes from a layer from a specific publisher. + * + * This message type uses enum VmsMessageWithLayerAndPublisherIdIntegerValuesIndex. + */ + UNSUBSCRIBE_TO_PUBLISHER = 4, + + /** + * Information from the publishers to the VMS service about the layers which the client can publish. + * + * This message type uses enum VmsOfferingMessageIntegerValuesIndex. + */ + OFFERING = 5, + + /** + * A request from the subscribers to the VMS service to get the available layers. + * + * This message type uses enum VmsBaseMessageIntegerValuesIndex. + */ + AVAILABILITY_REQUEST = 6, + + /** + * A request from the publishers to the VMS service to get the layers with subscribers. + * + * This message type uses enum VmsBaseMessageIntegerValuesIndex. + */ + SUBSCRIPTIONS_REQUEST = 7, + + /** + * A response from the VMS service to the subscribers to a VmsMessageType.AVAILABILITY_REQUEST + * + * This message type uses enum VmsAvailabilityStateIntegerValuesIndex. + */ + AVAILABILITY_RESPONSE = 8, + + /** + * A notification from the VMS service to the subscribers on a change in the available layers. + * + * This message type uses enum VmsAvailabilityStateIntegerValuesIndex. + */ + AVAILABILITY_CHANGE = 9, + + /** + * A response from the VMS service to the publishers to a VmsMessageType.SUBSCRIPTIONS_REQUEST + * + * This message type uses enum VmsSubscriptionsStateIntegerValuesIndex. + */ + SUBSCRIPTIONS_RESPONSE = 10, + + /** + * A notification from the VMS service to the publishers on a change in the layers with subscribers. + * + * This message type uses enum VmsSubscriptionsStateIntegerValuesIndex. + */ + SUBSCRIPTIONS_CHANGE = 11, + + /** + * A message from the VMS service to the subscribers or from the publishers to the VMS service + * with a serialized VMS data packet as defined in the VMS protocol. + * + * This message type uses enum VmsBaseMessageIntegerValuesIndex. + */ + DATA = 12, +}; + +/** + * Every VMS message starts with the type of the message from the VmsMessageType enum. + * Messages with no parameters such as VmsMessageType.AVAILABILITY_REQUEST, + * VmsMessageType.SUBSCRIPTIONS_REQUEST and VmsMessageType.DATA are also based on this enum. + */ +enum VmsBaseMessageIntegerValuesIndex : int32_t { + /* The message type as enumerated by VmsMessageType enum. */ + MESSAGE_TYPE = 0, +}; + +/* + * A VMS message with a layer is sent as part of a VmsMessageType.SUBSCRIBE or + * VmsMessageType.UNSUBSCRIBE messages. + * + * The layer type is defined in the VMS protocol, and the subtype and version are + * controlled by the implementer of the publisher. + */ +enum VmsMessageWithLayerIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { + LAYER_TYPE = 1, + LAYER_SUBTYPE = 2, + LAYER_VERSION = 3, +}; + +/* + * A VMS message with a layer and publisher ID is sent as part of a + * VmsMessageType.SUBSCRIBE_TO_PUBLISHER and VmsMessageType.UNSUBSCRIBE_TO_PUBLISHER messages. + */ +enum VmsMessageWithLayerAndPublisherIdIntegerValuesIndex : VmsMessageWithLayerIntegerValuesIndex { + PUBLISHER_ID = 4, +}; + +/* + * An offering can be sent by publishers as part of VmsMessageType.OFFERING in order to + * advertise which layers they can publish and under which constraints: e.g., I can publish Layer X + * if someone else will publish Layer Y. + * The offering contains the publisher ID which was assigned to the publisher by the VMS service. + * A single offering is represented as: + * - Layer type + * - Layer subtype + * - Layer version + * - Number of dependencies (N) + * - N x (Layer type, Layer subtype, Layer version) + */ +enum VmsOfferingMessageIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { + PUBLISHER_ID = 1, + NUMBER_OF_OFFERS = 2, + OFFERING_START = 3, +}; + +/** + * A subscriptions state is sent to the publishers in response to a change in the subscriptions + * as part of a VmsMessageType.SUBSCRIPTIONS_CHANGE, or in response to a + * VmsMessageType.SUBSCRIPTIONS_REQUEST message as part of VmsMessageType.SUBSCRIPTIONS_RESPONSE. + * The VMS service issues monotonically increasing sequence numbers, and in case a subscriber receives + * a smaller sequnce number it should ignore the message. + * The subscriptions are sent as a list of layers followed by a list of associated layers: + * {Sequence number, N, M, N x layer, M x associated layer} + * A subscribed layer is represented as three integers: + * - Layer type + * - Layer subtype + * - Layer version + * A subscribed associated layer is a layer with a list of publisher IDs. It is represented as: + * - Layer type + * - Layer subtype + * - Layer version + * - Number of publisher IDs (N) + * - N x publisher ID + */ +enum VmsSubscriptionsStateIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { + SEQUENCE_NUMBER = 1, + NUMBER_OF_LAYERS = 2, + NUMBER_OF_ASSOCIATED_LAYERS = 3, + SUBSCRIPTIONS_START = 4, +}; + +/** + * An availability state is sent to the subscribers in response to a change in the available + * layers as part of a VmsMessageType.AVAILABILITY_CHANGE message, or in response to a + * VmsMessageType.AVAILABILITY_REQUEST message as part of a VmsMessageType.AVAILABILITY_RESPONSE. + * The VMS service issues monotonically increasing sequence numbers, and in case a subscriber receives + * a smaller sequnce number, it should ignore the message. + * An available associated layer is a layer with a list of publisher IDs: + * - Layer type + * - Layer subtype + * - Layer version + * - Number of publisher IDs (N) + * - N x publisher ID +*/ +enum VmsAvailabilityStateIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { + SEQUENCE_NUMBER = 1, + NUMBER_OF_ASSOCIATED_LAYERS = 2, + LAYERS_START = 3, +}; + diff --git a/automotive/vehicle/2.1/Android.bp b/automotive/vehicle/2.1/Android.bp deleted file mode 100644 index 447c08e336..0000000000 --- a/automotive/vehicle/2.1/Android.bp +++ /dev/null @@ -1,68 +0,0 @@ -// This file is autogenerated by hidl-gen. Do not edit manually. - -filegroup { - name: "android.hardware.automotive.vehicle@2.1_hal", - srcs: [ - "types.hal", - "IVehicle.hal", - ], -} - -genrule { - name: "android.hardware.automotive.vehicle@2.1_genc++", - tools: ["hidl-gen"], - cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.automotive.vehicle@2.1", - srcs: [ - ":android.hardware.automotive.vehicle@2.1_hal", - ], - out: [ - "android/hardware/automotive/vehicle/2.1/types.cpp", - "android/hardware/automotive/vehicle/2.1/VehicleAll.cpp", - ], -} - -genrule { - name: "android.hardware.automotive.vehicle@2.1_genc++_headers", - tools: ["hidl-gen"], - cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.automotive.vehicle@2.1", - srcs: [ - ":android.hardware.automotive.vehicle@2.1_hal", - ], - out: [ - "android/hardware/automotive/vehicle/2.1/types.h", - "android/hardware/automotive/vehicle/2.1/hwtypes.h", - "android/hardware/automotive/vehicle/2.1/IVehicle.h", - "android/hardware/automotive/vehicle/2.1/IHwVehicle.h", - "android/hardware/automotive/vehicle/2.1/BnHwVehicle.h", - "android/hardware/automotive/vehicle/2.1/BpHwVehicle.h", - "android/hardware/automotive/vehicle/2.1/BsVehicle.h", - ], -} - -cc_library { - name: "android.hardware.automotive.vehicle@2.1", - defaults: ["hidl-module-defaults"], - generated_sources: ["android.hardware.automotive.vehicle@2.1_genc++"], - generated_headers: ["android.hardware.automotive.vehicle@2.1_genc++_headers"], - export_generated_headers: ["android.hardware.automotive.vehicle@2.1_genc++_headers"], - vendor_available: true, - vndk: { - enabled: true, - }, - shared_libs: [ - "libhidlbase", - "libhidltransport", - "libhwbinder", - "liblog", - "libutils", - "libcutils", - "android.hardware.automotive.vehicle@2.0", - ], - export_shared_lib_headers: [ - "libhidlbase", - "libhidltransport", - "libhwbinder", - "libutils", - "android.hardware.automotive.vehicle@2.0", - ], -} diff --git a/automotive/vehicle/2.1/Android.mk b/automotive/vehicle/2.1/Android.mk deleted file mode 100644 index 3001da05c4..0000000000 --- a/automotive/vehicle/2.1/Android.mk +++ /dev/null @@ -1,724 +0,0 @@ -# This file is autogenerated by hidl-gen. Do not edit manually. - -LOCAL_PATH := $(call my-dir) - -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.automotive.vehicle-V2.1-java -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_JAVA_LIBRARIES := \ - android.hardware.automotive.vehicle-V2.0-java \ - android.hidl.base-V1.0-java \ - - -# -# Build types.hal (DiagnosticFloatSensorIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/DiagnosticFloatSensorIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.DiagnosticFloatSensorIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DiagnosticIntegerSensorIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/DiagnosticIntegerSensorIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.DiagnosticIntegerSensorIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2CommonIgnitionMonitors) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2CommonIgnitionMonitors.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2CommonIgnitionMonitors - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2CompressionIgnitionMonitors) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2CompressionIgnitionMonitors.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2CompressionIgnitionMonitors - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2FuelSystemStatus) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2FuelSystemStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2FuelSystemStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2FuelType) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2FuelType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2FuelType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2IgnitionMonitorKind) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2IgnitionMonitorKind.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2IgnitionMonitorKind - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2SecondaryAirStatus) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2SecondaryAirStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2SecondaryAirStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2SparkIgnitionMonitors) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2SparkIgnitionMonitors.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2SparkIgnitionMonitors - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleProperty) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VehicleProperty.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VehicleProperty - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsAvailabilityStateIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsAvailabilityStateIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsAvailabilityStateIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsBaseMessageIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsBaseMessageIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsBaseMessageIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsMessageType) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsMessageType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsMessageWithLayerAndPublisherIdIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageWithLayerAndPublisherIdIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsMessageWithLayerAndPublisherIdIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsMessageWithLayerIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageWithLayerIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsMessageWithLayerIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsOfferingMessageIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsOfferingMessageIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsOfferingMessageIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsSubscriptionsStateIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsSubscriptionsStateIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsSubscriptionsStateIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IVehicle.hal -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/IVehicle.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVehicle.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::IVehicle - -$(GEN): $(LOCAL_PATH)/IVehicle.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_JAVA_LIBRARY) - - -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.automotive.vehicle-V2.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.automotive.vehicle-V2.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build types.hal (DiagnosticFloatSensorIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/DiagnosticFloatSensorIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.DiagnosticFloatSensorIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (DiagnosticIntegerSensorIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/DiagnosticIntegerSensorIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.DiagnosticIntegerSensorIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2CommonIgnitionMonitors) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2CommonIgnitionMonitors.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2CommonIgnitionMonitors - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2CompressionIgnitionMonitors) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2CompressionIgnitionMonitors.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2CompressionIgnitionMonitors - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2FuelSystemStatus) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2FuelSystemStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2FuelSystemStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2FuelType) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2FuelType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2FuelType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2IgnitionMonitorKind) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2IgnitionMonitorKind.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2IgnitionMonitorKind - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2SecondaryAirStatus) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2SecondaryAirStatus.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2SecondaryAirStatus - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (Obd2SparkIgnitionMonitors) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/Obd2SparkIgnitionMonitors.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.Obd2SparkIgnitionMonitors - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VehicleProperty) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VehicleProperty.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VehicleProperty - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsAvailabilityStateIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsAvailabilityStateIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsAvailabilityStateIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsBaseMessageIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsBaseMessageIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsBaseMessageIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsMessageType) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageType.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsMessageType - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsMessageWithLayerAndPublisherIdIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageWithLayerAndPublisherIdIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsMessageWithLayerAndPublisherIdIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsMessageWithLayerIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsMessageWithLayerIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsMessageWithLayerIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsOfferingMessageIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsOfferingMessageIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsOfferingMessageIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build types.hal (VmsSubscriptionsStateIntegerValuesIndex) -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/VmsSubscriptionsStateIntegerValuesIndex.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::types.VmsSubscriptionsStateIntegerValuesIndex - -$(GEN): $(LOCAL_PATH)/types.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) - -# -# Build IVehicle.hal -# -GEN := $(intermediates)/android/hardware/automotive/vehicle/V2_1/IVehicle.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IVehicle.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.automotive.vehicle@2.1::IVehicle - -$(GEN): $(LOCAL_PATH)/IVehicle.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - - -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/automotive/vehicle/2.1/IVehicle.hal b/automotive/vehicle/2.1/IVehicle.hal deleted file mode 100644 index a22d1e685c..0000000000 --- a/automotive/vehicle/2.1/IVehicle.hal +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.1 (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.1 - * - * 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.automotive.vehicle@2.1; - -import android.hardware.automotive.vehicle@2.0; - -/** - * New revision of IVehicle interface that supports properties defined in - * VehicleProperty enum version 2.1. - * - * NOTE: this HAL interface is under development and shouldn't be used in - * production. - * - * TODO(pavelm): update comment when this interface is ready for prod. - */ -interface IVehicle extends @2.0::IVehicle { -}; diff --git a/automotive/vehicle/2.1/default/Android.bp b/automotive/vehicle/2.1/default/Android.bp deleted file mode 100644 index f6743f261f..0000000000 --- a/automotive/vehicle/2.1/default/Android.bp +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (C) 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. - -cc_defaults { - name: "vhal_v2_1_defaults", - defaults: ["vhal_v2_0_defaults"], - shared_libs: [ - "libhwbinder", - "android.hardware.automotive.vehicle@2.1", - ], -} - -// Vehicle reference implementation lib -cc_library_static { - name: "android.hardware.automotive.vehicle@2.1-manager-lib", - vendor: true, - defaults: ["vhal_v2_1_defaults"], - srcs: [ - "common/src/Obd2SensorStore.cpp", - ], - local_include_dirs: ["common/include/vhal_v2_1"], - header_libs: ["vhal_v2_0_common_headers"], - export_include_dirs: ["common/include"], -} - -// Vehicle default VehicleHAL implementation -cc_library_static { - name: "android.hardware.automotive.vehicle@2.1-default-impl-lib", - vendor: true, - defaults: ["vhal_v2_1_defaults"], - srcs: [ - "impl/vhal_v2_1/EmulatedVehicleHal.cpp", - ], - local_include_dirs: [ - "impl/vhal_v2_1", - "common/include", - ], - export_include_dirs: [ - "impl", - "common/include", - ], - static_libs: [ - "android.hardware.automotive.vehicle@2.0-default-impl-lib", - "android.hardware.automotive.vehicle@2.0-libproto-native", - "android.hardware.automotive.vehicle@2.0-manager-lib", - "android.hardware.automotive.vehicle@2.1-manager-lib", - "libqemu_pipe", - ], - shared_libs: [ - "libbase", - "libprotobuf-cpp-lite", - ], -} - -cc_binary { - name: "android.hardware.automotive.vehicle@2.1-service", - defaults: ["vhal_v2_1_defaults"], - init_rc: ["android.hardware.automotive.vehicle@2.1-service.rc"], - vendor: true, - relative_install_path: "hw", - srcs: ["service.cpp"], - whole_static_libs: ["android.hardware.automotive.vehicle@2.0-libproto-native"], - static_libs: [ - "android.hardware.automotive.vehicle@2.0-default-impl-lib", - "android.hardware.automotive.vehicle@2.0-manager-lib", - "android.hardware.automotive.vehicle@2.1-default-impl-lib", - "android.hardware.automotive.vehicle@2.1-manager-lib", - "libqemu_pipe", - ], - shared_libs: [ - "libbase", - "libhwbinder", - "libprotobuf-cpp-lite", - ], -} diff --git a/automotive/vehicle/2.1/default/android.hardware.automotive.vehicle@2.1-service.rc b/automotive/vehicle/2.1/default/android.hardware.automotive.vehicle@2.1-service.rc deleted file mode 100644 index 8929d25668..0000000000 --- a/automotive/vehicle/2.1/default/android.hardware.automotive.vehicle@2.1-service.rc +++ /dev/null @@ -1,4 +0,0 @@ -service vehicle-hal-2.1 /vendor/bin/hw/android.hardware.automotive.vehicle@2.1-service - class hal - user vehicle_network - group system inet diff --git a/automotive/vehicle/2.1/default/impl/vhal_v2_1/DefaultConfig.h b/automotive/vehicle/2.1/default/impl/vhal_v2_1/DefaultConfig.h deleted file mode 100644 index 701317b1c9..0000000000 --- a/automotive/vehicle/2.1/default/impl/vhal_v2_1/DefaultConfig.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef android_hardware_automotive_vehicle_V2_1_impl_DefaultConfig_H_ -#define android_hardware_automotive_vehicle_V2_1_impl_DefaultConfig_H_ - -#include -#include - -namespace android { -namespace hardware { -namespace automotive { -namespace vehicle { -namespace V2_1 { - -namespace impl { - -// Some handy constants to avoid conversions from enum to int. -constexpr int ABS_ACTIVE = (int) V2_1::VehicleProperty::ABS_ACTIVE; -constexpr int OBD2_LIVE_FRAME = (int) V2_1::VehicleProperty::OBD2_LIVE_FRAME; -constexpr int OBD2_FREEZE_FRAME = (int) V2_1::VehicleProperty::OBD2_FREEZE_FRAME; -constexpr int OBD2_FREEZE_FRAME_INFO = (int) V2_1::VehicleProperty::OBD2_FREEZE_FRAME_INFO; -constexpr int OBD2_FREEZE_FRAME_CLEAR = (int) V2_1::VehicleProperty::OBD2_FREEZE_FRAME_CLEAR; -constexpr int TRACTION_CONTROL_ACTIVE = (int) V2_1::VehicleProperty::TRACTION_CONTROL_ACTIVE; -constexpr int VEHICLE_MAP_SERVICE = (int) V2_1::VehicleProperty::VEHICLE_MAP_SERVICE; -constexpr int WHEEL_TICK = (int) V2_1::VehicleProperty::WHEEL_TICK; -constexpr int ALL_WHEELS = (int) (V2_0::Wheel::LEFT_FRONT | V2_0::Wheel::RIGHT_FRONT | - V2_0::Wheel::LEFT_REAR | V2_0::Wheel::RIGHT_REAR); - - -const V2_0::VehiclePropConfig kVehicleProperties[] = { - { - .prop = WHEEL_TICK, - .access = V2_0::VehiclePropertyAccess::READ, - .changeMode = V2_0::VehiclePropertyChangeMode::CONTINUOUS, - .configArray = {ALL_WHEELS, 50000, 50000, 50000, 50000}, - .minSampleRate = 1.0f, - .maxSampleRate = 100.0f, - }, - - { - .prop = ABS_ACTIVE, - .access = V2_0::VehiclePropertyAccess::READ, - .changeMode = V2_0::VehiclePropertyChangeMode::ON_CHANGE, - }, - - { - .prop = TRACTION_CONTROL_ACTIVE, - .access = V2_0::VehiclePropertyAccess::READ, - .changeMode = V2_0::VehiclePropertyChangeMode::ON_CHANGE, - }, - - { - .prop = OBD2_LIVE_FRAME, - .access = V2_0::VehiclePropertyAccess::READ, - .changeMode = V2_0::VehiclePropertyChangeMode::ON_CHANGE, - .configArray = {0,0} - }, - - { - .prop = OBD2_FREEZE_FRAME, - .access = V2_0::VehiclePropertyAccess::READ, - .changeMode = V2_0::VehiclePropertyChangeMode::ON_CHANGE, - .configArray = {0,0} - }, - - { - .prop = OBD2_FREEZE_FRAME_INFO, - .access = V2_0::VehiclePropertyAccess::READ, - .changeMode = V2_0::VehiclePropertyChangeMode::ON_CHANGE - }, - - { - .prop = OBD2_FREEZE_FRAME_CLEAR, - .access = V2_0::VehiclePropertyAccess::WRITE, - .changeMode = V2_0::VehiclePropertyChangeMode::ON_CHANGE, - .configArray = {1} - }, - - { - .prop = VEHICLE_MAP_SERVICE, - .access = V2_0::VehiclePropertyAccess::READ_WRITE, - .changeMode = V2_0::VehiclePropertyChangeMode::ON_CHANGE - } -}; - -} // impl - -} // namespace V2_1 -} // namespace vehicle -} // namespace automotive -} // namespace hardware -} // namespace android - -#endif // android_hardware_automotive_vehicle_V2_1_impl_DefaultConfig_H_ diff --git a/automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.cpp b/automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.cpp deleted file mode 100644 index 568d62343d..0000000000 --- a/automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "DefaultVehicleHal_v2_1" -#include - -#include -#include -#include -#include - -#include "EmulatedVehicleHal.h" - -#define DEBUG_SOCKET (33452) - -namespace android { -namespace hardware { -namespace automotive { -namespace vehicle { -namespace V2_1 { - -namespace impl { - -static std::unique_ptr fillDefaultObd2Frame( - size_t numVendorIntegerSensors, - size_t numVendorFloatSensors) { - using V2_0::toInt; - std::unique_ptr sensorStore(new Obd2SensorStore( - numVendorIntegerSensors, numVendorFloatSensors)); - - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::FUEL_SYSTEM_STATUS, - toInt(Obd2FuelSystemStatus::CLOSED_LOOP)); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::MALFUNCTION_INDICATOR_LIGHT_ON, 0); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::IGNITION_MONITORS_SUPPORTED, - toInt(Obd2IgnitionMonitorKind::SPARK)); - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::IGNITION_SPECIFIC_MONITORS, - Obd2CommonIgnitionMonitors::COMPONENTS_AVAILABLE | - Obd2CommonIgnitionMonitors::MISFIRE_AVAILABLE | - Obd2SparkIgnitionMonitors::AC_REFRIGERANT_AVAILABLE | - Obd2SparkIgnitionMonitors::EVAPORATIVE_SYSTEM_AVAILABLE); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::INTAKE_AIR_TEMPERATURE, 35); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::COMMANDED_SECONDARY_AIR_STATUS, - toInt(Obd2SecondaryAirStatus::FROM_OUTSIDE_OR_OFF)); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::NUM_OXYGEN_SENSORS_PRESENT, 1); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::RUNTIME_SINCE_ENGINE_START, 500); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON, 0); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::WARMUPS_SINCE_CODES_CLEARED, 51); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::DISTANCE_TRAVELED_SINCE_CODES_CLEARED, 365); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::ABSOLUTE_BAROMETRIC_PRESSURE, 30); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::CONTROL_MODULE_VOLTAGE, 12); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::AMBIENT_AIR_TEMPERATURE, 18); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::MAX_FUEL_AIR_EQUIVALENCE_RATIO, 1); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::FUEL_TYPE, V2_0::toInt(Obd2FuelType::GASOLINE)); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::CALCULATED_ENGINE_LOAD, 0.153); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::SHORT_TERM_FUEL_TRIM_BANK1, -0.16); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::LONG_TERM_FUEL_TRIM_BANK1, -0.16); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::SHORT_TERM_FUEL_TRIM_BANK2, -0.16); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::LONG_TERM_FUEL_TRIM_BANK2, -0.16); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::INTAKE_MANIFOLD_ABSOLUTE_PRESSURE, 7.5); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::ENGINE_RPM, 1250.); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::VEHICLE_SPEED, 40.); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::TIMING_ADVANCE, 2.5); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::THROTTLE_POSITION, 19.75); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::OXYGEN_SENSOR1_VOLTAGE, 0.265); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::FUEL_TANK_LEVEL_INPUT, 0.824); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::EVAPORATION_SYSTEM_VAPOR_PRESSURE, -0.373); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::CATALYST_TEMPERATURE_BANK1_SENSOR1, 190.); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::RELATIVE_THROTTLE_POSITION, 3.); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::ABSOLUTE_THROTTLE_POSITION_B, 0.306); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::ACCELERATOR_PEDAL_POSITION_D, 0.188); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::ACCELERATOR_PEDAL_POSITION_E, 0.094); - sensorStore->setFloatSensor( - DiagnosticFloatSensorIndex::COMMANDED_THROTTLE_ACTUATOR, 0.024); - - return sensorStore; -} - -void EmulatedVehicleHal::initObd2LiveFrame(const V2_0::VehiclePropConfig& propConfig) { - auto liveObd2Frame = createVehiclePropValue(V2_0::VehiclePropertyType::COMPLEX, 0); - auto sensorStore = fillDefaultObd2Frame(static_cast(propConfig.configArray[0]), - static_cast(propConfig.configArray[1])); - sensorStore->fillPropValue("", liveObd2Frame.get()); - liveObd2Frame->prop = OBD2_LIVE_FRAME; - - mPropStore->writeValue(*liveObd2Frame); -} - -void EmulatedVehicleHal::initObd2FreezeFrame(const V2_0::VehiclePropConfig& propConfig) { - auto sensorStore = fillDefaultObd2Frame(static_cast(propConfig.configArray[0]), - static_cast(propConfig.configArray[1])); - - static std::vector sampleDtcs = { "P0070", "P0102" "P0123" }; - for (auto&& dtc : sampleDtcs) { - auto freezeFrame = createVehiclePropValue(V2_0::VehiclePropertyType::COMPLEX, 0); - sensorStore->fillPropValue(dtc, freezeFrame.get()); - freezeFrame->prop = OBD2_FREEZE_FRAME; - - mPropStore->writeValue(*freezeFrame); - } -} - -V2_0::StatusCode EmulatedVehicleHal::fillObd2FreezeFrame( - const V2_0::VehiclePropValue& requestedPropValue, - V2_0::VehiclePropValue* outValue) { - if (requestedPropValue.value.int64Values.size() != 1) { - ALOGE("asked for OBD2_FREEZE_FRAME without valid timestamp"); - return V2_0::StatusCode::INVALID_ARG; - } - auto timestamp = requestedPropValue.value.int64Values[0]; - auto freezeFrame = mPropStore->readValueOrNull(OBD2_FREEZE_FRAME, 0, timestamp); - if(freezeFrame == nullptr) { - ALOGE("asked for OBD2_FREEZE_FRAME at invalid timestamp"); - return V2_0::StatusCode::INVALID_ARG; - } - outValue->prop = OBD2_FREEZE_FRAME; - outValue->value.int32Values = freezeFrame->value.int32Values; - outValue->value.floatValues = freezeFrame->value.floatValues; - outValue->value.bytes = freezeFrame->value.bytes; - outValue->value.stringValue = freezeFrame->value.stringValue; - outValue->timestamp = freezeFrame->timestamp; - return V2_0::StatusCode::OK; -} - -V2_0::StatusCode EmulatedVehicleHal::clearObd2FreezeFrames(const V2_0::VehiclePropValue& propValue) { - if (propValue.value.int64Values.size() == 0) { - mPropStore->removeValuesForProperty(OBD2_FREEZE_FRAME); - return V2_0::StatusCode::OK; - } else { - for(int64_t timestamp: propValue.value.int64Values) { - auto freezeFrame = mPropStore->readValueOrNull(OBD2_FREEZE_FRAME, 0, timestamp); - if(freezeFrame == nullptr) { - ALOGE("asked for OBD2_FREEZE_FRAME at invalid timestamp"); - return V2_0::StatusCode::INVALID_ARG; - } - mPropStore->removeValue(*freezeFrame); - } - } - return V2_0::StatusCode::OK; -} - -V2_0::StatusCode EmulatedVehicleHal::fillObd2DtcInfo(V2_0::VehiclePropValue* outValue) { - std::vector timestamps; - for(const auto& freezeFrame: mPropStore->readValuesForProperty(OBD2_FREEZE_FRAME)) { - timestamps.push_back(freezeFrame.timestamp); - } - outValue->value.int64Values = timestamps; - outValue->prop = OBD2_FREEZE_FRAME_INFO; - return V2_0::StatusCode::OK; -} - -void EmulatedVehicleHal::onCreate() { - V2_0::impl::EmulatedVehicleHal::onCreate(); - - initObd2LiveFrame(*mPropStore->getConfigOrDie(OBD2_LIVE_FRAME)); - initObd2FreezeFrame(*mPropStore->getConfigOrDie(OBD2_FREEZE_FRAME)); -} - -void EmulatedVehicleHal::initStaticConfig() { - for (auto&& cfg = std::begin(kVehicleProperties); cfg != std::end(kVehicleProperties); ++cfg) { - V2_0::VehiclePropertyStore::TokenFunction tokenFunction = nullptr; - - switch (cfg->prop) { - case OBD2_FREEZE_FRAME: { - tokenFunction = [] (const V2_0::VehiclePropValue& propValue) { - return propValue.timestamp; - }; - break; - } - default: - break; - } - - mPropStore->registerProperty(*cfg, tokenFunction); - } -} - -EmulatedVehicleHal::VehiclePropValuePtr EmulatedVehicleHal::get( - const V2_0::VehiclePropValue& requestedPropValue, - V2_0::StatusCode* outStatus) { - - auto propId = requestedPropValue.prop; - VehiclePropValuePtr v = nullptr; - auto& pool = *getValuePool(); - - switch (propId) { - case OBD2_FREEZE_FRAME: - v = pool.obtainComplex(); - *outStatus = fillObd2FreezeFrame(requestedPropValue, v.get()); - return v; - case OBD2_FREEZE_FRAME_INFO: - v = pool.obtainComplex(); - *outStatus = fillObd2DtcInfo(v.get()); - return v; - default: - return V2_0::impl::EmulatedVehicleHal::get(requestedPropValue, outStatus); - } -} - -V2_0::StatusCode EmulatedVehicleHal::set(const V2_0::VehiclePropValue& propValue) { - auto propId = propValue.prop; - switch (propId) { - case OBD2_FREEZE_FRAME_CLEAR: - return clearObd2FreezeFrames(propValue); - case VEHICLE_MAP_SERVICE: - // Placeholder for future implementation of VMS property in the default hal. For now, just - // returns OK; otherwise, hal clients crash with property not supported. - return V2_0::StatusCode::OK; - default: - return V2_0::impl::EmulatedVehicleHal::set(propValue); - } -} - -} // impl - -} // namespace V2_1 -} // namespace vehicle -} // namespace automotive -} // namespace hardware -} // namespace android diff --git a/automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.h b/automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.h deleted file mode 100644 index 7cc3b79679..0000000000 --- a/automotive/vehicle/2.1/default/impl/vhal_v2_1/EmulatedVehicleHal.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef android_hardware_automotive_vehicle_V2_1_impl_EmulatedVehicleHal_H_ -#define android_hardware_automotive_vehicle_V2_1_impl_EmulatedVehicleHal_H_ - -#include - -#include - -#include -#include -#include -#include - -#include "DefaultConfig.h" - -namespace android { -namespace hardware { -namespace automotive { -namespace vehicle { -namespace V2_1 { - -namespace impl { - -using namespace std::placeholders; - -class EmulatedVehicleHal : public V2_0::impl::EmulatedVehicleHal { -public: - EmulatedVehicleHal(V2_0::VehiclePropertyStore* propStore) - : V2_0::impl::EmulatedVehicleHal(propStore), mPropStore(propStore) { - initStaticConfig(); - } - - VehiclePropValuePtr get(const V2_0::VehiclePropValue& requestedPropValue, - V2_0::StatusCode* outStatus) override; - - V2_0::StatusCode set(const V2_0::VehiclePropValue& propValue) override; - - void onCreate() override; - -private: - void initStaticConfig(); - void initObd2LiveFrame(const V2_0::VehiclePropConfig& propConfig); - void initObd2FreezeFrame(const V2_0::VehiclePropConfig& propConfig); - V2_0::StatusCode fillObd2FreezeFrame(const V2_0::VehiclePropValue& requestedPropValue, - V2_0::VehiclePropValue* outValue); - V2_0::StatusCode fillObd2DtcInfo(V2_0::VehiclePropValue *outValue); - V2_0::StatusCode clearObd2FreezeFrames(const V2_0::VehiclePropValue& propValue); - -private: - V2_0::VehiclePropertyStore* mPropStore; -}; - -} // impl - -} // namespace V2_1 -} // namespace vehicle -} // namespace automotive -} // namespace hardware -} // namespace android - - -#endif // android_hardware_automotive_vehicle_V2_0_impl_EmulatedVehicleHal_H_ diff --git a/automotive/vehicle/2.1/default/service.cpp b/automotive/vehicle/2.1/default/service.cpp deleted file mode 100644 index 03a0a5df16..0000000000 --- a/automotive/vehicle/2.1/default/service.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "automotive.vehicle@2.1-service" -#include -#include - -#include - -#include - -#include -#include -#include - -#include - -using namespace android; -using namespace android::hardware; - -namespace V2_1 = ::android::hardware::automotive::vehicle::V2_1; -namespace V2_0 = ::android::hardware::automotive::vehicle::V2_0; - -using StatusCode = V2_0::StatusCode; -using VehiclePropValue = V2_0::VehiclePropValue; - -/* Just wrapper that passes all calls to the provided V2_0::IVehicle object */ -struct Vehicle_V2_1 : public V2_1::IVehicle { - - Vehicle_V2_1(V2_0::IVehicle* vehicle20) : mVehicle20(vehicle20) {} - - // Methods derived from IVehicle - Return getAllPropConfigs(getAllPropConfigs_cb _hidl_cb) override { - return mVehicle20->getAllPropConfigs(_hidl_cb); - } - - Return getPropConfigs(const hidl_vec& properties, - getPropConfigs_cb _hidl_cb) override { - return mVehicle20->getPropConfigs(properties, _hidl_cb); - } - - Return get(const V2_0::VehiclePropValue& requestedPropValue, - get_cb _hidl_cb) override { - return mVehicle20->get(requestedPropValue, _hidl_cb); - } - - Return set(const VehiclePropValue& value) override { - return mVehicle20->set(value); - } - - Return subscribe(const sp& callback, - const hidl_vec& - options) override { - return mVehicle20->subscribe(callback, options); - } - - Return unsubscribe(const sp& callback, - int32_t propId) override { - return mVehicle20->unsubscribe(callback, propId); - } - - Return debugDump(debugDump_cb _hidl_cb = nullptr) override { - return mVehicle20->debugDump(_hidl_cb); - } - -private: - V2_0::IVehicle* mVehicle20; -}; - -int main(int /* argc */, char* /* argv */ []) { - auto store = std::make_unique(); - auto hal = std::make_unique(store.get()); - auto emulator = std::make_unique(hal.get()); - auto vehicleManager = std::make_unique(hal.get()); - - Vehicle_V2_1 vehicle21(vehicleManager.get()); - - configureRpcThreadpool(4, true /* callerWillJoin */); - - ALOGI("Registering as service..."); - status_t status = vehicle21.registerAsService(); - - if (status != OK) { - ALOGE("Unable to register vehicle service (%d).", status); - return 1; - } - - ALOGI("Ready"); - joinRpcThreadpool(); - return 1; -} diff --git a/automotive/vehicle/2.1/default/tests/Obd2SensorStore_test.cpp b/automotive/vehicle/2.1/default/tests/Obd2SensorStore_test.cpp deleted file mode 100644 index a01c0f498c..0000000000 --- a/automotive/vehicle/2.1/default/tests/Obd2SensorStore_test.cpp +++ /dev/null @@ -1,285 +0,0 @@ -/* - * Copyright (C) 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. - */ - - #include - -#include "vhal_v2_0/Obd2SensorStore.h" -#include "vhal_v2_0/VehicleUtils.h" - -namespace android { -namespace hardware { -namespace automotive { -namespace vehicle { -namespace V2_0 { - -namespace { - -static constexpr size_t getNumVendorIntegerSensors() { - return 5; -} -static constexpr size_t getNumVendorFloatSensors() { - return 3; -} - -// this struct holds information necessary for a test to be able to validate -// that the sensor bitmask contains the right data: -// - the index of the byte at which the bit for a given sensor lives -// - the expected value of that byte given that a certain sensor is present -class BitmaskIndexingInfo { -public: - size_t mByteIndex; - uint8_t mExpectedByteValue; - - // Returns the information required to validate the bitmask for an - // integer-valued sensor. - static BitmaskIndexingInfo getForIntegerSensor(size_t index) { - const size_t indexInBitstream = index; - return getForBitstreamIndex(indexInBitstream); - } - - // Returns the information required to validate the bitmask for a - // float-valued sensor. - static BitmaskIndexingInfo getForFloatSensor(size_t index) { - const size_t indexInBitstream = toInt(Obd2IntegerSensorIndex::LAST_SYSTEM_INDEX) + - 1 + getNumVendorIntegerSensors() + index; - return getForBitstreamIndex(indexInBitstream); - } - -private: - static BitmaskIndexingInfo getForBitstreamIndex(size_t indexInBitstream) { - BitmaskIndexingInfo indexingInfo; - indexingInfo.mByteIndex = indexInBitstream / 8; - indexingInfo.mExpectedByteValue = 1 << (indexInBitstream % 8); - return indexingInfo; - } -}; - -static Obd2SensorStore getSensorStore() { - return Obd2SensorStore(getNumVendorIntegerSensors(), - getNumVendorFloatSensors()); -} - -// Test that one can set and retrieve a value for the first integer sensor. -TEST(Obd2SensorStoreTest, setFirstIntegerSensor) { - Obd2SensorStore sensorStore(getSensorStore()); - sensorStore.setIntegerSensor( - Obd2IntegerSensorIndex::FUEL_SYSTEM_STATUS, - toInt(FuelSystemStatus::CLOSED_LOOP)); - const auto& integerSensors(sensorStore.getIntegerSensors()); - const auto& sensorBitmask(sensorStore.getSensorsBitmask()); - ASSERT_EQ( - toInt(FuelSystemStatus::CLOSED_LOOP), - integerSensors[toInt(Obd2IntegerSensorIndex::FUEL_SYSTEM_STATUS)]); - const BitmaskIndexingInfo indexingInfo(BitmaskIndexingInfo::getForIntegerSensor( - toInt(Obd2IntegerSensorIndex::FUEL_SYSTEM_STATUS))); - ASSERT_EQ( - indexingInfo.mExpectedByteValue, - sensorBitmask[indexingInfo.mByteIndex]); -} - -// Test that one can set and retrieve a value for the first float sensor. -TEST(Obd2SensorStoreTest, setFirstFloatSensor) { - Obd2SensorStore sensorStore(getSensorStore()); - sensorStore.setFloatSensor( - Obd2FloatSensorIndex::CALCULATED_ENGINE_LOAD, - 1.25f); - const auto& floatSensors(sensorStore.getFloatSensors()); - const auto& sensorBitmask(sensorStore.getSensorsBitmask()); - ASSERT_EQ( - 1.25f, - floatSensors[toInt(Obd2FloatSensorIndex::CALCULATED_ENGINE_LOAD)]); - const BitmaskIndexingInfo indexingInfo(BitmaskIndexingInfo::getForFloatSensor( - toInt(Obd2FloatSensorIndex::CALCULATED_ENGINE_LOAD))); - ASSERT_EQ( - indexingInfo.mExpectedByteValue, - sensorBitmask[indexingInfo.mByteIndex]); -} - -// Test that one can set and retrieve a value for an integer sensor. -TEST(Obd2SensorStoreTest, setAnyIntegerSensor) { - Obd2SensorStore sensorStore(getSensorStore()); - sensorStore.setIntegerSensor( - Obd2IntegerSensorIndex::ABSOLUTE_BAROMETRIC_PRESSURE, - 4000); - const auto& integerSensors(sensorStore.getIntegerSensors()); - const auto& sensorBitmask(sensorStore.getSensorsBitmask()); - ASSERT_EQ(4000, - integerSensors[toInt(Obd2IntegerSensorIndex::ABSOLUTE_BAROMETRIC_PRESSURE)]); - const BitmaskIndexingInfo indexingInfo(BitmaskIndexingInfo::getForIntegerSensor( - toInt(Obd2IntegerSensorIndex::ABSOLUTE_BAROMETRIC_PRESSURE))); - ASSERT_EQ( - indexingInfo.mExpectedByteValue, - sensorBitmask[indexingInfo.mByteIndex]); -} - -// Test that one can set and retrieve a value for a float sensor. -TEST(Obd2SensorStoreTest, setAnyFloatSensor) { - Obd2SensorStore sensorStore(getSensorStore()); - sensorStore.setFloatSensor( - Obd2FloatSensorIndex::OXYGEN_SENSOR3_VOLTAGE, - 2.5f); - const auto& floatSensors(sensorStore.getFloatSensors()); - const auto& sensorBitmask(sensorStore.getSensorsBitmask()); - ASSERT_EQ(2.5f, - floatSensors[toInt(Obd2FloatSensorIndex::OXYGEN_SENSOR3_VOLTAGE)]); - const BitmaskIndexingInfo indexingInfo(BitmaskIndexingInfo::getForFloatSensor( - toInt(Obd2FloatSensorIndex::OXYGEN_SENSOR3_VOLTAGE))); - ASSERT_EQ( - indexingInfo.mExpectedByteValue, - sensorBitmask[indexingInfo.mByteIndex]); -} - -// Test that one can set and retrieve a value for the last system integer sensor. -TEST(Obd2SensorStoreTest, setLastSystemIntegerSensor) { - Obd2SensorStore sensorStore(getSensorStore()); - sensorStore.setIntegerSensor( - Obd2IntegerSensorIndex::LAST_SYSTEM_INDEX, - 30); - const auto& integerSensors(sensorStore.getIntegerSensors()); - const auto& sensorBitmask(sensorStore.getSensorsBitmask()); - ASSERT_EQ(30, - integerSensors[toInt(Obd2IntegerSensorIndex::LAST_SYSTEM_INDEX)]); - const BitmaskIndexingInfo indexingInfo(BitmaskIndexingInfo::getForIntegerSensor( - toInt(Obd2IntegerSensorIndex::LAST_SYSTEM_INDEX))); - ASSERT_EQ( - indexingInfo.mExpectedByteValue, - sensorBitmask[indexingInfo.mByteIndex]); -} - -// Test that one can set and retrieve a value for the last system float sensor. -TEST(Obd2SensorStoreTest, setLastSystemFloatSensor) { - Obd2SensorStore sensorStore(getSensorStore()); - sensorStore.setFloatSensor( - Obd2FloatSensorIndex::LAST_SYSTEM_INDEX, - 2.5f); - const auto& floatSensors(sensorStore.getFloatSensors()); - const auto& sensorBitmask(sensorStore.getSensorsBitmask()); - ASSERT_EQ(2.5f, - floatSensors[toInt(Obd2FloatSensorIndex::LAST_SYSTEM_INDEX)]); - const BitmaskIndexingInfo indexingInfo(BitmaskIndexingInfo::getForFloatSensor( - toInt(Obd2FloatSensorIndex::LAST_SYSTEM_INDEX))); - ASSERT_EQ( - indexingInfo.mExpectedByteValue, - sensorBitmask[indexingInfo.mByteIndex]); -} - -// Test that one can set and retrieve a value for two integer sensors at once. -TEST(Obd2SensorStoreTest, setTwoIntegerSensors) { - Obd2SensorStore sensorStore(getSensorStore()); - sensorStore.setIntegerSensor( - Obd2IntegerSensorIndex::CONTROL_MODULE_VOLTAGE, - 6); - sensorStore.setIntegerSensor( - Obd2IntegerSensorIndex::TIME_SINCE_TROUBLE_CODES_CLEARED, - 1245); - const auto& integerSensors(sensorStore.getIntegerSensors()); - const auto& sensorBitmask(sensorStore.getSensorsBitmask()); - ASSERT_EQ(6, - integerSensors[toInt(Obd2IntegerSensorIndex::CONTROL_MODULE_VOLTAGE)]); - ASSERT_EQ(1245, - integerSensors[toInt(Obd2IntegerSensorIndex::TIME_SINCE_TROUBLE_CODES_CLEARED)]); - const BitmaskIndexingInfo voltageIndexingInfo(BitmaskIndexingInfo::getForIntegerSensor( - toInt(Obd2IntegerSensorIndex::CONTROL_MODULE_VOLTAGE))); - const BitmaskIndexingInfo timeIndexingInfo(BitmaskIndexingInfo::getForIntegerSensor( - toInt(Obd2IntegerSensorIndex::TIME_SINCE_TROUBLE_CODES_CLEARED))); - if (voltageIndexingInfo.mByteIndex == timeIndexingInfo.mByteIndex) { - ASSERT_EQ( - voltageIndexingInfo.mExpectedByteValue | - timeIndexingInfo.mExpectedByteValue, - sensorBitmask[timeIndexingInfo.mByteIndex]); - } - else { - ASSERT_EQ( - timeIndexingInfo.mExpectedByteValue, - sensorBitmask[timeIndexingInfo.mByteIndex]); - ASSERT_EQ( - voltageIndexingInfo.mExpectedByteValue, - sensorBitmask[voltageIndexingInfo.mByteIndex]); - } -} - -// Test that one can set and retrieve a value for two float sensors at once. -TEST(Obd2SensorStoreTest, setTwoFloatSensors) { - Obd2SensorStore sensorStore(getSensorStore()); - sensorStore.setFloatSensor( - Obd2FloatSensorIndex::VEHICLE_SPEED, - 1.25f); - sensorStore.setFloatSensor( - Obd2FloatSensorIndex::MAF_AIR_FLOW_RATE, - 2.5f); - const auto& floatSensors(sensorStore.getFloatSensors()); - const auto& sensorBitmask(sensorStore.getSensorsBitmask()); - ASSERT_EQ(1.25f, - floatSensors[toInt(Obd2FloatSensorIndex::VEHICLE_SPEED)]); - ASSERT_EQ(2.5f, - floatSensors[toInt(Obd2FloatSensorIndex::MAF_AIR_FLOW_RATE)]); - const BitmaskIndexingInfo speedIndexingInfo(BitmaskIndexingInfo::getForFloatSensor( - toInt(Obd2FloatSensorIndex::VEHICLE_SPEED))); - const BitmaskIndexingInfo airflowIndexingInfo(BitmaskIndexingInfo::getForFloatSensor( - toInt(Obd2FloatSensorIndex::MAF_AIR_FLOW_RATE))); - if (speedIndexingInfo.mByteIndex == airflowIndexingInfo.mByteIndex) { - ASSERT_EQ( - speedIndexingInfo.mExpectedByteValue | - airflowIndexingInfo.mExpectedByteValue, - sensorBitmask[airflowIndexingInfo.mByteIndex]); - } - else { - ASSERT_EQ( - speedIndexingInfo.mExpectedByteValue, - sensorBitmask[speedIndexingInfo.mByteIndex]); - ASSERT_EQ( - airflowIndexingInfo.mExpectedByteValue, - sensorBitmask[airflowIndexingInfo.mByteIndex]); - } -} - -// Test that one can set and retrieve a value for a vendor integer sensor. -TEST(Obd2SensorStoreTest, setVendorIntegerSensor) { - const size_t sensorIndex = toInt(Obd2IntegerSensorIndex::LAST_SYSTEM_INDEX) + 2; - Obd2SensorStore sensorStore(getSensorStore()); - sensorStore.setIntegerSensor(sensorIndex, 22); - const auto& integerSensors(sensorStore.getIntegerSensors()); - const auto& sensorBitmask(sensorStore.getSensorsBitmask()); - ASSERT_EQ(22, integerSensors[sensorIndex]); - const BitmaskIndexingInfo indexingInfo(BitmaskIndexingInfo::getForIntegerSensor( - sensorIndex)); - ASSERT_EQ( - indexingInfo.mExpectedByteValue, - sensorBitmask[indexingInfo.mByteIndex]); -} - -// Test that one can set and retrieve a value for a vendor float sensor. -TEST(Obd2SensorStoreTest, setVendorFloatSensor) { - const size_t sensorIndex = toInt(Obd2FloatSensorIndex::LAST_SYSTEM_INDEX) + 2; - Obd2SensorStore sensorStore(getSensorStore()); - sensorStore.setFloatSensor(sensorIndex, 1.25f); - const auto& floatSensors(sensorStore.getFloatSensors()); - const auto& sensorBitmask(sensorStore.getSensorsBitmask()); - ASSERT_EQ(1.25f, floatSensors[sensorIndex]); - const BitmaskIndexingInfo indexingInfo(BitmaskIndexingInfo::getForFloatSensor( - sensorIndex)); - ASSERT_EQ( - indexingInfo.mExpectedByteValue, - sensorBitmask[indexingInfo.mByteIndex]); -} - -} // namespace anonymous - -} // namespace V2_0 -} // namespace vehicle -} // namespace automotive -} // namespace hardware -} // namespace android diff --git a/automotive/vehicle/2.1/types.hal b/automotive/vehicle/2.1/types.hal deleted file mode 100644 index 569e1a5510..0000000000 --- a/automotive/vehicle/2.1/types.hal +++ /dev/null @@ -1,715 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.1 (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.1 - * - * 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.automotive.vehicle@2.1; - -import android.hardware.automotive.vehicle@2.0; - -/** - * Extension of VehicleProperty enum declared in Vehicle HAL 2.0 - */ -enum VehicleProperty: @2.0::VehicleProperty { - /** - * Reports wheel ticks - * - * The first four elements represent ticks for individual wheels in the - * following order: front left, front right, rear right, rear left. All - * tick counts are cumulative. Tick counts increment when the vehicle - * moves forward, and decrement when vehicles moves in reverse. The ticks - * should be reset to 0 when the vehicle is started by the user. - * - * The next element in the vector is a reset count. A reset indicates - * previous tick counts are not comparable with this and future ones. Some - * sort of discontinuity in tick counting has occurred. - * - * int64Values[0] = reset count - * int64Values[1] = front left ticks - * int64Values[2] = front right ticks - * int64Values[3] = rear right ticks - * int64Values[4] = rear left ticks - * - * configArray is used to indicate the micrometers-per-wheel-tick value as well as - * which wheels are supported. configArray is set as follows: - * - * configArray[0], bits [0:3] = supported wheels. Uses enum Wheel. - * configArray[1] = micrometers per front left wheel tick - * configArray[2] = micrometers per front right wheel tick - * configArray[3] = micrometers per rear right wheel tick - * configArray[4] = micrometers per rear left wheel tick - * - * NOTE: If a wheel is not supported, its value shall always be set to 0. - * - * VehiclePropValue.timestamp must be correctly filled in. - * - * @change_mode VehiclePropertyChangeMode:CONTINUOUS - * @access VehiclePropertyAccess:READ - */ - WHEEL_TICK = ( - 0x0306 - | VehiclePropertyGroup:SYSTEM - | VehiclePropertyType:COMPLEX - | VehicleArea:GLOBAL), - - /** - * ABS is active. Set to true whenever ABS is activated. Reset to false when ABS is off. - * - * @change_mode VehiclePropertyChangeMode:ON_CHANGE - * @access VehiclePropertyAccess:READ - */ - ABS_ACTIVE = ( - 0x040A - | VehiclePropertyGroup:SYSTEM - | VehiclePropertyType:BOOLEAN - | VehicleArea:GLOBAL), - - /** - * Traction Control is active. - * - * @change_mode VehiclePropertyChangeMode:ON_CHANGE - * @access VehiclePropertyAccess:READ - */ - TRACTION_CONTROL_ACTIVE = ( - 0x040B - | VehiclePropertyGroup:SYSTEM - | VehiclePropertyType:BOOLEAN - | VehicleArea:GLOBAL), - - /** - * Automatic re-circulation on/off - * - * IVehicle#set and IVehicle#get must return StatusCode::NOT_AVAILABLE when HVAC unit is off. - * See HVAC_POWER_ON property for details. - * - * @change_mode VehiclePropertyChangeMode:ON_CHANGE - * @access VehiclePropertyAccess:READ_WRITE - */ - HVAC_AUTO_RECIRC_ON = ( - 0x0512 - | VehiclePropertyGroup:SYSTEM - | VehiclePropertyType:BOOLEAN - | VehicleArea:ZONE), - - /** - * Vehicle Maps Service (VMS) message - * - * This property uses COMPLEX data to communicate vms messages. - * - * Its contents are to be interpreted as follows: - * the indices defined in VmsMessageIntegerValuesIndex are to be used to - * read from int32Values; - * bytes is a serialized VMS message as defined in the vms protocol - * which is opaque to the framework; - * - * IVehicle#get must always return StatusCode::NOT_AVAILABLE. - * - * @change_mode VehiclePropertyChangeMode:ON_CHANGE - * @access VehiclePropertyAccess:READ_WRITE - */ - VEHICLE_MAP_SERVICE = ( - 0x0C00 - | VehiclePropertyGroup:SYSTEM - | VehiclePropertyType:COMPLEX - | VehicleArea:GLOBAL), - - /** - * OBD2 Live Sensor Data - * - * Reports a snapshot of the current (live) values of the OBD2 sensors available. - * - * The configArray is set as follows: - * configArray[0] = number of vendor-specific integer-valued sensors - * configArray[1] = number of vendor-specific float-valued sensors - * - * The values of this property are to be interpreted as in the following example. - * Considering a configArray = {2,3} - * int32Values must be a vector containing Obd2IntegerSensorIndex.LAST_SYSTEM_INDEX + 2 - * elements (that is, 33 elements); - * floatValues must be a vector containing Obd2FloatSensorIndex.LAST_SYSTEM_INDEX + 3 - * elements (that is, 73 elements); - * - * It is possible for each frame to contain a different subset of sensor values, both system - * provided sensors, and vendor-specific ones. In order to support that, the bytes element - * of the property value is used as a bitmask,. - * - * bytes must have a sufficient number of bytes to represent the total number of possible - * sensors (in this case, 14 bytes to represent 106 possible values); it is to be read as - * a contiguous bitmask such that each bit indicates the presence or absence of a sensor - * from the frame, starting with as many bits as the size of int32Values, immediately - * followed by as many bits as the size of floatValues. - * - * For example, should bytes[0] = 0x4C (0b01001100) it would mean that: - * int32Values[0 and 1] are not valid sensor values - * int32Values[2 and 3] are valid sensor values - * int32Values[4 and 5] are not valid sensor values - * int32Values[6] is a valid sensor value - * int32Values[7] is not a valid sensor value - * Should bytes[5] = 0x61 (0b01100001) it would mean that: - * int32Values[32] is a valid sensor value - * floatValues[0 thru 3] are not valid sensor values - * floatValues[4 and 5] are valid sensor values - * floatValues[6] is not a valid sensor value - * - * @change_mode VehiclePropertyChangeMode:ON_CHANGE - * @access VehiclePropertyAccess:READ - */ - OBD2_LIVE_FRAME = ( - 0x0D00 - | VehiclePropertyGroup:SYSTEM - | VehiclePropertyType:COMPLEX - | VehicleArea:GLOBAL), - - /** - * OBD2 Freeze Frame Sensor Data - * - * Reports a snapshot of the value of the OBD2 sensors available at the time that a fault - * occurred and was detected. - * - * A configArray must be provided with the same meaning as defined for OBD2_LIVE_FRAME. - * - * The values of this property are to be interpreted in a similar fashion as those for - * OBD2_LIVE_FRAME, with the exception that the stringValue field may contain a non-empty - * diagnostic troubleshooting code (DTC). - * - * A IVehicle#get request of this property must provide a value for int64Values[0]. - * This will be interpreted as the timestamp of the freeze frame to retrieve. A list of - * timestamps can be obtained by a IVehicle#get of OBD2_FREEZE_FRAME_INFO. - * - * Should no freeze frame be available at the given timestamp, a response of NOT_AVAILABLE - * must be returned by the implementation. Because vehicles may have limited storage for - * freeze frames, it is possible for a frame request to respond with NOT_AVAILABLE even if - * the associated timestamp has been recently obtained via OBD2_FREEZE_FRAME_INFO. - * - * @change_mode VehiclePropertyChangeMode:ON_CHANGE - * @access VehiclePropertyAccess:READ - */ - OBD2_FREEZE_FRAME = ( - 0x0D01 - | VehiclePropertyGroup:SYSTEM - | VehiclePropertyType:COMPLEX - | VehicleArea:GLOBAL), - - /** - * OBD2 Freeze Frame Information - * - * This property describes the current freeze frames stored in vehicle - * memory and available for retrieval via OBD2_FREEZE_FRAME. - * - * The values are to be interpreted as follows: - * each element of int64Values must be the timestamp at which a a fault code - * has been detected and the corresponding freeze frame stored, and each - * such element can be used as the key to OBD2_FREEZE_FRAME to retrieve - * the corresponding freeze frame. - * - * @change_mode VehiclePropertyChangeMode:ON_CHANGE - * @access VehiclePropertyAccess:READ - */ - OBD2_FREEZE_FRAME_INFO = ( - 0x0D02 - | VehiclePropertyGroup:SYSTEM - | VehiclePropertyType:COMPLEX - | VehicleArea:GLOBAL), - - /** - * OBD2 Freeze Frame Clear - * - * This property allows deletion of any of the freeze frames stored in - * vehicle memory, as described by OBD2_FREEZE_FRAME_INFO. - * - * The configArray is set as follows: - * configArray[0] = 1 if the implementation is able to clear individual freeze frames - * by timestamp, 0 otherwise - * - * IVehicle#set of this property is to be interpreted as follows: - * if int64Values contains no elements, then all frames stored must be cleared; - * if int64Values contains one or more elements, then frames at the timestamps - * stored in int64Values must be cleared, and the others not cleared. Should the - * vehicle not support selective clearing of freeze frames, this latter mode must - * return NOT_AVAILABLE. - * - * @change_mode VehiclePropertyChangeMode:ON_CHANGE - * @access VehiclePropertyAccess:WRITE - */ - OBD2_FREEZE_FRAME_CLEAR = ( - 0x0D03 - | VehiclePropertyGroup:SYSTEM - | VehiclePropertyType:COMPLEX - | VehicleArea:GLOBAL), -}; - -/** - * The status of the vehicle's fuel system. - * These values come from the SAE J1979 standard. - */ -enum Obd2FuelSystemStatus : int32_t { - OPEN_INSUFFICIENT_ENGINE_TEMPERATURE = 1, - CLOSED_LOOP = 2, - OPEN_ENGINE_LOAD_OR_DECELERATION = 4, - OPEN_SYSTEM_FAILURE = 8, - CLOSED_LOOP_BUT_FEEDBACK_FAULT = 16, -}; - -/** Defines which ignition monitors are available to be read. */ -enum Obd2IgnitionMonitorKind : int32_t { - SPARK = 0, - COMPRESSION = 1, -}; - -/** - * Ignition monitors common to both SPARK and COMPRESSION. - * These values come from the SAE J1979 standard. - */ -enum Obd2CommonIgnitionMonitors : int32_t { - COMPONENTS_AVAILABLE = 0x1 << 0, - COMPONENTS_INCOMPLETE = 0x1 << 1, - - FUEL_SYSTEM_AVAILABLE = 0x1 << 2, - FUEL_SYSTEM_INCOMPLETE = 0x1 << 3, - - MISFIRE_AVAILABLE = 0x1 << 4, - MISFIRE_INCOMPLETE = 0x1 << 5, -}; - -/** - * Ignition monitors available for SPARK vehicles. - * These values come from the SAE J1979 standard. - */ -enum Obd2SparkIgnitionMonitors : Obd2CommonIgnitionMonitors { - EGR_AVAILABLE = 0x1 << 6, - EGR_INCOMPLETE = 0x1 << 7, - - OXYGEN_SENSOR_HEATER_AVAILABLE = 0x1 << 8, - OXYGEN_SENSOR_HEATER_INCOMPLETE = 0x1 << 9, - - OXYGEN_SENSOR_AVAILABLE = 0x1 << 10, - OXYGEN_SENSOR_INCOMPLETE = 0x1 << 11, - - AC_REFRIGERANT_AVAILABLE = 0x1 << 12, - AC_REFRIGERANT_INCOMPLETE = 0x1 << 13, - - SECONDARY_AIR_SYSTEM_AVAILABLE = 0x1 << 14, - SECONDARY_AIR_SYSTEM_INCOMPLETE = 0x1 << 15, - - EVAPORATIVE_SYSTEM_AVAILABLE = 0x1 << 16, - EVAPORATIVE_SYSTEM_INCOMPLETE = 0x1 << 17, - - HEATED_CATALYST_AVAILABLE = 0x1 << 18, - HEATED_CATALYST_INCOMPLETE = 0x1 << 19, - - CATALYST_AVAILABLE = 0x1 << 20, - CATALYST_INCOMPLETE = 0x1 << 21, -}; - -/** - * Ignition monitors only available for COMPRESSION vehicles. - * These values come from the SAE J1979 standard. - */ -enum Obd2CompressionIgnitionMonitors : Obd2CommonIgnitionMonitors { - EGR_OR_VVT_AVAILABLE = 0x1 << 6, - EGR_OR_VVT_INCOMPLETE = 0x1 << 7, - - PM_FILTER_AVAILABLE = 0x1 << 8, - PM_FILTER_INCOMPLETE = 0x1 << 9, - - EXHAUST_GAS_SENSOR_AVAILABLE = 0x1 << 10, - EXHAUST_GAS_SENSOR_INCOMPLETE = 0x1 << 11, - - BOOST_PRESSURE_AVAILABLE = 0x1 << 12, - BOOST_PRESSURE_INCOMPLETE = 0x1 << 13, - - NOx_SCR_AVAILABLE = 0x1 << 14, - NOx_SCR_INCOMPLETE = 0x1 << 15, - - NMHC_CATALYST_AVAILABLE = 0x1 << 16, - NMHC_CATALYST_INCOMPLETE = 0x1 << 17, -}; - -/** - * The status of the vehicle's secondary air system. - * These values come from the SAE J1979 standard. - */ -enum Obd2SecondaryAirStatus : int32_t { - UPSTREAM = 1, - DOWNSTREAM_OF_CATALYCIC_CONVERTER = 2, - FROM_OUTSIDE_OR_OFF = 4, - PUMP_ON_FOR_DIAGNOSTICS = 8, -}; - -/** - * The fuel type(s) supported by a vehicle. - * These values come from the SAE J1979 standard. - */ -enum Obd2FuelType : int32_t { - NOT_AVAILABLE = 0, - GASOLINE = 1, - METHANOL = 2, - ETHANOL = 3, - DIESEL = 4, - LPG = 5, - CNG = 6, - PROPANE = 7, - ELECTRIC = 8, - BIFUEL_RUNNING_GASOLINE = 9, - BIFUEL_RUNNING_METHANOL = 10, - BIFUEL_RUNNING_ETHANOL = 11, - BIFUEL_RUNNING_LPG = 12, - BIFUEL_RUNNING_CNG = 13, - BIFUEL_RUNNING_PROPANE = 14, - BIFUEL_RUNNING_ELECTRIC = 15, - BIFUEL_RUNNING_ELECTRIC_AND_COMBUSTION = 16, - HYBRID_GASOLINE = 17, - HYBRID_ETHANOL = 18, - HYBRID_DIESEL = 19, - HYBRID_ELECTRIC = 20, - HYBRID_RUNNING_ELECTRIC_AND_COMBUSTION = 21, - HYBRID_REGENERATIVE = 22, - BIFUEL_RUNNING_DIESEL = 23, -}; - -/** - * This enum provides the canonical mapping for sensor properties that have an integer value. - * The ordering of the values is taken from the OBD2 specification. - * Some of the properties are represented as an integer mapping to another enum. In those cases - * expect a comment by the property definition describing the enum to look at for the mapping. - * Any value greater than the last reserved index is available to vendors to map their extensions. - * While these values do not directly map to SAE J1979 PIDs, an equivalence is listed next - * to each one to aid implementors. - */ -enum DiagnosticIntegerSensorIndex : int32_t { - /** refer to FuelSystemStatus for a description of this value. */ - FUEL_SYSTEM_STATUS = 0, /* PID 0x03 */ - MALFUNCTION_INDICATOR_LIGHT_ON = 1, /* PID 0x01 */ - - /** refer to IgnitionMonitorKind for a description of this value. */ - IGNITION_MONITORS_SUPPORTED = 2, /* PID 0x01 */ - - /** - * The value of this sensor is a bitmask that specifies whether ignition-specific - * tests are available and whether they are complete. The semantics of the individual - * bits in this value are given by, respectively, SparkIgnitionMonitors and - * CompressionIgnitionMonitors depending on the value of IGNITION_MONITORS_SUPPORTED. - */ - IGNITION_SPECIFIC_MONITORS = 3, /* PID 0x01 */ - INTAKE_AIR_TEMPERATURE = 4, /* PID 0x0F */ - - /** refer to SecondaryAirStatus for a description of this value. */ - COMMANDED_SECONDARY_AIR_STATUS = 5, /* PID 0x12 */ - NUM_OXYGEN_SENSORS_PRESENT = 6, /* PID 0x13 */ - RUNTIME_SINCE_ENGINE_START = 7, /* PID 0x1F */ - DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON = 8, /* PID 0x21 */ - WARMUPS_SINCE_CODES_CLEARED = 9, /* PID 0x30 */ - DISTANCE_TRAVELED_SINCE_CODES_CLEARED = 10, /* PID 0x31 */ - ABSOLUTE_BAROMETRIC_PRESSURE = 11, /* PID 0x33 */ - CONTROL_MODULE_VOLTAGE = 12, /* PID 0x42 */ - AMBIENT_AIR_TEMPERATURE = 13, /* PID 0x46 */ - TIME_WITH_MALFUNCTION_LIGHT_ON = 14, /* PID 0x4D */ - TIME_SINCE_TROUBLE_CODES_CLEARED = 15, /* PID 0x4E */ - MAX_FUEL_AIR_EQUIVALENCE_RATIO = 16, /* PID 0x4F */ - MAX_OXYGEN_SENSOR_VOLTAGE = 17, /* PID 0x4F */ - MAX_OXYGEN_SENSOR_CURRENT = 18, /* PID 0x4F */ - MAX_INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 19, /* PID 0x4F */ - MAX_AIR_FLOW_RATE_FROM_MASS_AIR_FLOW_SENSOR = 20, /* PID 0x50 */ - - /** refer to FuelType for a description of this value. */ - FUEL_TYPE = 21, /* PID 0x51 */ - FUEL_RAIL_ABSOLUTE_PRESSURE = 22, /* PID 0x59 */ - ENGINE_OIL_TEMPERATURE = 23, /* PID 0x5C */ - DRIVER_DEMAND_PERCENT_TORQUE = 24, /* PID 0x61 */ - ENGINE_ACTUAL_PERCENT_TORQUE = 25, /* PID 0x62 */ - ENGINE_REFERENCE_PERCENT_TORQUE = 26, /* PID 0x63 */ - ENGINE_PERCENT_TORQUE_DATA_IDLE = 27, /* PID 0x64 */ - ENGINE_PERCENT_TORQUE_DATA_POINT1 = 28, /* PID 0x64 */ - ENGINE_PERCENT_TORQUE_DATA_POINT2 = 29, /* PID 0x64 */ - ENGINE_PERCENT_TORQUE_DATA_POINT3 = 30, /* PID 0x64 */ - ENGINE_PERCENT_TORQUE_DATA_POINT4 = 31, /* PID 0x64 */ - LAST_SYSTEM_INDEX = ENGINE_PERCENT_TORQUE_DATA_POINT4, -}; - -/** - * This enum provides the canonical mapping for sensor properties that have a floating-point value. - * The ordering of the values is taken from the OBD2 specification. - * Any value greater than the last reserved index is available to vendors to map their extensions. - * While these values do not directly map to SAE J1979 PIDs, an equivalence is listed next - * to each one to aid implementors. - */ -enum DiagnosticFloatSensorIndex : int32_t { - CALCULATED_ENGINE_LOAD = 0, /* PID 0x04 */ - ENGINE_COOLANT_TEMPERATURE = 1, /* PID 0x05 */ - SHORT_TERM_FUEL_TRIM_BANK1 = 2, /* PID 0x06 */ - LONG_TERM_FUEL_TRIM_BANK1 = 3, /* PID 0x07 */ - SHORT_TERM_FUEL_TRIM_BANK2 = 4, /* PID 0x08 */ - LONG_TERM_FUEL_TRIM_BANK2 = 5, /* PID 0x09 */ - FUEL_PRESSURE = 6, /* PID 0x0A */ - INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 7, /* PID 0x0B */ - ENGINE_RPM = 8, /* PID 0x0C */ - VEHICLE_SPEED = 9, /* PID 0x0D */ - TIMING_ADVANCE = 10, /* PID 0x0E */ - MAF_AIR_FLOW_RATE = 11, /* PID 0x10 */ - THROTTLE_POSITION = 12, /* PID 0x11 */ - OXYGEN_SENSOR1_VOLTAGE = 13, /* PID 0x14 */ - OXYGEN_SENSOR1_SHORT_TERM_FUEL_TRIM = 14, /* PID 0x14 */ - OXYGEN_SENSOR1_FUEL_AIR_EQUIVALENCE_RATIO = 15, /* PID 0x24 */ - OXYGEN_SENSOR2_VOLTAGE = 16, /* PID 0x15 */ - OXYGEN_SENSOR2_SHORT_TERM_FUEL_TRIM = 17, /* PID 0x15 */ - OXYGEN_SENSOR2_FUEL_AIR_EQUIVALENCE_RATIO = 18, /* PID 0x25 */ - OXYGEN_SENSOR3_VOLTAGE = 19, /* PID 0x16 */ - OXYGEN_SENSOR3_SHORT_TERM_FUEL_TRIM = 20, /* PID 0x16 */ - OXYGEN_SENSOR3_FUEL_AIR_EQUIVALENCE_RATIO = 21, /* PID 0x26 */ - OXYGEN_SENSOR4_VOLTAGE = 22, /* PID 0x17 */ - OXYGEN_SENSOR4_SHORT_TERM_FUEL_TRIM = 23, /* PID 0x17 */ - OXYGEN_SENSOR4_FUEL_AIR_EQUIVALENCE_RATIO = 24, /* PID 0x27 */ - OXYGEN_SENSOR5_VOLTAGE = 25, /* PID 0x18 */ - OXYGEN_SENSOR5_SHORT_TERM_FUEL_TRIM = 26, /* PID 0x18 */ - OXYGEN_SENSOR5_FUEL_AIR_EQUIVALENCE_RATIO = 27, /* PID 0x28 */ - OXYGEN_SENSOR6_VOLTAGE = 28, /* PID 0x19 */ - OXYGEN_SENSOR6_SHORT_TERM_FUEL_TRIM = 29, /* PID 0x19 */ - OXYGEN_SENSOR6_FUEL_AIR_EQUIVALENCE_RATIO = 30, /* PID 0x29 */ - OXYGEN_SENSOR7_VOLTAGE = 31, /* PID 0x1A */ - OXYGEN_SENSOR7_SHORT_TERM_FUEL_TRIM = 32, /* PID 0x1A */ - OXYGEN_SENSOR7_FUEL_AIR_EQUIVALENCE_RATIO = 33, /* PID 0x2A */ - OXYGEN_SENSOR8_VOLTAGE = 34, /* PID 0x1B */ - OXYGEN_SENSOR8_SHORT_TERM_FUEL_TRIM = 35, /* PID 0x1B */ - OXYGEN_SENSOR8_FUEL_AIR_EQUIVALENCE_RATIO = 36, /* PID 0x2B */ - FUEL_RAIL_PRESSURE = 37, /* PID 0x22 */ - FUEL_RAIL_GAUGE_PRESSURE = 38, /* PID 0x23 */ - COMMANDED_EXHAUST_GAS_RECIRCULATION = 39, /* PID 0x2C */ - EXHAUST_GAS_RECIRCULATION_ERROR = 40, /* PID 0x2D */ - COMMANDED_EVAPORATIVE_PURGE = 41, /* PID 0x2E */ - FUEL_TANK_LEVEL_INPUT = 42, /* PID 0x2F */ - EVAPORATION_SYSTEM_VAPOR_PRESSURE = 43, /* PID 0x32 */ - CATALYST_TEMPERATURE_BANK1_SENSOR1 = 44, /* PID 0x3C */ - CATALYST_TEMPERATURE_BANK2_SENSOR1 = 45, /* PID 0x3D */ - CATALYST_TEMPERATURE_BANK1_SENSOR2 = 46, /* PID 0x3E */ - CATALYST_TEMPERATURE_BANK2_SENSOR2 = 47, /* PID 0x3F */ - ABSOLUTE_LOAD_VALUE = 48, /* PID 0x43 */ - FUEL_AIR_COMMANDED_EQUIVALENCE_RATIO = 49, /* PID 0x44 */ - RELATIVE_THROTTLE_POSITION = 50, /* PID 0x45 */ - ABSOLUTE_THROTTLE_POSITION_B = 51, /* PID 0x47 */ - ABSOLUTE_THROTTLE_POSITION_C = 52, /* PID 0x48 */ - ACCELERATOR_PEDAL_POSITION_D = 53, /* PID 0x49 */ - ACCELERATOR_PEDAL_POSITION_E = 54, /* PID 0x4A */ - ACCELERATOR_PEDAL_POSITION_F = 55, /* PID 0x4B */ - COMMANDED_THROTTLE_ACTUATOR = 56, /* PID 0x4C */ - ETHANOL_FUEL_PERCENTAGE = 57,/* PID 0x52 */ - ABSOLUTE_EVAPORATION_SYSTEM_VAPOR_PRESSURE = 58, /* PID 0x53 */ - SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK1 = 59, /* PID 0x55 */ - SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK2 = 60, /* PID 0x57 */ - SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK3 = 61,/* PID 0x55 */ - SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK4 = 62, /* PID 0x57 */ - LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK1 = 63, /* PID 0x56 */ - LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK2 = 64, /* PID 0x58 */ - LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK3 = 65, /* PID 0x56 */ - LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK4 = 66, /* PID 0x58 */ - RELATIVE_ACCELERATOR_PEDAL_POSITION = 67, /* PID 0x5A */ - HYBRID_BATTERY_PACK_REMAINING_LIFE = 68, /* PID 0x5B */ - FUEL_INJECTION_TIMING = 69, /* PID 0x5D */ - ENGINE_FUEL_RATE = 70, /* PID 0x5E */ - LAST_SYSTEM_INDEX = ENGINE_FUEL_RATE, -}; - -/** - * This enum lists the types of supported VMS messages. It is used as the first - * integer in the vehicle property integers array and determines how the rest of - * the message is decoded. - */ -enum VmsMessageType : int32_t { - /** - * A request from the subscribers to the VMS service to subscribe to a layer. - * - * This message type uses enum VmsMessageWithLayerIntegerValuesIndex. - */ - SUBSCRIBE = 1, - - /** - * A request from the subscribers to the VMS service to subscribe to a layer from a specific publisher. - * - * This message type uses enum VmsMessageWithLayerAndPublisherIdIntegerValuesIndex. - */ - SUBSCRIBE_TO_PUBLISHER = 2, - - /** - * A request from the subscribers to the VMS service to unsubscribes from a layer. - * - * This message type uses enum VmsMessageWithLayerIntegerValuesIndex. - */ - UNSUBSCRIBE = 3, - - /** - * A request from the subscribers to the VMS service to unsubscribes from a layer from a specific publisher. - * - * This message type uses enum VmsMessageWithLayerAndPublisherIdIntegerValuesIndex. - */ - UNSUBSCRIBE_TO_PUBLISHER = 4, - - /** - * Information from the publishers to the VMS service about the layers which the client can publish. - * - * This message type uses enum VmsOfferingMessageIntegerValuesIndex. - */ - OFFERING = 5, - - /** - * A request from the subscribers to the VMS service to get the available layers. - * - * This message type uses enum VmsBaseMessageIntegerValuesIndex. - */ - AVAILABILITY_REQUEST = 6, - - /** - * A request from the publishers to the VMS service to get the layers with subscribers. - * - * This message type uses enum VmsBaseMessageIntegerValuesIndex. - */ - SUBSCRIPTIONS_REQUEST = 7, - - /** - * A response from the VMS service to the subscribers to a VmsMessageType.AVAILABILITY_REQUEST - * - * This message type uses enum VmsAvailabilityStateIntegerValuesIndex. - */ - AVAILABILITY_RESPONSE = 8, - - /** - * A notification from the VMS service to the subscribers on a change in the available layers. - * - * This message type uses enum VmsAvailabilityStateIntegerValuesIndex. - */ - AVAILABILITY_CHANGE = 9, - - /** - * A response from the VMS service to the publishers to a VmsMessageType.SUBSCRIPTIONS_REQUEST - * - * This message type uses enum VmsSubscriptionsStateIntegerValuesIndex. - */ - SUBSCRIPTIONS_RESPONSE = 10, - - /** - * A notification from the VMS service to the publishers on a change in the layers with subscribers. - * - * This message type uses enum VmsSubscriptionsStateIntegerValuesIndex. - */ - SUBSCRIPTIONS_CHANGE = 11, - - /** - * A message from the VMS service to the subscribers or from the publishers to the VMS service - * with a serialized VMS data packet as defined in the VMS protocol. - * - * This message type uses enum VmsBaseMessageIntegerValuesIndex. - */ - DATA = 12, -}; - -/** - * Every VMS message starts with the type of the message from the VmsMessageType enum. - * Messages with no parameters such as VmsMessageType.AVAILABILITY_REQUEST, - * VmsMessageType.SUBSCRIPTIONS_REQUEST and VmsMessageType.DATA are also based on this enum. - */ -enum VmsBaseMessageIntegerValuesIndex : int32_t { - /* The message type as enumerated by VmsMessageType enum. */ - MESSAGE_TYPE = 0, -}; - -/* - * A VMS message with a layer is sent as part of a VmsMessageType.SUBSCRIBE or - * VmsMessageType.UNSUBSCRIBE messages. - * - * The layer type is defined in the VMS protocol, and the subtype and version are - * controlled by the implementer of the publisher. - */ -enum VmsMessageWithLayerIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { - LAYER_TYPE = 1, - - LAYER_SUBTYPE = 2, - - LAYER_VERSION = 3, -}; - -/* - * A VMS message with a layer and publisher ID is sent as part of a - * VmsMessageType.SUBSCRIBE_TO_PUBLISHER and VmsMessageType.UNSUBSCRIBE_TO_PUBLISHER messages. - */ -enum VmsMessageWithLayerAndPublisherIdIntegerValuesIndex : VmsMessageWithLayerIntegerValuesIndex { - PUBLISHER_ID = 4, -}; - -/* - * An offering can be sent by publishers as part of VmsMessageType.OFFERING in order to - * advertise which layers they can publish and under which constraints: e.g., I can publish Layer X - * if someone else will publish Layer Y. - * The offering contains the publisher ID which was assigned to the publisher by the VMS service. - * A single offering is represented as: - * - Layer type - * - Layer subtype - * - Layer version - * - Number of dependencies (N) - * - N x (Layer type, Layer subtype, Layer version) - */ -enum VmsOfferingMessageIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { - PUBLISHER_ID = 1, - - NUMBER_OF_OFFERS = 2, - - OFFERING_START = 3, -}; - -/** - * A subscriptions state is sent to the publishers in response to a change in the subscriptions - * as part of a VmsMessageType.SUBSCRIPTIONS_CHANGE, or in response to a - * VmsMessageType.SUBSCRIPTIONS_REQUEST message as part of VmsMessageType.SUBSCRIPTIONS_RESPONSE. - * The VMS service issues monotonically increasing sequence numbers, and in case a subscriber receives - * a smaller sequnce number it should ignore the message. - * The subscriptions are sent as a list of layers followed by a list of associated layers: - * {Sequence number, N, M, N x layer, M x associated layer} - * A subscribed layer is represented as three integers: - * - Layer type - * - Layer subtype - * - Layer version - * A subscribed associated layer is a layer with a list of publisher IDs. It is represented as: - * - Layer type - * - Layer subtype - * - Layer version - * - Number of publisher IDs (N) - * - N x publisher ID - */ -enum VmsSubscriptionsStateIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { - SEQUENCE_NUMBER = 1, - - NUMBER_OF_LAYERS = 2, - - NUMBER_OF_ASSOCIATED_LAYERS = 3, - - SUBSCRIPTIONS_START = 4, -}; - -/** - * An availability state is sent to the subscribers in response to a change in the available - * layers as part of a VmsMessageType.AVAILABILITY_CHANGE message, or in response to a - * VmsMessageType.AVAILABILITY_REQUEST message as part of a VmsMessageType.AVAILABILITY_RESPONSE. - * The VMS service issues monotonically increasing sequence numbers, and in case a subscriber receives - * a smaller sequnce number, it should ignore the message. - * An available associated layer is a layer with a list of publisher IDs: - * - Layer type - * - Layer subtype - * - Layer version - * - Number of publisher IDs (N) - * - N x publisher ID -*/ -enum VmsAvailabilityStateIntegerValuesIndex : VmsBaseMessageIntegerValuesIndex { - SEQUENCE_NUMBER = 1, - - NUMBER_OF_ASSOCIATED_LAYERS = 2, - - LAYERS_START = 3, -}; diff --git a/current.txt b/current.txt index f8cdc930b3..61e4ca8a61 100644 --- a/current.txt +++ b/current.txt @@ -224,3 +224,4 @@ c3354ab0d381a236c12dc486ad4b6bec28c979d26748b4661f12ede36f392808 android.hardwar b18caefefcc765092412285d776234fcf213b73bdf07ae1b67a5f71b2d2464e3 android.hardware.wifi.offload@1.0::types c26473e2e4a00af43e28a0ddf9002e5062a7d0940429e5efb6e5513a8abcb75c android.hardware.wifi@1.1::IWifi b056e1defab4071584214584057d0bc73a613081bf1152590549649d4582c13c android.hardware.wifi@1.1::IWifiChip +05e0edf31db5b3ae19047d87059545cc2f836023edf8f9d969319e15e3485158 android.hardware.automotive.vehicle@2.0::types From 2525d9e579641260d28d8dbadcd02600cdd26e17 Mon Sep 17 00:00:00 2001 From: Wyatt Riley Date: Fri, 25 Aug 2017 07:02:58 -0700 Subject: [PATCH 157/265] Setting clock flags for GPS clock Full bias nanosecond flag is now set correctly for legacy GpsData (vs. modern GnssData) implementations of gps.h measurements, going through default GNSS HAL implementation. Change-Id: Iec8f03994b6d9e509221e1323b54dc997319fccc Fixes: 64482271 Test: Before/after on device with GnssLogger --- gnss/1.0/default/GnssMeasurement.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gnss/1.0/default/GnssMeasurement.cpp b/gnss/1.0/default/GnssMeasurement.cpp index 6c9b838b8d..d81f829bcd 100644 --- a/gnss/1.0/default/GnssMeasurement.cpp +++ b/gnss/1.0/default/GnssMeasurement.cpp @@ -182,7 +182,6 @@ void GnssMeasurement::gpsMeasurementCb(GpsData* gpsData) { auto clockVal = gpsData->clock; static uint32_t discontinuity_count_to_handle_old_clock_type = 0; - auto flags = clockVal.flags; gnssData.clock.leapSecond = clockVal.leap_second; /* @@ -205,7 +204,7 @@ void GnssMeasurement::gpsMeasurementCb(GpsData* gpsData) { break; case GPS_CLOCK_TYPE_GPS_TIME: // GPS time, need to convert. - flags |= GPS_CLOCK_HAS_FULL_BIAS; + clockVal.flags |= GPS_CLOCK_HAS_FULL_BIAS; clockVal.full_bias_ns = clockVal.time_ns; clockVal.time_ns = 0; gnssData.clock.hwClockDiscontinuityCount = From d1ccbc1bac7f61093287bc0139785be500a7e6a4 Mon Sep 17 00:00:00 2001 From: Myles Watson Date: Fri, 11 Aug 2017 16:47:28 -0700 Subject: [PATCH 158/265] Bluetooth: Check H4 HCI packet types An invalid type byte can cause an access outside the bounds of the array. Bug: 64565737 Test: Bluetooth On/Off Change-Id: Ie11dd62942f66b9fc60ebce2e4339c37d597fdf0 --- bluetooth/1.0/default/h4_protocol.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bluetooth/1.0/default/h4_protocol.cc b/bluetooth/1.0/default/h4_protocol.cc index 054ed39a5a..163cc333c4 100644 --- a/bluetooth/1.0/default/h4_protocol.cc +++ b/bluetooth/1.0/default/h4_protocol.cc @@ -82,6 +82,12 @@ void H4Protocol::OnDataReady(int fd) { } } hci_packet_type_ = static_cast(buffer[0]); + if (hci_packet_type_ != HCI_PACKET_TYPE_ACL_DATA && + hci_packet_type_ != HCI_PACKET_TYPE_SCO_DATA && + hci_packet_type_ != HCI_PACKET_TYPE_EVENT) { + LOG_ALWAYS_FATAL("%s: Unimplemented packet type %d", __func__, + static_cast(hci_packet_type_)); + } } else { hci_packetizer_.OnDataReady(fd, hci_packet_type_); } From 6ebbc2cff7df284c9431d8f6ac2ae71bcf9e2800 Mon Sep 17 00:00:00 2001 From: Myles Watson Date: Thu, 24 Aug 2017 09:13:02 -0700 Subject: [PATCH 159/265] Bluetooth: Return false when not shut down Do not crash in the vendor layer. The stack will crash when it fails to initialize. Bug: 64535243 Test: Bluetooth starts/stops Change-Id: I69fdd2879c80fa2f006c50f0a42a85e9289b14fe --- bluetooth/1.0/default/vendor_interface.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bluetooth/1.0/default/vendor_interface.cc b/bluetooth/1.0/default/vendor_interface.cc index 15b6c74532..6ce2f11fb4 100644 --- a/bluetooth/1.0/default/vendor_interface.cc +++ b/bluetooth/1.0/default/vendor_interface.cc @@ -162,8 +162,10 @@ bool VendorInterface::Initialize( InitializeCompleteCallback initialize_complete_cb, PacketReadCallback event_cb, PacketReadCallback acl_cb, PacketReadCallback sco_cb) { - LOG_ALWAYS_FATAL_IF(g_vendor_interface, "%s: No previous Shutdown()?", - __func__); + if (g_vendor_interface) { + ALOGE("%s: No previous Shutdown()?", __func__); + return false; + } g_vendor_interface = new VendorInterface(); return g_vendor_interface->Open(initialize_complete_cb, event_cb, acl_cb, sco_cb); From 169eeecb0825de116fcc66e8ce000fe97cb4ec8c Mon Sep 17 00:00:00 2001 From: Sundong Ahn Date: Mon, 10 Jul 2017 13:56:10 +0900 Subject: [PATCH 160/265] Configstore HAL is down-revisioned to 1.0 Configstore was up-revisioned from 1.0 to 1.1. However no new APIs were added to 1.1. Therefore configstore in mr1 will be down revisioned to 1.0. Bug: 64999074 Test: lshal | grep configsotre Test: "cat proc//status | grep Seccomp " return: Seccomp: 2 Change-Id: Ia2614439cd620fbe5fbd427571ab55a15089cc47 --- CleanSpec.mk | 1 + compatibility_matrix.26.xml | 2 +- compatibility_matrix.current.xml | 2 +- compatibility_matrix.legacy.xml | 2 +- configstore/{1.1 => 1.0}/default/Android.mk | 11 ++- .../default/SurfaceFlingerConfigs.cpp | 7 +- .../default/SurfaceFlingerConfigs.h | 17 ++-- ...ndroid.hardware.configstore@1.0-service.rc | 4 + .../configstore@1.0-arm64.policy} | 0 configstore/{1.1 => 1.0}/default/service.cpp | 10 +-- .../{1.1 => 1.0}/default/surfaceflinger.mk | 0 configstore/1.1/Android.bp | 64 --------------- configstore/1.1/Android.mk | 78 ------------------- configstore/1.1/ISurfaceFlingerConfigs.hal | 25 ------ ...ndroid.hardware.configstore@1.1-service.rc | 4 - configstore/1.1/vts/functional/Android.bp | 26 ------- .../VtsHalConfigstoreV1_1TargetTest.cpp | 55 ------------- configstore/Android.bp | 2 - 18 files changed, 27 insertions(+), 283 deletions(-) rename configstore/{1.1 => 1.0}/default/Android.mk (70%) rename configstore/{1.1 => 1.0}/default/SurfaceFlingerConfigs.cpp (96%) rename configstore/{1.1 => 1.0}/default/SurfaceFlingerConfigs.h (77%) create mode 100644 configstore/1.0/default/android.hardware.configstore@1.0-service.rc rename configstore/{1.1/default/seccomp_policy/configstore@1.1-arm64.policy => 1.0/default/seccomp_policy/configstore@1.0-arm64.policy} (100%) rename configstore/{1.1 => 1.0}/default/service.cpp (81%) rename configstore/{1.1 => 1.0}/default/surfaceflinger.mk (100%) delete mode 100644 configstore/1.1/Android.bp delete mode 100644 configstore/1.1/Android.mk delete mode 100644 configstore/1.1/ISurfaceFlingerConfigs.hal delete mode 100644 configstore/1.1/default/android.hardware.configstore@1.1-service.rc delete mode 100644 configstore/1.1/vts/functional/Android.bp delete mode 100644 configstore/1.1/vts/functional/VtsHalConfigstoreV1_1TargetTest.cpp diff --git a/CleanSpec.mk b/CleanSpec.mk index 91515abba9..5b31d1ea5b 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -60,3 +60,4 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/hw/android.hardware.auto $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/hw/android.hardware.automotive*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib64/hw/android.hardware.automotive*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/init/android.hardware.automotive*) +$(call add-clean-step, find $(PRODUCT_OUT)/system $(PRODUCT_OUT)/vendor -type f -name "android\.hardware\.configstore\@1\.1*" -print0 | xargs -0 rm -f) diff --git a/compatibility_matrix.26.xml b/compatibility_matrix.26.xml index 9aa54188ad..8c715dd12a 100644 --- a/compatibility_matrix.26.xml +++ b/compatibility_matrix.26.xml @@ -73,7 +73,7 @@ android.hardware.configstore - 1.0-1 + 1.0 ISurfaceFlingerConfigs default diff --git a/compatibility_matrix.current.xml b/compatibility_matrix.current.xml index 9603bd6e15..e3c4e152b9 100644 --- a/compatibility_matrix.current.xml +++ b/compatibility_matrix.current.xml @@ -73,7 +73,7 @@ android.hardware.configstore - 1.0-1 + 1.0 ISurfaceFlingerConfigs default diff --git a/compatibility_matrix.legacy.xml b/compatibility_matrix.legacy.xml index 6167f25eb6..1dbbb0593d 100644 --- a/compatibility_matrix.legacy.xml +++ b/compatibility_matrix.legacy.xml @@ -73,7 +73,7 @@ android.hardware.configstore - 1.0-1 + 1.0 ISurfaceFlingerConfigs default diff --git a/configstore/1.1/default/Android.mk b/configstore/1.0/default/Android.mk similarity index 70% rename from configstore/1.1/default/Android.mk rename to configstore/1.0/default/Android.mk index 58b67c1525..8b24031f4c 100644 --- a/configstore/1.1/default/Android.mk +++ b/configstore/1.0/default/Android.mk @@ -2,19 +2,18 @@ LOCAL_PATH := $(call my-dir) ################################################################################ include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.configstore@1.1-service -LOCAL_REQUIRED_MODULES_arm64 := configstore@1.1.policy +LOCAL_MODULE := android.hardware.configstore@1.0-service +LOCAL_REQUIRED_MODULES_arm64 := configstore@1.0.policy LOCAL_PROPRIETARY_MODULE := true LOCAL_MODULE_CLASS := EXECUTABLES LOCAL_MODULE_RELATIVE_PATH := hw -LOCAL_INIT_RC := android.hardware.configstore@1.1-service.rc +LOCAL_INIT_RC := android.hardware.configstore@1.0-service.rc LOCAL_SRC_FILES:= service.cpp include $(LOCAL_PATH)/surfaceflinger.mk LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ - android.hardware.configstore@1.1 \ libhidlbase \ libhidltransport \ libbase \ @@ -27,9 +26,9 @@ include $(BUILD_EXECUTABLE) # seccomp filter for configstore ifeq ($(TARGET_ARCH), $(filter $(TARGET_ARCH), arm64)) include $(CLEAR_VARS) -LOCAL_MODULE := configstore@1.1.policy +LOCAL_MODULE := configstore@1.0.policy LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/etc/seccomp_policy -LOCAL_SRC_FILES := seccomp_policy/configstore@1.1-$(TARGET_ARCH).policy +LOCAL_SRC_FILES := seccomp_policy/configstore@1.0-$(TARGET_ARCH).policy include $(BUILD_PREBUILT) endif diff --git a/configstore/1.1/default/SurfaceFlingerConfigs.cpp b/configstore/1.0/default/SurfaceFlingerConfigs.cpp similarity index 96% rename from configstore/1.1/default/SurfaceFlingerConfigs.cpp rename to configstore/1.0/default/SurfaceFlingerConfigs.cpp index 5a040f2a89..3239274f9f 100644 --- a/configstore/1.1/default/SurfaceFlingerConfigs.cpp +++ b/configstore/1.0/default/SurfaceFlingerConfigs.cpp @@ -19,7 +19,7 @@ namespace android { namespace hardware { namespace configstore { -namespace V1_1 { +namespace V1_0 { namespace implementation { // Methods from ::android::hardware::configstore::V1_0::ISurfaceFlingerConfigs @@ -139,13 +139,10 @@ Return SurfaceFlingerConfigs::startGraphicsAllocatorService( return Void(); } -// Methods from ::android::hardware::configstore::V1_1::ISurfaceFlingerConfigs -// follow. - // Methods from ::android::hidl::base::V1_0::IBase follow. } // namespace implementation -} // namespace V1_1 +} // namespace V1_0 } // namespace configstore } // namespace hardware } // namespace android diff --git a/configstore/1.1/default/SurfaceFlingerConfigs.h b/configstore/1.0/default/SurfaceFlingerConfigs.h similarity index 77% rename from configstore/1.1/default/SurfaceFlingerConfigs.h rename to configstore/1.0/default/SurfaceFlingerConfigs.h index 53e8ae8714..32e5fc3928 100644 --- a/configstore/1.1/default/SurfaceFlingerConfigs.h +++ b/configstore/1.0/default/SurfaceFlingerConfigs.h @@ -1,17 +1,17 @@ -#ifndef ANDROID_HARDWARE_CONFIGSTORE_V1_1_SURFACEFLINGERCONFIGS_H -#define ANDROID_HARDWARE_CONFIGSTORE_V1_1_SURFACEFLINGERCONFIGS_H +#ifndef ANDROID_HARDWARE_CONFIGSTORE_V1_0_SURFACEFLINGERCONFIGS_H +#define ANDROID_HARDWARE_CONFIGSTORE_V1_0_SURFACEFLINGERCONFIGS_H -#include +#include #include #include namespace android { namespace hardware { namespace configstore { -namespace V1_1 { +namespace V1_0 { namespace implementation { -using ::android::hardware::configstore::V1_1::ISurfaceFlingerConfigs; +using ::android::hardware::configstore::V1_0::ISurfaceFlingerConfigs; using ::android::hardware::Return; using ::android::hardware::Void; using ::android::sp; @@ -32,16 +32,13 @@ struct SurfaceFlingerConfigs : public ISurfaceFlingerConfigs { Return maxFrameBufferAcquiredBuffers(maxFrameBufferAcquiredBuffers_cb _hidl_cb) override; Return startGraphicsAllocatorService(startGraphicsAllocatorService_cb _hidl_cb) override; - // Methods from - // ::android::hardware::configstore::V1_1::ISurfaceFlingerConfigs follow. - // Methods from ::android::hidl::base::V1_0::IBase follow. }; } // namespace implementation -} // namespace V1_1 +} // namespace V1_0 } // namespace configstore } // namespace hardware } // namespace android -#endif // ANDROID_HARDWARE_CONFIGSTORE_V1_1_SURFACEFLINGERCONFIGS_H +#endif // ANDROID_HARDWARE_CONFIGSTORE_V1_0_SURFACEFLINGERCONFIGS_H diff --git a/configstore/1.0/default/android.hardware.configstore@1.0-service.rc b/configstore/1.0/default/android.hardware.configstore@1.0-service.rc new file mode 100644 index 0000000000..563d8541c3 --- /dev/null +++ b/configstore/1.0/default/android.hardware.configstore@1.0-service.rc @@ -0,0 +1,4 @@ +service configstore-hal-1-0 /vendor/bin/hw/android.hardware.configstore@1.0-service + class hal animation + user system + group system diff --git a/configstore/1.1/default/seccomp_policy/configstore@1.1-arm64.policy b/configstore/1.0/default/seccomp_policy/configstore@1.0-arm64.policy similarity index 100% rename from configstore/1.1/default/seccomp_policy/configstore@1.1-arm64.policy rename to configstore/1.0/default/seccomp_policy/configstore@1.0-arm64.policy diff --git a/configstore/1.1/default/service.cpp b/configstore/1.0/default/service.cpp similarity index 81% rename from configstore/1.1/default/service.cpp rename to configstore/1.0/default/service.cpp index 535e0cdd96..c9c81a07f5 100644 --- a/configstore/1.1/default/service.cpp +++ b/configstore/1.0/default/service.cpp @@ -14,9 +14,9 @@ * limitations under the License. */ -#define LOG_TAG "android.hardware.configstore@1.1-service" +#define LOG_TAG "android.hardware.configstore@1.0-service" -#include +#include #include #include @@ -24,8 +24,8 @@ using android::hardware::configureRpcThreadpool; using android::hardware::joinRpcThreadpool; -using android::hardware::configstore::V1_1::ISurfaceFlingerConfigs; -using android::hardware::configstore::V1_1::implementation::SurfaceFlingerConfigs; +using android::hardware::configstore::V1_0::ISurfaceFlingerConfigs; +using android::hardware::configstore::V1_0::implementation::SurfaceFlingerConfigs; using android::hardware::SetupMinijail; using android::sp; using android::status_t; @@ -34,7 +34,7 @@ using android::OK; int main() { configureRpcThreadpool(10, true); - SetupMinijail("/vendor/etc/seccomp_policy/configstore@1.1.policy"); + SetupMinijail("/vendor/etc/seccomp_policy/configstore@1.0.policy"); sp surfaceFlingerConfigs = new SurfaceFlingerConfigs; status_t status = surfaceFlingerConfigs->registerAsService(); diff --git a/configstore/1.1/default/surfaceflinger.mk b/configstore/1.0/default/surfaceflinger.mk similarity index 100% rename from configstore/1.1/default/surfaceflinger.mk rename to configstore/1.0/default/surfaceflinger.mk diff --git a/configstore/1.1/Android.bp b/configstore/1.1/Android.bp deleted file mode 100644 index 92fb7c1399..0000000000 --- a/configstore/1.1/Android.bp +++ /dev/null @@ -1,64 +0,0 @@ -// This file is autogenerated by hidl-gen. Do not edit manually. - -filegroup { - name: "android.hardware.configstore@1.1_hal", - srcs: [ - "ISurfaceFlingerConfigs.hal", - ], -} - -genrule { - name: "android.hardware.configstore@1.1_genc++", - tools: ["hidl-gen"], - cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.1", - srcs: [ - ":android.hardware.configstore@1.1_hal", - ], - out: [ - "android/hardware/configstore/1.1/SurfaceFlingerConfigsAll.cpp", - ], -} - -genrule { - name: "android.hardware.configstore@1.1_genc++_headers", - tools: ["hidl-gen"], - cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.1", - srcs: [ - ":android.hardware.configstore@1.1_hal", - ], - out: [ - "android/hardware/configstore/1.1/ISurfaceFlingerConfigs.h", - "android/hardware/configstore/1.1/IHwSurfaceFlingerConfigs.h", - "android/hardware/configstore/1.1/BnHwSurfaceFlingerConfigs.h", - "android/hardware/configstore/1.1/BpHwSurfaceFlingerConfigs.h", - "android/hardware/configstore/1.1/BsSurfaceFlingerConfigs.h", - ], -} - -cc_library { - name: "android.hardware.configstore@1.1", - defaults: ["hidl-module-defaults"], - generated_sources: ["android.hardware.configstore@1.1_genc++"], - generated_headers: ["android.hardware.configstore@1.1_genc++_headers"], - export_generated_headers: ["android.hardware.configstore@1.1_genc++_headers"], - vendor_available: true, - vndk: { - enabled: true, - }, - shared_libs: [ - "libhidlbase", - "libhidltransport", - "libhwbinder", - "liblog", - "libutils", - "libcutils", - "android.hardware.configstore@1.0", - ], - export_shared_lib_headers: [ - "libhidlbase", - "libhidltransport", - "libhwbinder", - "libutils", - "android.hardware.configstore@1.0", - ], -} diff --git a/configstore/1.1/Android.mk b/configstore/1.1/Android.mk deleted file mode 100644 index a5fa6c4796..0000000000 --- a/configstore/1.1/Android.mk +++ /dev/null @@ -1,78 +0,0 @@ -# This file is autogenerated by hidl-gen. Do not edit manually. - -LOCAL_PATH := $(call my-dir) - -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.configstore-V1.1-java -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_JAVA_LIBRARIES := \ - android.hardware.configstore-V1.0-java \ - android.hidl.base-V1.0-java \ - - -# -# Build ISurfaceFlingerConfigs.hal -# -GEN := $(intermediates)/android/hardware/configstore/V1_1/ISurfaceFlingerConfigs.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.1::ISurfaceFlingerConfigs - -$(GEN): $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_JAVA_LIBRARY) - - -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.configstore-V1.1-java-static -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android.hardware.configstore-V1.0-java-static \ - android.hidl.base-V1.0-java-static \ - - -# -# Build ISurfaceFlingerConfigs.hal -# -GEN := $(intermediates)/android/hardware/configstore/V1_1/ISurfaceFlingerConfigs.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.1::ISurfaceFlingerConfigs - -$(GEN): $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_STATIC_JAVA_LIBRARY) - - - -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/configstore/1.1/ISurfaceFlingerConfigs.hal b/configstore/1.1/ISurfaceFlingerConfigs.hal deleted file mode 100644 index 5eacbe00ac..0000000000 --- a/configstore/1.1/ISurfaceFlingerConfigs.hal +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.1 (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.1 - * - * 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.configstore@1.1; - -import @1.0::ISurfaceFlingerConfigs; - -/** - * New revision of ISurfaceFlingerConfigs - */ - -interface ISurfaceFlingerConfigs extends @1.0::ISurfaceFlingerConfigs { -}; diff --git a/configstore/1.1/default/android.hardware.configstore@1.1-service.rc b/configstore/1.1/default/android.hardware.configstore@1.1-service.rc deleted file mode 100644 index 018ef102d0..0000000000 --- a/configstore/1.1/default/android.hardware.configstore@1.1-service.rc +++ /dev/null @@ -1,4 +0,0 @@ -service configstore-hal /vendor/bin/hw/android.hardware.configstore@1.1-service - class hal animation - user system - group system diff --git a/configstore/1.1/vts/functional/Android.bp b/configstore/1.1/vts/functional/Android.bp deleted file mode 100644 index 59beb09caa..0000000000 --- a/configstore/1.1/vts/functional/Android.bp +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright (C) 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. -// - -cc_test { - name: "VtsHalConfigstoreV1_1TargetTest", - defaults: ["VtsHalTargetTestDefaults"], - srcs: ["VtsHalConfigstoreV1_1TargetTest.cpp"], - static_libs: [ - "android.hardware.configstore@1.0", - "android.hardware.configstore@1.1", - ], -} - diff --git a/configstore/1.1/vts/functional/VtsHalConfigstoreV1_1TargetTest.cpp b/configstore/1.1/vts/functional/VtsHalConfigstoreV1_1TargetTest.cpp deleted file mode 100644 index bd3da4c433..0000000000 --- a/configstore/1.1/vts/functional/VtsHalConfigstoreV1_1TargetTest.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 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 "ConfigstoreHidlHalTest" - -#include -#include -#include -#include -#include - -using ::android::hardware::configstore::V1_1::ISurfaceFlingerConfigs; -using ::android::sp; - -#define ASSERT_OK(ret) ASSERT_TRUE(ret.isOk()) -#define EXPECT_OK(ret) EXPECT_TRUE(ret.isOk()) - -class ConfigstoreHidlTest : public ::testing::VtsHalHidlTargetTestBase { - public: - sp sfConfigs; - - virtual void SetUp() override { - sfConfigs = ::testing::VtsHalHidlTargetTestBase::getService(); - ASSERT_NE(sfConfigs, nullptr); - } - - virtual void TearDown() override {} -}; - -/** - * Placeholder testcase. - */ -TEST_F(ConfigstoreHidlTest, Test) { - ASSERT_TRUE(true); -} - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - int status = RUN_ALL_TESTS(); - LOG(INFO) << "Test result = " << status; - return status; -} diff --git a/configstore/Android.bp b/configstore/Android.bp index 4a783c3d7e..ba3e62e29b 100644 --- a/configstore/Android.bp +++ b/configstore/Android.bp @@ -2,7 +2,5 @@ subdirs = [ "1.0", "1.0/vts/functional", - "1.1", - "1.1/vts/functional", "utils", ] From 5d5c2ec5fc5140e6dc8055c340a77ad384d68a9d Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Fri, 25 Aug 2017 10:45:10 -0700 Subject: [PATCH 161/265] Move auto hash to right location in current.txt. This doesn't actually matter in practice, but this will help keep the file sane and make sure the wrong hashes aren't modified in the future. Test: pass Bug: 63603463 Change-Id: I89e320d36c41b08ebbcee320ac37565bb1aa708c --- current.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/current.txt b/current.txt index 61e4ca8a61..f6fc9e7e93 100644 --- a/current.txt +++ b/current.txt @@ -189,6 +189,7 @@ fe3c3c2f572b72f15f8594c538b0577bd5c28722c31879cfe6231330cddb6747 android.hardwar # ABI preserving changes to HALs released in Android O +05e0edf31db5b3ae19047d87059545cc2f836023edf8f9d969319e15e3485158 android.hardware.automotive.vehicle@2.0::types 150a338ce11fcec70757c9675d83cf6a5d7b40d0c812741b91671fecce59eac9 android.hardware.broadcastradio@1.0::types dc7e6d4f537b9943e27edc4f86c5a03bb643b18f18f866f8c3c71c0ac4ea8cbc android.hardware.broadcastradio@1.0::types 760485232f6cce07f8bb05e3475509956996b702f77415ee5bff05e2ec5a5bcc android.hardware.dumpstate@1.0::IDumpstateDevice @@ -224,4 +225,3 @@ c3354ab0d381a236c12dc486ad4b6bec28c979d26748b4661f12ede36f392808 android.hardwar b18caefefcc765092412285d776234fcf213b73bdf07ae1b67a5f71b2d2464e3 android.hardware.wifi.offload@1.0::types c26473e2e4a00af43e28a0ddf9002e5062a7d0940429e5efb6e5513a8abcb75c android.hardware.wifi@1.1::IWifi b056e1defab4071584214584057d0bc73a613081bf1152590549649d4582c13c android.hardware.wifi@1.1::IWifiChip -05e0edf31db5b3ae19047d87059545cc2f836023edf8f9d969319e15e3485158 android.hardware.automotive.vehicle@2.0::types From d338811d0545eebab6f623c63e90f5203f53ebfb Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Thu, 24 Aug 2017 14:19:54 -0700 Subject: [PATCH 162/265] Remove hardcoded version from fwk comp mat They are injected via assemble_vintf by the build system at build time. See build/make/target/board/Android.mk. Test: m system_compatibility_matrix.xml, and manually inspect $OUT/system/compatibility_matrix.xml; it contains versions. Bug: 64124223 Change-Id: Ibf82efa0805233dedb6badce7e5a4ff62a9ff769 Merged-In: Ibf82efa0805233dedb6badce7e5a4ff62a9ff769 --- compatibility_matrix.26.xml | 3 --- compatibility_matrix.current.xml | 3 --- compatibility_matrix.legacy.xml | 3 --- 3 files changed, 9 deletions(-) diff --git a/compatibility_matrix.26.xml b/compatibility_matrix.26.xml index 9aa54188ad..ba6b659556 100644 --- a/compatibility_matrix.26.xml +++ b/compatibility_matrix.26.xml @@ -319,7 +319,4 @@ default - - - diff --git a/compatibility_matrix.current.xml b/compatibility_matrix.current.xml index 9603bd6e15..3184ed3cdb 100644 --- a/compatibility_matrix.current.xml +++ b/compatibility_matrix.current.xml @@ -327,7 +327,4 @@ default - - - diff --git a/compatibility_matrix.legacy.xml b/compatibility_matrix.legacy.xml index 6167f25eb6..f64cf575a2 100644 --- a/compatibility_matrix.legacy.xml +++ b/compatibility_matrix.legacy.xml @@ -319,7 +319,4 @@ default - - - From 6f1de2968a8207afc62b897d5f3a1356046fe923 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Fri, 25 Aug 2017 12:41:36 -0700 Subject: [PATCH 163/265] O-MR1: HIDL freeze-commit Freezing libraries which are being released in O-MR1. Note the following remaining items: - configstore@1.1 will be removed from O-MR1 (since it doesn't add anything) - neuralnetworks@1.0 will be frozen later (as it has some remaining changes in progress) Bug: 63603463 Test: -Lcheck Change-Id: I888896a66e742613d0ce64c4ca6206972ac6aca8 --- current.txt | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/current.txt b/current.txt index f6fc9e7e93..1eb290b886 100644 --- a/current.txt +++ b/current.txt @@ -198,7 +198,7 @@ e822cb7f4a1bdd45689c5e92ccd19a2201c20b771bd4b2ec1ae627e324591f9d android.hardwar 28e929b453df3d9f5060af2764e6cdb123ddb893e3e86923c877f6ff7e5f02c9 android.hardware.wifi@1.0::types df1d7b27e644bfed0a4f606a8c44d35d45cafce82c7c648494c8a25c7cd4a949 android.hardware.wifi@1.0::types -# HALs released in Android O MR1 +# HALs released in Android O MR1 (Initial Set) 4b65763663a94a3920134011691f8fbb42ccb7b7795589efddc049a9106047d6 android.hardware.oemlock@1.0::IOemLock e02cd3722cb5e8fa51179f5defacb4f7866f903c9c7c51dc01a3148473a71525 android.hardware.oemlock@1.0::types @@ -225,3 +225,27 @@ c3354ab0d381a236c12dc486ad4b6bec28c979d26748b4661f12ede36f392808 android.hardwar b18caefefcc765092412285d776234fcf213b73bdf07ae1b67a5f71b2d2464e3 android.hardware.wifi.offload@1.0::types c26473e2e4a00af43e28a0ddf9002e5062a7d0940429e5efb6e5513a8abcb75c android.hardware.wifi@1.1::IWifi b056e1defab4071584214584057d0bc73a613081bf1152590549649d4582c13c android.hardware.wifi@1.1::IWifiChip + +# ABI preserving changes to HALs released in Android O MR1 (Initial Set) +# None + +# HALs released in Android O MR1 (Final Set) +044cb039378b8a0e36f40ff1e6ce04dc0d339da02095f968d5062a051e99d108 android.hardware.broadcastradio@1.1::types +c9699483f8cefe4f9b39b4b9609b76cab2dd1659a06188056b45797d337d4256 android.hardware.broadcastradio@1.1::IBroadcastRadio +b5d62dcd663fc4fcc977b252af59b333043bdfe73de2f11fe6d6a8bf438a0f92 android.hardware.broadcastradio@1.1::IBroadcastRadioFactory +bc7e054a6e93adebedff345aeed44549be89e6b1b6ffe071ff47a61de764b232 android.hardware.broadcastradio@1.1::ITuner +e9139fc755be578693f17c8cd1e27c75f412cfc722157bab5bf03ee68896e31d android.hardware.broadcastradio@1.1::ITunerCallback +63929c99e5755d9e09d9e0fd2527391fbb1609dda0508f5933b7943b92ae0fbc android.hardware.camera.device@3.3::types +bbcfc3f748b078f6a66c4e228084a679d30bd61bfde8bb7a91efd507b91c1bfd android.hardware.camera.device@3.3::ICameraDeviceSession +4a6998cd6793a3f9f03989c29d662589b1bc9d38826c6698c6c17864f7a814f5 android.hardware.cas@1.0::types +0e656ba1bac11461a17096ef752b69d24b000d820ef5652f0150a0f9731d54c2 android.hardware.cas@1.0::ICas +b80e1456b81f80032d0de7cb45652ac15af11e7474d520d757481ecaad796dff android.hardware.cas@1.0::ICasListener +a432d6d9200248dc2126827bcd6cdea31dd65eff39b939f64585d27d915a5857 android.hardware.cas@1.0::IDescramblerBase +86ba9c03978b79a742e990420bc5ced0673d25a939f82572996bef92621e2014 android.hardware.cas@1.0::IMediaCasService +8ad23abc3f380c7f1d0f944a93a997417d7536b6a522dc88b2699ff5ef5db4ec android.hardware.cas.native@1.0::types +71106c24093507954ce2aec243c8377e3ac54ebb9803c611e51620addf2af9a2 android.hardware.cas.native@1.0::IDescrambler +f4945e397b5dea41bb64518dfde59be71245d8a125fd1e0acffeb57ac7b08fed android.hardware.thermal@1.1::IThermal +c8bc853546dd55584611def2a9fa1d99f657e3366c976d2f60fe6b8aa6d2cb87 android.hardware.thermal@1.1::IThermalCallback + +# ABI preserving changes to HALs released in Android O MR1 (Final Set) +# None From 8454fcd4dcd293f580c257f13b3dd21081e02330 Mon Sep 17 00:00:00 2001 From: David Gross Date: Fri, 25 Aug 2017 16:25:01 -0700 Subject: [PATCH 164/265] Fix test that broke when number of ADD inputs increased from 2 to 3. Test: vts: nn32, nn64 Bug: 63905942 Change-Id: Ie4b237d0c16247d7774a13384a59453da94c5d91 --- .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp index 5e6b1bd63f..930ddcaee8 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -89,6 +89,7 @@ Model createTestModel() { const uint32_t operand1 = 0; const uint32_t operand2 = 1; const uint32_t operand3 = 2; + const uint32_t operand4 = 3; const std::vector operands = { { @@ -111,6 +112,16 @@ Model createTestModel() { .offset = 0, .length = size}, }, + { + .type = OperandType::INT32, + .dimensions = {}, + .numberOfConsumers = 1, + .scale = 0.0f, + .zeroPoint = 0, + .location = {.poolIndex = static_cast(LocationValues::LOCATION_SAME_BLOCK), + .offset = size, + .length = sizeof(int32_t)}, + }, { .type = OperandType::TENSOR_FLOAT32, .dimensions = {1, 2, 2, 1}, @@ -125,15 +136,19 @@ Model createTestModel() { const std::vector operations = {{ .opTuple = {OperationType::ADD, OperandType::TENSOR_FLOAT32}, - .inputs = {operand1, operand2}, - .outputs = {operand3}, + .inputs = {operand1, operand2, operand3}, + .outputs = {operand4}, }}; const std::vector inputIndexes = {operand1}; - const std::vector outputIndexes = {operand3}; - const std::vector operandValues(reinterpret_cast(operand2Data.data()), - reinterpret_cast(operand2Data.data()) + - operand2Data.size() * sizeof(float)); + const std::vector outputIndexes = {operand4}; + std::vector operandValues( + reinterpret_cast(operand2Data.data()), + reinterpret_cast(operand2Data.data()) + size); + int32_t activation[1] = {0}; + operandValues.insert(operandValues.end(), reinterpret_cast(&activation[0]), + reinterpret_cast(&activation[1])); + const std::vector pools = {}; return { From f4bae95eab8eeedd00c2bbb1e471864a430af7c7 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Mon, 7 Aug 2017 17:05:14 -0700 Subject: [PATCH 165/265] Move Broadcast Radio HAL to a separate binary. Bug: 63600413 Test: VTS, instrumentation Change-Id: I34a779a6608f52bcadaca1dc159bcee02186b49f --- audio/2.0/default/service.cpp | 7 +--- broadcastradio/1.1/default/Android.bp | 15 ++++---- ...oid.hardware.broadcastradio@1.1-service.rc | 4 +++ broadcastradio/1.1/default/service.cpp | 36 +++++++++++++++++++ 4 files changed, 50 insertions(+), 12 deletions(-) create mode 100644 broadcastradio/1.1/default/android.hardware.broadcastradio@1.1-service.rc create mode 100644 broadcastradio/1.1/default/service.cpp diff --git a/audio/2.0/default/service.cpp b/audio/2.0/default/service.cpp index f71f1b4735..a215108e95 100644 --- a/audio/2.0/default/service.cpp +++ b/audio/2.0/default/service.cpp @@ -21,8 +21,6 @@ #include #include #include -#include -#include using android::hardware::configureRpcThreadpool; using android::hardware::joinRpcThreadpool; @@ -32,7 +30,6 @@ using android::hardware::audio::effect::V2_0::IEffectsFactory; using android::hardware::audio::V2_0::IDevicesFactory; using android::hardware::soundtrigger::V2_0::ISoundTriggerHw; using android::hardware::registerPassthroughServiceImplementation; -using android::hardware::broadcastradio::V1_1::IBroadcastRadioFactory; using android::OK; @@ -43,11 +40,9 @@ int main(int /* argc */, char* /* argv */ []) { LOG_ALWAYS_FATAL_IF(status != OK, "Error while registering audio service: %d", status); status = registerPassthroughServiceImplementation(); LOG_ALWAYS_FATAL_IF(status != OK, "Error while registering audio effects service: %d", status); - // Soundtrigger and FM radio might be not present. + // Soundtrigger might be not present. status = registerPassthroughServiceImplementation(); ALOGE_IF(status != OK, "Error while registering soundtrigger service: %d", status); - status = registerPassthroughServiceImplementation(); - ALOGE_IF(status != OK, "Error while registering fm radio service: %d", status); joinRpcThreadpool(); return status; } diff --git a/broadcastradio/1.1/default/Android.bp b/broadcastradio/1.1/default/Android.bp index bec8524a0b..6d26b11bd8 100644 --- a/broadcastradio/1.1/default/Android.bp +++ b/broadcastradio/1.1/default/Android.bp @@ -14,8 +14,9 @@ // limitations under the License. // -cc_library_shared { - name: "android.hardware.broadcastradio@1.1-impl", +cc_binary { + name: "android.hardware.broadcastradio@1.1-service", + init_rc: ["android.hardware.broadcastradio@1.1-service.rc"], vendor: true, relative_install_path: "hw", cflags: [ @@ -29,16 +30,18 @@ cc_library_shared { "Tuner.cpp", "VirtualProgram.cpp", "VirtualRadio.cpp", + "service.cpp" ], static_libs: [ "android.hardware.broadcastradio@1.1-utils-lib", ], shared_libs: [ - "libhidlbase", - "libhidltransport", - "libutils", - "liblog", "android.hardware.broadcastradio@1.0", "android.hardware.broadcastradio@1.1", + "libbase", + "libhidlbase", + "libhidltransport", + "liblog", + "libutils", ], } diff --git a/broadcastradio/1.1/default/android.hardware.broadcastradio@1.1-service.rc b/broadcastradio/1.1/default/android.hardware.broadcastradio@1.1-service.rc new file mode 100644 index 0000000000..7c57135fc2 --- /dev/null +++ b/broadcastradio/1.1/default/android.hardware.broadcastradio@1.1-service.rc @@ -0,0 +1,4 @@ +service broadcastradio-hal /vendor/bin/hw/android.hardware.broadcastradio@1.1-service + class hal + user audioserver + group audio diff --git a/broadcastradio/1.1/default/service.cpp b/broadcastradio/1.1/default/service.cpp new file mode 100644 index 0000000000..f8af0b78cb --- /dev/null +++ b/broadcastradio/1.1/default/service.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 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 "BroadcastRadioDefault.service" + +#include +#include + +#include "BroadcastRadioFactory.h" + +using android::hardware::configureRpcThreadpool; +using android::hardware::joinRpcThreadpool; +using android::hardware::broadcastradio::V1_1::implementation::BroadcastRadioFactory; + +int main(int /* argc */, char** /* argv */) { + configureRpcThreadpool(4, true); + + BroadcastRadioFactory broadcastRadioFactory; + auto status = broadcastRadioFactory.registerAsService(); + CHECK_EQ(status, android::OK) << "Failed to register Broadcast Radio HAL implementation"; + + joinRpcThreadpool(); + return 1; // joinRpcThreadpool shouldn't exit +} From 218c6d8b2f6b0a87a127c324cdf7ecc5c89ee7b3 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Fri, 25 Aug 2017 17:10:07 -0700 Subject: [PATCH 166/265] Fix HALs to not have transitive depends. Bug in hidl-gen allowed this to work. Test: -Lcheck Bug: 65055216 Change-Id: Ia0cbaac4c8bfd93be169f4fab5c9ce016ee6c473 --- cas/native/1.0/IDescrambler.hal | 1 + cas/native/1.0/types.hal | 2 -- current.txt | 13 +++++-------- radio/1.1/IRadioResponse.hal | 1 + 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/cas/native/1.0/IDescrambler.hal b/cas/native/1.0/IDescrambler.hal index 459e5e3006..4822111d2f 100644 --- a/cas/native/1.0/IDescrambler.hal +++ b/cas/native/1.0/IDescrambler.hal @@ -16,6 +16,7 @@ package android.hardware.cas.native@1.0; import android.hardware.cas@1.0::IDescramblerBase; +import android.hardware.cas@1.0::Status; /** * IDescrambler is the native plugin API for descrambling operations. diff --git a/cas/native/1.0/types.hal b/cas/native/1.0/types.hal index a576d0390b..d75338b588 100644 --- a/cas/native/1.0/types.hal +++ b/cas/native/1.0/types.hal @@ -16,8 +16,6 @@ package android.hardware.cas.native@1.0; -import android.hardware.cas@1.0::types; - /** * Enumerates the keys used to scramble the content. */ diff --git a/current.txt b/current.txt index 1eb290b886..c0dd0fa762 100644 --- a/current.txt +++ b/current.txt @@ -187,7 +187,7 @@ b12ef0bdd8a4d247a8a6e960b227ed32383f2b0241f55d67fcea6eff6a6737fa android.hardwar d8f0877ae1d321c1d884c7631dfe36cab0ec8a4b2863d4b687f85d3549a63bcc android.hardware.wifi.supplicant@1.0::ISupplicantStaNetworkCallback fe3c3c2f572b72f15f8594c538b0577bd5c28722c31879cfe6231330cddb6747 android.hardware.wifi.supplicant@1.0::types -# ABI preserving changes to HALs released in Android O +# ABI preserving changes to HALs during Android O MR1 (Initial Set) 05e0edf31db5b3ae19047d87059545cc2f836023edf8f9d969319e15e3485158 android.hardware.automotive.vehicle@2.0::types 150a338ce11fcec70757c9675d83cf6a5d7b40d0c812741b91671fecce59eac9 android.hardware.broadcastradio@1.0::types @@ -226,8 +226,8 @@ b18caefefcc765092412285d776234fcf213b73bdf07ae1b67a5f71b2d2464e3 android.hardwar c26473e2e4a00af43e28a0ddf9002e5062a7d0940429e5efb6e5513a8abcb75c android.hardware.wifi@1.1::IWifi b056e1defab4071584214584057d0bc73a613081bf1152590549649d4582c13c android.hardware.wifi@1.1::IWifiChip -# ABI preserving changes to HALs released in Android O MR1 (Initial Set) -# None +# ABI preserving changes to HALs during Android O MR1 (Final Set) +05aa3de6130a9788fdb6f4d3cc57c3ea90f067e77a5e09d6a772ec7f6bca33d2 android.hardware.radio@1.1::IRadioResponse # HALs released in Android O MR1 (Final Set) 044cb039378b8a0e36f40ff1e6ce04dc0d339da02095f968d5062a051e99d108 android.hardware.broadcastradio@1.1::types @@ -242,10 +242,7 @@ bbcfc3f748b078f6a66c4e228084a679d30bd61bfde8bb7a91efd507b91c1bfd android.hardwar b80e1456b81f80032d0de7cb45652ac15af11e7474d520d757481ecaad796dff android.hardware.cas@1.0::ICasListener a432d6d9200248dc2126827bcd6cdea31dd65eff39b939f64585d27d915a5857 android.hardware.cas@1.0::IDescramblerBase 86ba9c03978b79a742e990420bc5ced0673d25a939f82572996bef92621e2014 android.hardware.cas@1.0::IMediaCasService -8ad23abc3f380c7f1d0f944a93a997417d7536b6a522dc88b2699ff5ef5db4ec android.hardware.cas.native@1.0::types -71106c24093507954ce2aec243c8377e3ac54ebb9803c611e51620addf2af9a2 android.hardware.cas.native@1.0::IDescrambler +503da837d1a67cbdb7c08a033e927e5430ae1b159d98bf72c6336b4dcc5e76f5 android.hardware.cas.native@1.0::types +619600109232ed64b827c8a11beed8070b1827ae464547d7aa146cf0473b4bca android.hardware.cas.native@1.0::IDescrambler f4945e397b5dea41bb64518dfde59be71245d8a125fd1e0acffeb57ac7b08fed android.hardware.thermal@1.1::IThermal c8bc853546dd55584611def2a9fa1d99f657e3366c976d2f60fe6b8aa6d2cb87 android.hardware.thermal@1.1::IThermalCallback - -# ABI preserving changes to HALs released in Android O MR1 (Final Set) -# None diff --git a/radio/1.1/IRadioResponse.hal b/radio/1.1/IRadioResponse.hal index 4e7bf43dec..759602b004 100644 --- a/radio/1.1/IRadioResponse.hal +++ b/radio/1.1/IRadioResponse.hal @@ -16,6 +16,7 @@ package android.hardware.radio@1.1; +import @1.0::RadioResponseInfo; import @1.0::IRadioResponse; /** From 155344b8660975700905023032da42fda59632c7 Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Fri, 11 Aug 2017 15:47:42 -0700 Subject: [PATCH 167/265] wifi(implementation): Make WifiLegacyHal.stop() blocking IWifi::stop() is currently non-blocking which makes it hard for the client to determing when the stop is fully complete. This for example causes wificond to disable the wlan0 interface while the legacy HAL stop is being processed. So, add a timed wait to let the legacy HAL complete processing of the stop before we unblock the IWifi::stop() HIDL call. Bug: 64611487 Test: Manual tests by wifi state toggling and verifying the order of events in logs: 08-15 19:17:53.302 796 796 I android.hardware.wifi@1.0-service: Stopping legacy HAL 08-15 19:17:53.302 796 796 I WifiHAL : Sent msg on exit sock to unblock poll() 08-15 19:17:53.302 796 4793 E CLD80211: /vendor/bin/hw/android.hardware.wifi@1.0-service: Could not find group host_logs, errno: 0 id: -2 08-15 19:17:53.302 796 4793 E CLD80211: /vendor/bin/hw/android.hardware.wifi@1.0-service: Could not find group fw_logs, errno: 0 id: -2 08-15 19:17:53.302 796 4793 E CLD80211: /vendor/bin/hw/android.hardware.wifi@1.0-service: Could not find group per_pkt_stats, errno: 0 id: -2 08-15 19:17:53.302 796 4793 E CLD80211: /vendor/bin/hw/android.hardware.wifi@1.0-service: Could not find group diag_events, errno: 0 id: -2 08-15 19:17:53.302 796 4793 E CLD80211: /vendor/bin/hw/android.hardware.wifi@1.0-service: Could not find group fatal_events, errno: 0 id: -2 08-15 19:17:53.302 796 4793 I CLD80211: /vendor/bin/hw/android.hardware.wifi@1.0-service: Sent msg on exit sock to unblock poll() 08-15 19:17:53.302 796 4793 I android.hardware.wifi@1.0-service: Legacy HAL stop complete callback received 08-15 19:17:53.304 802 838 D CHRE : @ 151.328: [Platform] wifi: has 0, enabled 0 08-15 19:17:53.321 796 4793 I android.hardware.wifi@1.0-service: Legacy HAL event loop terminated 08-15 19:17:53.321 796 796 I android.hardware.wifi@1.0-service: Legacy HAL stop complete 08-15 19:17:53.522 796 796 I android.hardware.wifi@1.0-service: Wifi HAL stopped Test: Will send for regression tests. Change-Id: I394c11724e9459a4b9a6b970e2bcb4e0ad65fefc --- wifi/1.1/default/hidl_return_util.h | 19 +++++++++++++++++++ wifi/1.1/default/wifi.cpp | 15 +++++++++------ wifi/1.1/default/wifi.h | 5 +++-- wifi/1.1/default/wifi_legacy_hal.cpp | 22 ++++++++++++++++++---- wifi/1.1/default/wifi_legacy_hal.h | 8 ++++++-- 5 files changed, 55 insertions(+), 14 deletions(-) diff --git a/wifi/1.1/default/hidl_return_util.h b/wifi/1.1/default/hidl_return_util.h index 2f95c23d7e..f36c8bda8a 100644 --- a/wifi/1.1/default/hidl_return_util.h +++ b/wifi/1.1/default/hidl_return_util.h @@ -55,6 +55,25 @@ Return validateAndCall( return Void(); } +// Use for HIDL methods which return only an instance of WifiStatus. +// This version passes the global lock acquired to the body of the method. +// Note: Only used by IWifi::stop() currently. +template +Return validateAndCallWithLock( + ObjT* obj, + WifiStatusCode status_code_if_invalid, + WorkFuncT&& work, + const std::function& hidl_cb, + Args&&... args) { + auto lock = hidl_sync_util::acquireGlobalLock(); + if (obj->isValid()) { + hidl_cb((obj->*work)(&lock, std::forward(args)...)); + } else { + hidl_cb(createWifiStatus(status_code_if_invalid)); + } + return Void(); +} + // Use for HIDL methods which return instance of WifiStatus and a single return // value. template diff --git a/wifi/1.1/default/wifi.cpp b/wifi/1.1/default/wifi.cpp index 8456b90e9f..1741af44ba 100644 --- a/wifi/1.1/default/wifi.cpp +++ b/wifi/1.1/default/wifi.cpp @@ -31,6 +31,7 @@ namespace wifi { namespace V1_1 { namespace implementation { using hidl_return_util::validateAndCall; +using hidl_return_util::validateAndCallWithLock; Wifi::Wifi() : legacy_hal_(new legacy_hal::WifiLegacyHal()), @@ -64,8 +65,8 @@ Return Wifi::start(start_cb hidl_status_cb) { } Return Wifi::stop(stop_cb hidl_status_cb) { - return validateAndCall( - this, WifiStatusCode::ERROR_UNKNOWN, &Wifi::stopInternal, hidl_status_cb); + return validateAndCallWithLock(this, WifiStatusCode::ERROR_UNKNOWN, + &Wifi::stopInternal, hidl_status_cb); } Return Wifi::getChipIds(getChipIds_cb hidl_status_cb) { @@ -120,7 +121,8 @@ WifiStatus Wifi::startInternal() { return wifi_status; } -WifiStatus Wifi::stopInternal() { +WifiStatus Wifi::stopInternal( + /* NONNULL */ std::unique_lock* lock) { if (run_state_ == RunState::STOPPED) { return createWifiStatus(WifiStatusCode::SUCCESS); } else if (run_state_ == RunState::STOPPING) { @@ -133,7 +135,7 @@ WifiStatus Wifi::stopInternal() { chip_->invalidate(); chip_.clear(); } - WifiStatus wifi_status = stopLegacyHalAndDeinitializeModeController(); + WifiStatus wifi_status = stopLegacyHalAndDeinitializeModeController(lock); if (wifi_status.code == WifiStatusCode::SUCCESS) { for (const auto& callback : event_cb_handler_.getCallbacks()) { if (!callback->onStop().isOk()) { @@ -180,11 +182,12 @@ WifiStatus Wifi::initializeLegacyHal() { return createWifiStatus(WifiStatusCode::SUCCESS); } -WifiStatus Wifi::stopLegacyHalAndDeinitializeModeController() { +WifiStatus Wifi::stopLegacyHalAndDeinitializeModeController( + /* NONNULL */ std::unique_lock* lock) { run_state_ = RunState::STOPPING; const auto on_complete_callback_ = [&]() { run_state_ = RunState::STOPPED; }; legacy_hal::wifi_error legacy_status = - legacy_hal_->stop(on_complete_callback_); + legacy_hal_->stop(lock, on_complete_callback_); if (legacy_status != legacy_hal::WIFI_SUCCESS) { LOG(ERROR) << "Failed to stop legacy HAL: " << legacyErrorToString(legacy_status); diff --git a/wifi/1.1/default/wifi.h b/wifi/1.1/default/wifi.h index 1ade2d8b9b..3a64cbd490 100644 --- a/wifi/1.1/default/wifi.h +++ b/wifi/1.1/default/wifi.h @@ -61,12 +61,13 @@ class Wifi : public V1_1::IWifi { WifiStatus registerEventCallbackInternal( const sp& event_callback); WifiStatus startInternal(); - WifiStatus stopInternal(); + WifiStatus stopInternal(std::unique_lock* lock); std::pair> getChipIdsInternal(); std::pair> getChipInternal(ChipId chip_id); WifiStatus initializeLegacyHal(); - WifiStatus stopLegacyHalAndDeinitializeModeController(); + WifiStatus stopLegacyHalAndDeinitializeModeController( + std::unique_lock* lock); // Instance is created in this root level |IWifi| HIDL interface object // and shared with all the child HIDL interface objects. diff --git a/wifi/1.1/default/wifi_legacy_hal.cpp b/wifi/1.1/default/wifi_legacy_hal.cpp index 151a6009bb..a6f6971f38 100644 --- a/wifi/1.1/default/wifi_legacy_hal.cpp +++ b/wifi/1.1/default/wifi_legacy_hal.cpp @@ -15,6 +15,7 @@ */ #include +#include #include #include @@ -34,6 +35,7 @@ static constexpr uint32_t kMaxGscanFrequenciesForBand = 64; static constexpr uint32_t kLinkLayerStatsDataMpduSizeThreshold = 128; static constexpr uint32_t kMaxWakeReasonStatsArraySize = 32; static constexpr uint32_t kMaxRingBuffers = 10; +static constexpr uint32_t kMaxStopCompleteWaitMs = 50; // Helper function to create a non-const char* for legacy Hal API's. std::vector makeCharVec(const std::string& str) { @@ -53,7 +55,8 @@ namespace legacy_hal { // Legacy HAL functions accept "C" style function pointers, so use global // functions to pass to the legacy HAL function and store the corresponding // std::function methods to be invoked. -// Callback to be invoked once |stop| is complete. +// +// Callback to be invoked once |stop| is complete std::function on_stop_complete_internal_callback; void onAsyncStopComplete(wifi_handle handle) { const auto lock = hidl_sync_util::acquireGlobalLock(); @@ -369,6 +372,7 @@ wifi_error WifiLegacyHal::start() { } wifi_error WifiLegacyHal::stop( + /* NONNULL */ std::unique_lock* lock, const std::function& on_stop_complete_user_callback) { if (!is_started_) { LOG(DEBUG) << "Legacy HAL already stopped"; @@ -376,19 +380,27 @@ wifi_error WifiLegacyHal::stop( return WIFI_SUCCESS; } LOG(DEBUG) << "Stopping legacy HAL"; - on_stop_complete_internal_callback = [on_stop_complete_user_callback, - this](wifi_handle handle) { + on_stop_complete_internal_callback = + [on_stop_complete_user_callback, this](wifi_handle handle) { CHECK_EQ(global_handle_, handle) << "Handle mismatch"; + LOG(INFO) << "Legacy HAL stop complete callback received"; // Invalidate all the internal pointers now that the HAL is // stopped. invalidate(); iface_tool_.SetWifiUpState(false); on_stop_complete_user_callback(); + is_started_ = false; }; awaiting_event_loop_termination_ = true; global_func_table_.wifi_cleanup(global_handle_, onAsyncStopComplete); + const auto status = stop_wait_cv_.wait_for( + *lock, std::chrono::milliseconds(kMaxStopCompleteWaitMs), + [this] { return !awaiting_event_loop_termination_; }); + if (!status) { + LOG(ERROR) << "Legacy HAL stop failed or timed out"; + return WIFI_ERROR_UNKNOWN; + } LOG(DEBUG) << "Legacy HAL stop complete"; - is_started_ = false; return WIFI_SUCCESS; } @@ -1257,11 +1269,13 @@ wifi_error WifiLegacyHal::retrieveWlanInterfaceHandle() { void WifiLegacyHal::runEventLoop() { LOG(DEBUG) << "Starting legacy HAL event loop"; global_func_table_.wifi_event_loop(global_handle_); + const auto lock = hidl_sync_util::acquireGlobalLock(); if (!awaiting_event_loop_termination_) { LOG(FATAL) << "Legacy HAL event loop terminated, but HAL was not stopping"; } LOG(DEBUG) << "Legacy HAL event loop terminated"; awaiting_event_loop_termination_ = false; + stop_wait_cv_.notify_one(); } std::pair> diff --git a/wifi/1.1/default/wifi_legacy_hal.h b/wifi/1.1/default/wifi_legacy_hal.h index caa1bd50fc..549880398f 100644 --- a/wifi/1.1/default/wifi_legacy_hal.h +++ b/wifi/1.1/default/wifi_legacy_hal.h @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -149,8 +150,10 @@ class WifiLegacyHal { wifi_error initialize(); // Start the legacy HAL and the event looper thread. wifi_error start(); - // Deinitialize the legacy HAL and stop the event looper thread. - wifi_error stop(const std::function& on_complete_callback); + // Deinitialize the legacy HAL and wait for the event loop thread to exit + // using a predefined timeout. + wifi_error stop(std::unique_lock* lock, + const std::function& on_complete_callback); // Wrappers for all the functions in the legacy HAL function table. std::pair getDriverVersion(); std::pair getFirmwareVersion(); @@ -293,6 +296,7 @@ class WifiLegacyHal { wifi_interface_handle wlan_interface_handle_; // Flag to indicate if we have initiated the cleanup of legacy HAL. std::atomic awaiting_event_loop_termination_; + std::condition_variable_any stop_wait_cv_; // Flag to indicate if the legacy HAL has been started. bool is_started_; wifi_system::InterfaceTool iface_tool_; From 3078a4cb67f54922d50c66f227659b9b1d81a0a1 Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Mon, 28 Aug 2017 16:14:22 -0700 Subject: [PATCH 168/265] wifi(implementation): Remove unnecessary local variable Bug: 65058323 Test: Compiles Change-Id: Ib268234837f5b381572c8038e7900a145fb32249 --- wifi/1.1/default/wifi.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wifi/1.1/default/wifi.cpp b/wifi/1.1/default/wifi.cpp index 1741af44ba..c46ef950e9 100644 --- a/wifi/1.1/default/wifi.cpp +++ b/wifi/1.1/default/wifi.cpp @@ -185,9 +185,8 @@ WifiStatus Wifi::initializeLegacyHal() { WifiStatus Wifi::stopLegacyHalAndDeinitializeModeController( /* NONNULL */ std::unique_lock* lock) { run_state_ = RunState::STOPPING; - const auto on_complete_callback_ = [&]() { run_state_ = RunState::STOPPED; }; legacy_hal::wifi_error legacy_status = - legacy_hal_->stop(lock, on_complete_callback_); + legacy_hal_->stop(lock, [&]() { run_state_ = RunState::STOPPED; }); if (legacy_status != legacy_hal::WIFI_SUCCESS) { LOG(ERROR) << "Failed to stop legacy HAL: " << legacyErrorToString(legacy_status); From 6afb992759bc8dda6182a45c2b376fb1c2777076 Mon Sep 17 00:00:00 2001 From: Zhuoyao Zhang Date: Thu, 24 Aug 2017 16:35:50 -0700 Subject: [PATCH 169/265] Update vts test to use the updated test template. * For registerTestService/getServiceName, no need to pass any hard coded string of HAL service FQName. * Affect test: VtsHalCameraProviderV2_4TargetTest, VtsHalGraphicsComposerV2_1TargetTest, VtsHalNeuralnetworksV1_0TargetTest Bug: 62946472 Bug: 64203181 Test: make vts vts-tradefed run vts -m VtsHalCameraProviderV2_4Target Merged-In: If365ab2ed9a91eb4013d71769804b9d4bf089d66 Change-Id: Id0bddbc2949337147557f45cc60dbfaa114ce25e (cherry picked from commit d71b654d6d86245dec330aa5b338b39dcb728a22) --- .../VtsHalCameraProviderV2_4TargetTest.cpp | 7 +--- .../VtsHalGraphicsComposerV2_1TargetTest.cpp | 37 ++++++++++++++----- .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 8 ++-- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index e6cd3b4508..1392896533 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -101,7 +101,6 @@ using ::android::hardware::kSynchronizedReadWrite; using ResultMetadataQueue = MessageQueue; using ::android::hidl::manager::V1_0::IServiceManager; -const char *kProviderFQName = "android.hardware.camera.provider@2.4::ICameraProvider"; const uint32_t kMaxPreviewWidth = 1920; const uint32_t kMaxPreviewHeight = 1080; const uint32_t kMaxVideoWidth = 4096; @@ -243,9 +242,7 @@ class CameraHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase { virtual void HidlTearDown() override { ALOGI("TearDown CameraHidlEnvironment"); } - virtual void registerTestServices() override { - registerTestService("android.hardware.camera.provider", "2.4", "ICameraProvider"); - } + virtual void registerTestServices() override { registerTestService(); } private: CameraHidlEnvironment() {} @@ -496,7 +493,7 @@ Return PreviewWindowCb::setTimestamp(int64_t timestamp) { class CameraHidlTest : public ::testing::VtsHalHidlTargetTestBase { public: virtual void SetUp() override { - string service_name = CameraHidlEnvironment::Instance()->getServiceName(kProviderFQName); + string service_name = CameraHidlEnvironment::Instance()->getServiceName(); ALOGI("get service with name: %s", service_name.c_str()); mProvider = ::testing::VtsHalHidlTargetTestBase::getService(service_name); ASSERT_NE(mProvider, nullptr); diff --git a/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp b/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp index 0f03546558..18955da0b3 100644 --- a/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp +++ b/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp @@ -50,21 +50,40 @@ using android::hardware::graphics::mapper::V2_0::IMapper; using android::hardware::graphics::mapper::V2_0::tests::Gralloc; using GrallocError = android::hardware::graphics::mapper::V2_0::Error; +// Test environment for graphics.composer +class GraphicsComposerHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase { + public: + // get the test environment singleton + static GraphicsComposerHidlEnvironment* Instance() { + static GraphicsComposerHidlEnvironment* instance = new GraphicsComposerHidlEnvironment; + return instance; + } + + virtual void registerTestServices() override { registerTestService(); } + + private: + GraphicsComposerHidlEnvironment() {} + + GTEST_DISALLOW_COPY_AND_ASSIGN_(GraphicsComposerHidlEnvironment); +}; + class GraphicsComposerHidlTest : public ::testing::VtsHalHidlTargetTestBase { protected: void SetUp() override { - ASSERT_NO_FATAL_FAILURE(mComposer = std::make_unique()); - ASSERT_NO_FATAL_FAILURE(mComposerClient = mComposer->createClient()); + ASSERT_NO_FATAL_FAILURE( + mComposer = std::make_unique( + GraphicsComposerHidlEnvironment::Instance()->getServiceName())); + ASSERT_NO_FATAL_FAILURE(mComposerClient = mComposer->createClient()); - mComposerCallback = new GraphicsComposerCallback; - mComposerClient->registerCallback(mComposerCallback); + mComposerCallback = new GraphicsComposerCallback; + mComposerClient->registerCallback(mComposerCallback); - // assume the first display is primary and is never removed - mPrimaryDisplay = waitForFirstDisplay(); + // assume the first display is primary and is never removed + mPrimaryDisplay = waitForFirstDisplay(); - // explicitly disable vsync - mComposerClient->setVsyncEnabled(mPrimaryDisplay, false); - mComposerCallback->setVsyncAllowed(false); + // explicitly disable vsync + mComposerClient->setVsyncEnabled(mPrimaryDisplay, false); + mComposerCallback->setVsyncAllowed(false); } void TearDown() override { diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp index 930ddcaee8..84e67cb9fa 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -40,15 +40,13 @@ NeuralnetworksHidlEnvironment* NeuralnetworksHidlEnvironment::getInstance() { } void NeuralnetworksHidlEnvironment::registerTestServices() { - registerTestService("android.hardware.neuralnetworks", "1.0", "IDevice"); + registerTestService(); } // The main test class for NEURALNETWORK HIDL HAL. void NeuralnetworksHidlTest::SetUp() { - std::string instance = - NeuralnetworksHidlEnvironment::getInstance()->getServiceName(IDevice::descriptor); - LOG(INFO) << "running vts test with instance: " << instance; - device = ::testing::VtsHalHidlTargetTestBase::getService(instance); + device = ::testing::VtsHalHidlTargetTestBase::getService( + NeuralnetworksHidlEnvironment::getInstance()); ASSERT_NE(nullptr, device.get()); } From 065f08d09b0fdfe425de81e2abd593d64f0dcae6 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Tue, 29 Aug 2017 18:37:21 -0700 Subject: [PATCH 170/265] cas: fix missing error code conversion bug: 22804304 Change-Id: Ia950e12f7feef3eeb16596c0939aaeb61bfdf5df --- cas/1.0/default/TypeConvert.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cas/1.0/default/TypeConvert.cpp b/cas/1.0/default/TypeConvert.cpp index de1f92bcb3..cd0efdbc2a 100644 --- a/cas/1.0/default/TypeConvert.cpp +++ b/cas/1.0/default/TypeConvert.cpp @@ -62,6 +62,9 @@ Status toStatus(status_t legacyStatus) { case android::ERROR_CAS_DEVICE_REVOKED: status = Status::ERROR_CAS_DEVICE_REVOKED; break; + case android::ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED: + status = Status::ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED; + break; case android::ERROR_CAS_DECRYPT: status = Status::ERROR_CAS_DECRYPT; break; From ad3ef076cfc948fd772ef2b442e40695eb4bdaba Mon Sep 17 00:00:00 2001 From: Wyatt Riley Date: Tue, 29 Aug 2017 17:47:11 -0700 Subject: [PATCH 171/265] Adding owners for gnss hardware interfaces Bug # is example where owners file would have appropriate expedited the fix. Bug: 64482271 Test: Treehugger (if relevant) - OWNERS file only Change-Id: If82a2794ae40d48542006674c3c57a1e21c5124b --- gnss/1.0/default/OWNERS | 3 +++ gnss/1.0/vts/OWNERS | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 gnss/1.0/default/OWNERS create mode 100644 gnss/1.0/vts/OWNERS diff --git a/gnss/1.0/default/OWNERS b/gnss/1.0/default/OWNERS new file mode 100644 index 0000000000..6c25bd7c22 --- /dev/null +++ b/gnss/1.0/default/OWNERS @@ -0,0 +1,3 @@ +wyattriley@google.com +gomo@google.com +smalkos@google.com diff --git a/gnss/1.0/vts/OWNERS b/gnss/1.0/vts/OWNERS new file mode 100644 index 0000000000..937d70aa67 --- /dev/null +++ b/gnss/1.0/vts/OWNERS @@ -0,0 +1,7 @@ +wyattriley@google.com +gomo@google.com +smalkos@google.com + +# VTS team +yim@google.com +trong@google.com \ No newline at end of file From 02ffb2be413d4cbaaefa1313903e1f108eda4c9e Mon Sep 17 00:00:00 2001 From: Shawn Willden Date: Fri, 11 Aug 2017 14:33:44 -0600 Subject: [PATCH 172/265] Don't send more than 2K to addRngEntropy Bug: 63745893 Test: VtsHalKeymasterV3_0TargetTest Change-Id: I136920d3b62e026b22fbe06594bc40ccddc57dc3 (cherry picked from commit 3e1267edf0621185043482a805fcec0fa2a63719) --- keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp b/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp index b950765118..c8d6fc0e76 100644 --- a/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp +++ b/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp @@ -3864,7 +3864,7 @@ TEST_F(AddEntropyTest, AddEmptyEntropy) { * Verifies that the addRngEntropy method doesn't blow up when given a largish amount of data. */ TEST_F(AddEntropyTest, AddLargeEntropy) { - EXPECT_EQ(ErrorCode::OK, keymaster().addRngEntropy(HidlBuf(string(16 * 1024, 'a')))); + EXPECT_EQ(ErrorCode::OK, keymaster().addRngEntropy(HidlBuf(string(2 * 1024, 'a')))); } typedef KeymasterHidlTest AttestationTest; From df5dd34d6526e4c8253890b7bdcc5c230b07b866 Mon Sep 17 00:00:00 2001 From: Miao Wang Date: Tue, 29 Aug 2017 17:43:19 -0700 Subject: [PATCH 173/265] Add OEM_OPERATION to NN HAL. Bug: 63905942 Test: mm Test: All unit tests pass on Sailfish Change-Id: I8c8068b248d682fbf1db37de78666c9cbca376b4 --- neuralnetworks/1.0/types.hal | 69 ++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index 4bd6a08634..959506ab9e 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -41,40 +41,41 @@ enum OperandType : uint32_t { // TODO: Currently they are the same. Add a conversion when finalizing the model. // When modifying, be sure to update HAL_NUM_OPERATION_TYPES in HalIntefaces.h. enum OperationType : uint32_t { - AVERAGE_POOL = 0, - CONCATENATION = 1, - CONV = 2, - DEPTHWISE_CONV = 3, - MAX_POOL = 4, - L2_POOL = 5, - DEPTH_TO_SPACE = 6, - SPACE_TO_DEPTH = 7, - LOCAL_RESPONSE_NORMALIZATION = 8, - SOFTMAX = 9, - RESHAPE = 10, - SPLIT = 11, - FAKE_QUANT = 12, - ADD = 13, - FULLY_CONNECTED = 14, - CAST = 15, - MUL = 16, - L2_NORMALIZATION = 17, - LOGISTIC = 18, - RELU = 19, - RELU6 = 20, - RELU1 = 21, - TANH = 22, - DEQUANTIZE = 23, - FLOOR = 24, - GATHER = 25, - RESIZE_BILINEAR = 26, - LSH_PROJECTION = 27, - LSTM = 28, - SVDF = 29, - RNN = 30, - N_GRAM = 31, - EMBEDDING_LOOKUP = 32, - HASHTABLE_LOOKUP = 33, + OEM_OPERATION = 0, + AVERAGE_POOL = 1, + CONCATENATION = 2, + CONV = 3, + DEPTHWISE_CONV = 4, + MAX_POOL = 5, + L2_POOL = 6, + DEPTH_TO_SPACE = 7, + SPACE_TO_DEPTH = 8, + LOCAL_RESPONSE_NORMALIZATION = 9, + SOFTMAX = 10, + RESHAPE = 11, + SPLIT = 12, + FAKE_QUANT = 13, + ADD = 14, + FULLY_CONNECTED = 15, + CAST = 16, + MUL = 17, + L2_NORMALIZATION = 18, + LOGISTIC = 19, + RELU = 20, + RELU6 = 21, + RELU1 = 22, + TANH = 23, + DEQUANTIZE = 24, + FLOOR = 25, + GATHER = 26, + RESIZE_BILINEAR = 27, + LSH_PROJECTION = 28, + LSTM = 29, + SVDF = 30, + RNN = 31, + N_GRAM = 32, + EMBEDDING_LOOKUP = 33, + HASHTABLE_LOOKUP = 34, }; // Two special values that can be used instead of a regular poolIndex. From 425e9672d5a75ed629bcd94a1baf13848471451c Mon Sep 17 00:00:00 2001 From: Zhuoyao Zhang Date: Thu, 31 Aug 2017 12:51:57 -0700 Subject: [PATCH 174/265] Fix VtsHalGraphicsComposerV2_1TargetTest Bug: 65252969 Test: make vts Change-Id: Id4543b385ca9dce532bbf08ef206897924d66acb --- .../VtsHalGraphicsComposerV2_1TargetTest.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp b/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp index 18955da0b3..9a749d7837 100644 --- a/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp +++ b/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp @@ -23,6 +23,7 @@ #include "VtsHalGraphicsMapperTestUtils.h" #include +#include #include #include @@ -703,10 +704,11 @@ TEST_F(GraphicsComposerHidlCommandTest, SET_LAYER_Z_ORDER) { } // namespace android int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - - int status = RUN_ALL_TESTS(); - LOG(INFO) << "Test result = " << status; - - return status; + using android::hardware::graphics::composer::V2_1::tests::GraphicsComposerHidlEnvironment; + ::testing::AddGlobalTestEnvironment(GraphicsComposerHidlEnvironment::Instance()); + ::testing::InitGoogleTest(&argc, argv); + GraphicsComposerHidlEnvironment::Instance()->init(&argc, argv); + int status = RUN_ALL_TESTS(); + ALOGI("Test result = %d", status); + return status; } From 85db47a590188db98eda61e40144e3563a1b3484 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Thu, 31 Aug 2017 13:30:12 -0700 Subject: [PATCH 175/265] Update thermal hal Android.bp. Bug: 32920003 Bug: 64040096 Test: compiles Change-Id: I845672b2b07ddba9b73f702555231674b4f45ad1 --- thermal/1.1/Android.bp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/thermal/1.1/Android.bp b/thermal/1.1/Android.bp index 833f219ed6..0985d947b6 100644 --- a/thermal/1.1/Android.bp +++ b/thermal/1.1/Android.bp @@ -42,13 +42,16 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.thermal@1.1", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.thermal@1.1_genc++"], generated_headers: ["android.hardware.thermal@1.1_genc++_headers"], export_generated_headers: ["android.hardware.thermal@1.1_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", From a1b981b71018e34cf1441ec91c643e86ca65ad32 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Thu, 31 Aug 2017 13:35:03 -0700 Subject: [PATCH 176/265] Thermal 1.1 test statically links to hal def libs. Bug: 64040096 Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check --skip-preconditions --module VtsHalThermalV1_1Target Change-Id: I931dafbbdb518e387615909a69f83e6a37c4a62f --- thermal/1.1/vts/functional/Android.bp | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/thermal/1.1/vts/functional/Android.bp b/thermal/1.1/vts/functional/Android.bp index cea5bf84a5..f5f01faf2c 100644 --- a/thermal/1.1/vts/functional/Android.bp +++ b/thermal/1.1/vts/functional/Android.bp @@ -16,20 +16,11 @@ cc_test { name: "VtsHalThermalV1_1TargetTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalThermalV1_1TargetTest.cpp"], - shared_libs: [ - "liblog", - "libhidlbase", - "libhidltransport", - "libutils", + static_libs: [ "android.hardware.thermal@1.0", "android.hardware.thermal@1.1", ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], } From cc718d56acb62447376ca82a10e6b6e1a0971724 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Tue, 29 Aug 2017 14:37:44 -0700 Subject: [PATCH 177/265] Finalize O-MR1 compat matrix. Note, only new HALs for various shipping API levels are added. No required HALs are added. Test: (sanity) boot device w/o 'internal problem' error Bug: 63603463 Change-Id: Ia400bdaf5d167ce8637ecdf940c5ccd629c8a09a --- compatibility_matrix.26.xml | 62 +++++- compatibility_matrix.27.xml | 370 +++++++++++++++++++++++++++++++ compatibility_matrix.current.xml | 54 ++++- compatibility_matrix.legacy.xml | 62 +++++- 4 files changed, 527 insertions(+), 21 deletions(-) create mode 100644 compatibility_matrix.27.xml diff --git a/compatibility_matrix.26.xml b/compatibility_matrix.26.xml index c9b68a8e12..5c81f26616 100644 --- a/compatibility_matrix.26.xml +++ b/compatibility_matrix.26.xml @@ -57,7 +57,7 @@ android.hardware.broadcastradio - 1.0 + 1.0-1 IBroadcastRadioFactory default @@ -71,6 +71,14 @@ legacy/0 + + android.hardware.cas + 1.0 + + IMediaCasService + default + + android.hardware.configstore 1.0 @@ -204,8 +212,16 @@ - android.hardware.power + android.hardware.oemlock 1.0 + + IOemLock + default + + + + android.hardware.power + 1.0-1 IPower default @@ -213,7 +229,7 @@ android.hardware.radio - 1.0 + 1.0-1 IRadio slot1 @@ -256,8 +272,24 @@ - android.hardware.thermal + android.hardware.tetheroffload.config 1.0 + + IOffloadConfig + default + + + + android.hardware.tetheroffload.control + 1.0 + + IOffloadControl + default + + + + android.hardware.thermal + 1.0-1 IThermal default @@ -281,7 +313,7 @@ android.hardware.usb - 1.0 + 1.0-1 IUsb default @@ -289,7 +321,7 @@ android.hardware.vibrator - 1.0 + 1.0-1 IVibrator default @@ -304,13 +336,29 @@ - android.hardware.wifi + android.hardware.weaver 1.0 + + IWeaver + default + + + + android.hardware.wifi + 1.0-1 IWifi default + + android.hardware.wifi.offload + 1.0 + + IOffload + default + + android.hardware.wifi.supplicant 1.0 diff --git a/compatibility_matrix.27.xml b/compatibility_matrix.27.xml new file mode 100644 index 0000000000..22ca426bfa --- /dev/null +++ b/compatibility_matrix.27.xml @@ -0,0 +1,370 @@ + + + android.hardware.audio + 2.0 + + IDevicesFactory + default + + + + android.hardware.audio.effect + 2.0 + + IEffectsFactory + default + + + + android.hardware.automotive.evs + 1.0 + + IEvsEnumerator + default + + + + android.hardware.automotive.vehicle + 2.0 + + IVehicle + default + + + + android.hardware.biometrics.fingerprint + 2.1 + + IBiometricsFingerprint + default + + + + android.hardware.bluetooth + 1.0 + + IBluetoothHci + default + + + + android.hardware.boot + 1.0 + + IBootControl + default + + + + android.hardware.broadcastradio + 1.0-1 + + IBroadcastRadioFactory + default + + + + android.hardware.camera.provider + 2.4 + + ICameraProvider + legacy/0 + + + + android.hardware.cas + 1.0 + + IMediaCasService + default + + + + android.hardware.configstore + 1.0 + + ISurfaceFlingerConfigs + default + + + + android.hardware.contexthub + 1.0 + + IContexthub + default + + + + android.hardware.drm + 1.0 + + ICryptoFactory + default + + + IDrmFactory + default + + + + android.hardware.dumpstate + 1.0 + + IDumpstateDevice + default + + + + android.hardware.gatekeeper + 1.0 + + IGatekeeper + default + + + + android.hardware.gnss + 1.0 + + IGnss + default + + + + android.hardware.graphics.allocator + 2.0 + + IAllocator + default + + + + android.hardware.graphics.composer + 2.1 + + IComposer + default + + + + android.hardware.graphics.mapper + 2.0 + + IMapper + default + + + + android.hardware.health + 1.0 + + IHealth + default + + + + android.hardware.ir + 1.0 + + + android.hardware.keymaster + 3.0 + + IKeymasterDevice + default + + + + android.hardware.light + 2.0 + + ILight + default + + + + android.hardware.media.omx + 1.0 + + IOmx + default + + + IOmxStore + default + + + + android.hardware.memtrack + 1.0 + + IMemtrack + default + + + + android.hardware.nfc + 1.0 + + INfc + default + + + + android.hardware.oemlock + 1.0 + + IOemLock + default + + + + android.hardware.power + 1.0-1 + + IPower + default + + + + android.hardware.radio + 1.0-1 + + IRadio + slot1 + + + ISap + slot1 + + + + android.hardware.radio.deprecated + 1.0 + + IOemHook + slot1 + + + + android.hardware.renderscript + 1.0 + + IDevice + default + + + + android.hardware.sensors + 1.0 + + ISensors + default + + + + android.hardware.soundtrigger + 2.0 + + ISoundTriggerHw + default + + + + android.hardware.tetheroffload.config + 1.0 + + IOffloadConfig + default + + + + android.hardware.tetheroffload.control + 1.0 + + IOffloadControl + default + + + + android.hardware.thermal + 1.0-1 + + IThermal + default + + + + android.hardware.tv.cec + 1.0 + + IHdmiCec + default + + + + android.hardware.tv.input + 1.0 + + ITvInput + default + + + + android.hardware.usb + 1.0-1 + + IUsb + default + + + + android.hardware.vibrator + 1.0-1 + + IVibrator + default + + + + android.hardware.vr + 1.0 + + IVr + default + + + + android.hardware.weaver + 1.0 + + IWeaver + default + + + + android.hardware.wifi + 1.0-1 + + IWifi + default + + + + android.hardware.wifi.offload + 1.0 + + IOffload + default + + + + android.hardware.wifi.supplicant + 1.0 + + ISupplicant + default + + + diff --git a/compatibility_matrix.current.xml b/compatibility_matrix.current.xml index 8d50325e8a..22ca426bfa 100644 --- a/compatibility_matrix.current.xml +++ b/compatibility_matrix.current.xml @@ -57,7 +57,7 @@ android.hardware.broadcastradio - 1.0 + 1.0-1 IBroadcastRadioFactory default @@ -71,6 +71,14 @@ legacy/0 + + android.hardware.cas + 1.0 + + IMediaCasService + default + + android.hardware.configstore 1.0 @@ -206,10 +214,14 @@ android.hardware.oemlock 1.0 + + IOemLock + default + android.hardware.power - 1.0 + 1.0-1 IPower default @@ -217,7 +229,7 @@ android.hardware.radio - 1.0 + 1.0-1 IRadio slot1 @@ -260,8 +272,24 @@ - android.hardware.thermal + android.hardware.tetheroffload.config 1.0 + + IOffloadConfig + default + + + + android.hardware.tetheroffload.control + 1.0 + + IOffloadControl + default + + + + android.hardware.thermal + 1.0-1 IThermal default @@ -285,7 +313,7 @@ android.hardware.usb - 1.0 + 1.0-1 IUsb default @@ -293,7 +321,7 @@ android.hardware.vibrator - 1.0 + 1.0-1 IVibrator default @@ -310,15 +338,27 @@ android.hardware.weaver 1.0 + + IWeaver + default + android.hardware.wifi - 1.0 + 1.0-1 IWifi default + + android.hardware.wifi.offload + 1.0 + + IOffload + default + + android.hardware.wifi.supplicant 1.0 diff --git a/compatibility_matrix.legacy.xml b/compatibility_matrix.legacy.xml index ad6d4b93a3..5655fb97d5 100644 --- a/compatibility_matrix.legacy.xml +++ b/compatibility_matrix.legacy.xml @@ -57,7 +57,7 @@ android.hardware.broadcastradio - 1.0 + 1.0-1 IBroadcastRadioFactory default @@ -71,6 +71,14 @@ legacy/0 + + android.hardware.cas + 1.0 + + IMediaCasService + default + + android.hardware.configstore 1.0 @@ -204,8 +212,16 @@ - android.hardware.power + android.hardware.oemlock 1.0 + + IOemLock + default + + + + android.hardware.power + 1.0-1 IPower default @@ -213,7 +229,7 @@ android.hardware.radio - 1.0 + 1.0-1 IRadio slot1 @@ -256,8 +272,24 @@ - android.hardware.thermal + android.hardware.tetheroffload.config 1.0 + + IOffloadConfig + default + + + + android.hardware.tetheroffload.control + 1.0 + + IOffloadControl + default + + + + android.hardware.thermal + 1.0-1 IThermal default @@ -281,7 +313,7 @@ android.hardware.usb - 1.0 + 1.0-1 IUsb default @@ -289,7 +321,7 @@ android.hardware.vibrator - 1.0 + 1.0-1 IVibrator default @@ -304,13 +336,29 @@ - android.hardware.wifi + android.hardware.weaver 1.0 + + IWeaver + default + + + + android.hardware.wifi + 1.0-1 IWifi default + + android.hardware.wifi.offload + 1.0 + + IOffload + default + + android.hardware.wifi.supplicant 1.0 From 9a4b17e3e1ecb0dc0cd515d7445b7f200fc4b11b Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Tue, 29 Aug 2017 14:20:59 +0900 Subject: [PATCH 178/265] HAL interface libs for testing are now built as test lib The HAL interfaces for testing were copied to /system/lib[64]/vndk directory since they are built as cc_library and thus falsely recognized as members of VNDK, which isn't true. Build them as cc_test_library so that they are filtered out. To do so, .hidl_for_test files are added for the test HALs and update-makefiles.sh were ran. Bug: 64776708 Test: no android.hardware.tests.*.so file in /system/lib[64]/vndk on 2017 pixel devices Change-Id: I5314db6cc08a43bccfc4521d4b80b614a91e7e48 --- CleanSpec.mk | 2 ++ tests/bar/1.0/.hidl_for_test | 0 tests/bar/1.0/Android.bp | 2 +- tests/baz/1.0/.hidl_for_test | 0 tests/baz/1.0/Android.bp | 2 +- tests/expression/1.0/.hidl_for_test | 0 tests/expression/1.0/Android.bp | 2 +- tests/extension/light/2.0/.hidl_for_test | 0 tests/extension/light/2.0/Android.bp | 2 +- tests/foo/1.0/.hidl_for_test | 0 tests/foo/1.0/Android.bp | 2 +- tests/hash/1.0/.hidl_for_test | 0 tests/hash/1.0/Android.bp | 2 +- tests/inheritance/1.0/.hidl_for_test | 0 tests/inheritance/1.0/Android.bp | 2 +- tests/libhwbinder/1.0/.hidl_for_test | 0 tests/libhwbinder/1.0/Android.bp | 2 +- tests/libhwbinder/aidl/.hidl_for_test | 0 tests/memory/1.0/.hidl_for_test | 0 tests/memory/1.0/Android.bp | 2 +- tests/msgq/1.0/.hidl_for_test | 0 tests/msgq/1.0/Android.bp | 2 +- tests/multithread/1.0/.hidl_for_test | 0 tests/multithread/1.0/Android.bp | 2 +- tests/pointer/1.0/.hidl_for_test | 0 tests/pointer/1.0/Android.bp | 2 +- 26 files changed, 14 insertions(+), 12 deletions(-) create mode 100644 tests/bar/1.0/.hidl_for_test create mode 100644 tests/baz/1.0/.hidl_for_test create mode 100644 tests/expression/1.0/.hidl_for_test create mode 100644 tests/extension/light/2.0/.hidl_for_test create mode 100644 tests/foo/1.0/.hidl_for_test create mode 100644 tests/hash/1.0/.hidl_for_test create mode 100644 tests/inheritance/1.0/.hidl_for_test create mode 100644 tests/libhwbinder/1.0/.hidl_for_test create mode 100644 tests/libhwbinder/aidl/.hidl_for_test create mode 100644 tests/memory/1.0/.hidl_for_test create mode 100644 tests/msgq/1.0/.hidl_for_test create mode 100644 tests/multithread/1.0/.hidl_for_test create mode 100644 tests/pointer/1.0/.hidl_for_test diff --git a/CleanSpec.mk b/CleanSpec.mk index 5b31d1ea5b..dd4cee0269 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -61,3 +61,5 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/hw/android.hardware.auto $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib64/hw/android.hardware.automotive*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/init/android.hardware.automotive*) $(call add-clean-step, find $(PRODUCT_OUT)/system $(PRODUCT_OUT)/vendor -type f -name "android\.hardware\.configstore\@1\.1*" -print0 | xargs -0 rm -f) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/android.hardware.tests*) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/vndk/android.hardware.tests*) diff --git a/tests/bar/1.0/.hidl_for_test b/tests/bar/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/bar/1.0/Android.bp b/tests/bar/1.0/Android.bp index 2dbfb0f980..44ae7a5282 100644 --- a/tests/bar/1.0/Android.bp +++ b/tests/bar/1.0/Android.bp @@ -67,7 +67,7 @@ genrule { ], } -cc_library { +cc_test_library { name: "android.hardware.tests.bar@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.bar@1.0_genc++"], diff --git a/tests/baz/1.0/.hidl_for_test b/tests/baz/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/baz/1.0/Android.bp b/tests/baz/1.0/Android.bp index cec3039952..7fa8b272bc 100644 --- a/tests/baz/1.0/Android.bp +++ b/tests/baz/1.0/Android.bp @@ -60,7 +60,7 @@ genrule { ], } -cc_library { +cc_test_library { name: "android.hardware.tests.baz@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.baz@1.0_genc++"], diff --git a/tests/expression/1.0/.hidl_for_test b/tests/expression/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/expression/1.0/Android.bp b/tests/expression/1.0/Android.bp index 093b6607f9..0ea0acf6ae 100644 --- a/tests/expression/1.0/Android.bp +++ b/tests/expression/1.0/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_library { +cc_test_library { name: "android.hardware.tests.expression@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.expression@1.0_genc++"], diff --git a/tests/extension/light/2.0/.hidl_for_test b/tests/extension/light/2.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/extension/light/2.0/Android.bp b/tests/extension/light/2.0/Android.bp index 52117b41e0..e8a50174fd 100644 --- a/tests/extension/light/2.0/Android.bp +++ b/tests/extension/light/2.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_library { +cc_test_library { name: "android.hardware.tests.extension.light@2.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.extension.light@2.0_genc++"], diff --git a/tests/foo/1.0/.hidl_for_test b/tests/foo/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/foo/1.0/Android.bp b/tests/foo/1.0/Android.bp index d0038ab72e..b5de12e541 100644 --- a/tests/foo/1.0/Android.bp +++ b/tests/foo/1.0/Android.bp @@ -67,7 +67,7 @@ genrule { ], } -cc_library { +cc_test_library { name: "android.hardware.tests.foo@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.foo@1.0_genc++"], diff --git a/tests/hash/1.0/.hidl_for_test b/tests/hash/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/hash/1.0/Android.bp b/tests/hash/1.0/Android.bp index 336963e3fc..d4d1d1a9e2 100644 --- a/tests/hash/1.0/Android.bp +++ b/tests/hash/1.0/Android.bp @@ -35,7 +35,7 @@ genrule { ], } -cc_library { +cc_test_library { name: "android.hardware.tests.hash@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.hash@1.0_genc++"], diff --git a/tests/inheritance/1.0/.hidl_for_test b/tests/inheritance/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/inheritance/1.0/Android.bp b/tests/inheritance/1.0/Android.bp index a8c0e6ce38..93a8ad5182 100644 --- a/tests/inheritance/1.0/Android.bp +++ b/tests/inheritance/1.0/Android.bp @@ -56,7 +56,7 @@ genrule { ], } -cc_library { +cc_test_library { name: "android.hardware.tests.inheritance@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.inheritance@1.0_genc++"], diff --git a/tests/libhwbinder/1.0/.hidl_for_test b/tests/libhwbinder/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/libhwbinder/1.0/Android.bp b/tests/libhwbinder/1.0/Android.bp index 61326286a7..4f3beb0b32 100644 --- a/tests/libhwbinder/1.0/Android.bp +++ b/tests/libhwbinder/1.0/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_library { +cc_test_library { name: "android.hardware.tests.libhwbinder@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.libhwbinder@1.0_genc++"], diff --git a/tests/libhwbinder/aidl/.hidl_for_test b/tests/libhwbinder/aidl/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/memory/1.0/.hidl_for_test b/tests/memory/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/memory/1.0/Android.bp b/tests/memory/1.0/Android.bp index c5cc4a0c60..d39ba284bb 100644 --- a/tests/memory/1.0/Android.bp +++ b/tests/memory/1.0/Android.bp @@ -35,7 +35,7 @@ genrule { ], } -cc_library { +cc_test_library { name: "android.hardware.tests.memory@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.memory@1.0_genc++"], diff --git a/tests/msgq/1.0/.hidl_for_test b/tests/msgq/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/msgq/1.0/Android.bp b/tests/msgq/1.0/Android.bp index 017e0d4a9d..7758ee86ad 100644 --- a/tests/msgq/1.0/Android.bp +++ b/tests/msgq/1.0/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_library { +cc_test_library { name: "android.hardware.tests.msgq@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.msgq@1.0_genc++"], diff --git a/tests/multithread/1.0/.hidl_for_test b/tests/multithread/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/multithread/1.0/Android.bp b/tests/multithread/1.0/Android.bp index 68c19aa19f..76ad2c1ecb 100644 --- a/tests/multithread/1.0/Android.bp +++ b/tests/multithread/1.0/Android.bp @@ -35,7 +35,7 @@ genrule { ], } -cc_library { +cc_test_library { name: "android.hardware.tests.multithread@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.multithread@1.0_genc++"], diff --git a/tests/pointer/1.0/.hidl_for_test b/tests/pointer/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/pointer/1.0/Android.bp b/tests/pointer/1.0/Android.bp index 55598cacfd..178f165e38 100644 --- a/tests/pointer/1.0/Android.bp +++ b/tests/pointer/1.0/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_library { +cc_test_library { name: "android.hardware.tests.pointer@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.pointer@1.0_genc++"], From 4586fb7454db6a086fc474ac1d90ceb8870ae2d8 Mon Sep 17 00:00:00 2001 From: Sundong Ahn Date: Mon, 10 Jul 2017 13:56:10 +0900 Subject: [PATCH 179/265] Configstore HAL is down-revisioned to 1.0 Configstore was down-revisioned from 1.1 to 1.0 in oc-dr1-dev, oc-mr1-dev and oc-mr1-dev-plus-aosp. Therefore configstore in oc-dr1-dev-plus-aosp will also be down-revisioned to 1.0. Bug: 65124635 Test: build & boot test on sailfish + walleye Change-Id: Ia2614439cd620fbe5fbd427571ab55a15089cc47 Merged-In: Ia68993a22b975d9a5dd19175988077481ded7559 --- CleanSpec.mk | 3 +- compatibility_matrix.26.xml | 2 +- compatibility_matrix.current.xml | 2 +- compatibility_matrix.legacy.xml | 2 +- configstore/{1.1 => 1.0}/default/Android.mk | 5 +- .../default/SurfaceFlingerConfigs.cpp | 7 +- .../default/SurfaceFlingerConfigs.h | 17 ++--- ...ndroid.hardware.configstore@1.0-service.rc | 4 ++ configstore/{1.1 => 1.0}/default/service.cpp | 8 +-- .../{1.1 => 1.0}/default/surfaceflinger.mk | 0 configstore/1.1/Android.bp | 64 ------------------- configstore/1.1/Android.mk | 44 ------------- configstore/1.1/ISurfaceFlingerConfigs.hal | 25 -------- ...ndroid.hardware.configstore@1.1-service.rc | 4 -- configstore/1.1/vts/functional/Android.bp | 34 ---------- .../VtsHalConfigstoreV1_1TargetTest.cpp | 55 ---------------- configstore/Android.bp | 2 - 17 files changed, 24 insertions(+), 254 deletions(-) rename configstore/{1.1 => 1.0}/default/Android.mk (75%) rename configstore/{1.1 => 1.0}/default/SurfaceFlingerConfigs.cpp (96%) rename configstore/{1.1 => 1.0}/default/SurfaceFlingerConfigs.h (77%) create mode 100644 configstore/1.0/default/android.hardware.configstore@1.0-service.rc rename configstore/{1.1 => 1.0}/default/service.cpp (83%) rename configstore/{1.1 => 1.0}/default/surfaceflinger.mk (100%) delete mode 100644 configstore/1.1/Android.bp delete mode 100644 configstore/1.1/Android.mk delete mode 100644 configstore/1.1/ISurfaceFlingerConfigs.hal delete mode 100644 configstore/1.1/default/android.hardware.configstore@1.1-service.rc delete mode 100644 configstore/1.1/vts/functional/Android.bp delete mode 100644 configstore/1.1/vts/functional/VtsHalConfigstoreV1_1TargetTest.cpp diff --git a/CleanSpec.mk b/CleanSpec.mk index 01b5e7b7f9..14616e4b76 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -55,4 +55,5 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/init/android.hardware.bl $(call add-clean-step, rm -rf $(OUT)/soong/.intermediates/) $(call add-clean-step, rm -rf $(OUT_DIR)/soong/.intermediates/hardware/interfaces/) $(call add-clean-step, rm -rf $(OUT_DIR)/soong/.intermediates/hardware/interfaces/) -$(call add-clean-step, find $(PRODUCT_OUT)/system $(PRODUCT_OUT)/vendor -type f -name "android\.hardware\.configstore*" -print0 | xargs -0 rm -f) \ No newline at end of file +$(call add-clean-step, find $(PRODUCT_OUT)/system $(PRODUCT_OUT)/vendor -type f -name "android\.hardware\.configstore*" -print0 | xargs -0 rm -f) +$(call add-clean-step, find $(PRODUCT_OUT)/system $(PRODUCT_OUT)/vendor -type f -name "android\.hardware\.configstore\@1\.1*" -print0 | xargs -0 rm -f) diff --git a/compatibility_matrix.26.xml b/compatibility_matrix.26.xml index 9aa54188ad..8c715dd12a 100644 --- a/compatibility_matrix.26.xml +++ b/compatibility_matrix.26.xml @@ -73,7 +73,7 @@ android.hardware.configstore - 1.0-1 + 1.0 ISurfaceFlingerConfigs default diff --git a/compatibility_matrix.current.xml b/compatibility_matrix.current.xml index 9603bd6e15..e3c4e152b9 100644 --- a/compatibility_matrix.current.xml +++ b/compatibility_matrix.current.xml @@ -73,7 +73,7 @@ android.hardware.configstore - 1.0-1 + 1.0 ISurfaceFlingerConfigs default diff --git a/compatibility_matrix.legacy.xml b/compatibility_matrix.legacy.xml index 6167f25eb6..1dbbb0593d 100644 --- a/compatibility_matrix.legacy.xml +++ b/compatibility_matrix.legacy.xml @@ -73,7 +73,7 @@ android.hardware.configstore - 1.0-1 + 1.0 ISurfaceFlingerConfigs default diff --git a/configstore/1.1/default/Android.mk b/configstore/1.0/default/Android.mk similarity index 75% rename from configstore/1.1/default/Android.mk rename to configstore/1.0/default/Android.mk index ac3d8b039d..e017cfd284 100644 --- a/configstore/1.1/default/Android.mk +++ b/configstore/1.0/default/Android.mk @@ -2,18 +2,17 @@ LOCAL_PATH := $(call my-dir) ################################################################################ include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.configstore@1.1-service +LOCAL_MODULE := android.hardware.configstore@1.0-service LOCAL_PROPRIETARY_MODULE := true LOCAL_MODULE_CLASS := EXECUTABLES LOCAL_MODULE_RELATIVE_PATH := hw -LOCAL_INIT_RC := android.hardware.configstore@1.1-service.rc +LOCAL_INIT_RC := android.hardware.configstore@1.0-service.rc LOCAL_SRC_FILES:= service.cpp include $(LOCAL_PATH)/surfaceflinger.mk LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ - android.hardware.configstore@1.1 \ libhidlbase \ libhidltransport \ libbase \ diff --git a/configstore/1.1/default/SurfaceFlingerConfigs.cpp b/configstore/1.0/default/SurfaceFlingerConfigs.cpp similarity index 96% rename from configstore/1.1/default/SurfaceFlingerConfigs.cpp rename to configstore/1.0/default/SurfaceFlingerConfigs.cpp index 5a040f2a89..3239274f9f 100644 --- a/configstore/1.1/default/SurfaceFlingerConfigs.cpp +++ b/configstore/1.0/default/SurfaceFlingerConfigs.cpp @@ -19,7 +19,7 @@ namespace android { namespace hardware { namespace configstore { -namespace V1_1 { +namespace V1_0 { namespace implementation { // Methods from ::android::hardware::configstore::V1_0::ISurfaceFlingerConfigs @@ -139,13 +139,10 @@ Return SurfaceFlingerConfigs::startGraphicsAllocatorService( return Void(); } -// Methods from ::android::hardware::configstore::V1_1::ISurfaceFlingerConfigs -// follow. - // Methods from ::android::hidl::base::V1_0::IBase follow. } // namespace implementation -} // namespace V1_1 +} // namespace V1_0 } // namespace configstore } // namespace hardware } // namespace android diff --git a/configstore/1.1/default/SurfaceFlingerConfigs.h b/configstore/1.0/default/SurfaceFlingerConfigs.h similarity index 77% rename from configstore/1.1/default/SurfaceFlingerConfigs.h rename to configstore/1.0/default/SurfaceFlingerConfigs.h index 53e8ae8714..32e5fc3928 100644 --- a/configstore/1.1/default/SurfaceFlingerConfigs.h +++ b/configstore/1.0/default/SurfaceFlingerConfigs.h @@ -1,17 +1,17 @@ -#ifndef ANDROID_HARDWARE_CONFIGSTORE_V1_1_SURFACEFLINGERCONFIGS_H -#define ANDROID_HARDWARE_CONFIGSTORE_V1_1_SURFACEFLINGERCONFIGS_H +#ifndef ANDROID_HARDWARE_CONFIGSTORE_V1_0_SURFACEFLINGERCONFIGS_H +#define ANDROID_HARDWARE_CONFIGSTORE_V1_0_SURFACEFLINGERCONFIGS_H -#include +#include #include #include namespace android { namespace hardware { namespace configstore { -namespace V1_1 { +namespace V1_0 { namespace implementation { -using ::android::hardware::configstore::V1_1::ISurfaceFlingerConfigs; +using ::android::hardware::configstore::V1_0::ISurfaceFlingerConfigs; using ::android::hardware::Return; using ::android::hardware::Void; using ::android::sp; @@ -32,16 +32,13 @@ struct SurfaceFlingerConfigs : public ISurfaceFlingerConfigs { Return maxFrameBufferAcquiredBuffers(maxFrameBufferAcquiredBuffers_cb _hidl_cb) override; Return startGraphicsAllocatorService(startGraphicsAllocatorService_cb _hidl_cb) override; - // Methods from - // ::android::hardware::configstore::V1_1::ISurfaceFlingerConfigs follow. - // Methods from ::android::hidl::base::V1_0::IBase follow. }; } // namespace implementation -} // namespace V1_1 +} // namespace V1_0 } // namespace configstore } // namespace hardware } // namespace android -#endif // ANDROID_HARDWARE_CONFIGSTORE_V1_1_SURFACEFLINGERCONFIGS_H +#endif // ANDROID_HARDWARE_CONFIGSTORE_V1_0_SURFACEFLINGERCONFIGS_H diff --git a/configstore/1.0/default/android.hardware.configstore@1.0-service.rc b/configstore/1.0/default/android.hardware.configstore@1.0-service.rc new file mode 100644 index 0000000000..563d8541c3 --- /dev/null +++ b/configstore/1.0/default/android.hardware.configstore@1.0-service.rc @@ -0,0 +1,4 @@ +service configstore-hal-1-0 /vendor/bin/hw/android.hardware.configstore@1.0-service + class hal animation + user system + group system diff --git a/configstore/1.1/default/service.cpp b/configstore/1.0/default/service.cpp similarity index 83% rename from configstore/1.1/default/service.cpp rename to configstore/1.0/default/service.cpp index 3a4cd3fd67..3dca73938d 100644 --- a/configstore/1.1/default/service.cpp +++ b/configstore/1.0/default/service.cpp @@ -14,17 +14,17 @@ * limitations under the License. */ -#define LOG_TAG "android.hardware.configstore@1.1-service" +#define LOG_TAG "android.hardware.configstore@1.0-service" -#include +#include #include #include "SurfaceFlingerConfigs.h" using android::hardware::configureRpcThreadpool; using android::hardware::joinRpcThreadpool; -using android::hardware::configstore::V1_1::ISurfaceFlingerConfigs; -using android::hardware::configstore::V1_1::implementation::SurfaceFlingerConfigs; +using android::hardware::configstore::V1_0::ISurfaceFlingerConfigs; +using android::hardware::configstore::V1_0::implementation::SurfaceFlingerConfigs; using android::sp; using android::status_t; using android::OK; diff --git a/configstore/1.1/default/surfaceflinger.mk b/configstore/1.0/default/surfaceflinger.mk similarity index 100% rename from configstore/1.1/default/surfaceflinger.mk rename to configstore/1.0/default/surfaceflinger.mk diff --git a/configstore/1.1/Android.bp b/configstore/1.1/Android.bp deleted file mode 100644 index 92fb7c1399..0000000000 --- a/configstore/1.1/Android.bp +++ /dev/null @@ -1,64 +0,0 @@ -// This file is autogenerated by hidl-gen. Do not edit manually. - -filegroup { - name: "android.hardware.configstore@1.1_hal", - srcs: [ - "ISurfaceFlingerConfigs.hal", - ], -} - -genrule { - name: "android.hardware.configstore@1.1_genc++", - tools: ["hidl-gen"], - cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.1", - srcs: [ - ":android.hardware.configstore@1.1_hal", - ], - out: [ - "android/hardware/configstore/1.1/SurfaceFlingerConfigsAll.cpp", - ], -} - -genrule { - name: "android.hardware.configstore@1.1_genc++_headers", - tools: ["hidl-gen"], - cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.1", - srcs: [ - ":android.hardware.configstore@1.1_hal", - ], - out: [ - "android/hardware/configstore/1.1/ISurfaceFlingerConfigs.h", - "android/hardware/configstore/1.1/IHwSurfaceFlingerConfigs.h", - "android/hardware/configstore/1.1/BnHwSurfaceFlingerConfigs.h", - "android/hardware/configstore/1.1/BpHwSurfaceFlingerConfigs.h", - "android/hardware/configstore/1.1/BsSurfaceFlingerConfigs.h", - ], -} - -cc_library { - name: "android.hardware.configstore@1.1", - defaults: ["hidl-module-defaults"], - generated_sources: ["android.hardware.configstore@1.1_genc++"], - generated_headers: ["android.hardware.configstore@1.1_genc++_headers"], - export_generated_headers: ["android.hardware.configstore@1.1_genc++_headers"], - vendor_available: true, - vndk: { - enabled: true, - }, - shared_libs: [ - "libhidlbase", - "libhidltransport", - "libhwbinder", - "liblog", - "libutils", - "libcutils", - "android.hardware.configstore@1.0", - ], - export_shared_lib_headers: [ - "libhidlbase", - "libhidltransport", - "libhwbinder", - "libutils", - "android.hardware.configstore@1.0", - ], -} diff --git a/configstore/1.1/Android.mk b/configstore/1.1/Android.mk deleted file mode 100644 index b3f7053cd9..0000000000 --- a/configstore/1.1/Android.mk +++ /dev/null @@ -1,44 +0,0 @@ -# This file is autogenerated by hidl-gen. Do not edit manually. - -LOCAL_PATH := $(call my-dir) - -################################################################################ - -include $(CLEAR_VARS) -LOCAL_MODULE := android.hardware.configstore-V1.1-java -LOCAL_MODULE_CLASS := JAVA_LIBRARIES - -intermediates := $(call local-generated-sources-dir, COMMON) - -HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) - -LOCAL_JAVA_LIBRARIES := \ - android.hardware.configstore-V1.0-java \ - android.hidl.base-V1.0-java \ - -LOCAL_NO_STANDARD_LIBRARIES := true -LOCAL_JAVA_LIBRARIES += core-oj hwbinder - -# -# Build ISurfaceFlingerConfigs.hal -# -GEN := $(intermediates)/android/hardware/configstore/V1_1/ISurfaceFlingerConfigs.java -$(GEN): $(HIDL) -$(GEN): PRIVATE_HIDL := $(HIDL) -$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal -$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) -$(GEN): PRIVATE_CUSTOM_TOOL = \ - $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ - -Ljava \ - -randroid.hardware:hardware/interfaces \ - -randroid.hidl:system/libhidl/transport \ - android.hardware.configstore@1.1::ISurfaceFlingerConfigs - -$(GEN): $(LOCAL_PATH)/ISurfaceFlingerConfigs.hal - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_JAVA_LIBRARY) - - - -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/configstore/1.1/ISurfaceFlingerConfigs.hal b/configstore/1.1/ISurfaceFlingerConfigs.hal deleted file mode 100644 index 5eacbe00ac..0000000000 --- a/configstore/1.1/ISurfaceFlingerConfigs.hal +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.1 (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.1 - * - * 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.configstore@1.1; - -import @1.0::ISurfaceFlingerConfigs; - -/** - * New revision of ISurfaceFlingerConfigs - */ - -interface ISurfaceFlingerConfigs extends @1.0::ISurfaceFlingerConfigs { -}; diff --git a/configstore/1.1/default/android.hardware.configstore@1.1-service.rc b/configstore/1.1/default/android.hardware.configstore@1.1-service.rc deleted file mode 100644 index 018ef102d0..0000000000 --- a/configstore/1.1/default/android.hardware.configstore@1.1-service.rc +++ /dev/null @@ -1,4 +0,0 @@ -service configstore-hal /vendor/bin/hw/android.hardware.configstore@1.1-service - class hal animation - user system - group system diff --git a/configstore/1.1/vts/functional/Android.bp b/configstore/1.1/vts/functional/Android.bp deleted file mode 100644 index 5cfa4839d9..0000000000 --- a/configstore/1.1/vts/functional/Android.bp +++ /dev/null @@ -1,34 +0,0 @@ -// -// Copyright (C) 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. -// - -cc_test { - name: "VtsHalConfigstoreV1_1TargetTest", - defaults: ["hidl_defaults"], - srcs: ["VtsHalConfigstoreV1_1TargetTest.cpp"], - shared_libs: [ - "libbase", - "libhidlbase", - "liblog", - "libutils", - "android.hardware.configstore@1.1", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ] -} - diff --git a/configstore/1.1/vts/functional/VtsHalConfigstoreV1_1TargetTest.cpp b/configstore/1.1/vts/functional/VtsHalConfigstoreV1_1TargetTest.cpp deleted file mode 100644 index bd3da4c433..0000000000 --- a/configstore/1.1/vts/functional/VtsHalConfigstoreV1_1TargetTest.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 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 "ConfigstoreHidlHalTest" - -#include -#include -#include -#include -#include - -using ::android::hardware::configstore::V1_1::ISurfaceFlingerConfigs; -using ::android::sp; - -#define ASSERT_OK(ret) ASSERT_TRUE(ret.isOk()) -#define EXPECT_OK(ret) EXPECT_TRUE(ret.isOk()) - -class ConfigstoreHidlTest : public ::testing::VtsHalHidlTargetTestBase { - public: - sp sfConfigs; - - virtual void SetUp() override { - sfConfigs = ::testing::VtsHalHidlTargetTestBase::getService(); - ASSERT_NE(sfConfigs, nullptr); - } - - virtual void TearDown() override {} -}; - -/** - * Placeholder testcase. - */ -TEST_F(ConfigstoreHidlTest, Test) { - ASSERT_TRUE(true); -} - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - int status = RUN_ALL_TESTS(); - LOG(INFO) << "Test result = " << status; - return status; -} diff --git a/configstore/Android.bp b/configstore/Android.bp index 4a783c3d7e..ba3e62e29b 100644 --- a/configstore/Android.bp +++ b/configstore/Android.bp @@ -2,7 +2,5 @@ subdirs = [ "1.0", "1.0/vts/functional", - "1.1", - "1.1/vts/functional", "utils", ] From 5d143d2a0ff7c8d908aab13727b587003896d031 Mon Sep 17 00:00:00 2001 From: Jean-Luc Brouillet Date: Thu, 31 Aug 2017 23:03:04 -0700 Subject: [PATCH 180/265] Cleanup the constants. - Alphabetize the operations. - Remove N_GRAM operation. - Add TENSOR_INT32. Test: Compiled and ran the tests. Bug: 63905942 Change-Id: Ie7d9dec671a409256b686ef4665171492d1ac16a --- neuralnetworks/1.0/types.hal | 66 ++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index 959506ab9e..77f1021cf2 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -32,7 +32,8 @@ enum OperandType : uint32_t { UINT32 = 7, TENSOR_FLOAT16 = 8, TENSOR_FLOAT32 = 9, - TENSOR_QUANT8_ASYMM = 10, + TENSOR_INT32 = 10, + TENSOR_QUANT8_ASYMM = 11, }; // The type of operations. Unlike the operation types found in @@ -42,40 +43,39 @@ enum OperandType : uint32_t { // When modifying, be sure to update HAL_NUM_OPERATION_TYPES in HalIntefaces.h. enum OperationType : uint32_t { OEM_OPERATION = 0, - AVERAGE_POOL = 1, - CONCATENATION = 2, - CONV = 3, - DEPTHWISE_CONV = 4, - MAX_POOL = 5, - L2_POOL = 6, + ADD = 1, + AVERAGE_POOL = 2, + CAST = 3, + CONCATENATION = 4, + CONV = 5, + DEPTHWISE_CONV = 6, DEPTH_TO_SPACE = 7, - SPACE_TO_DEPTH = 8, - LOCAL_RESPONSE_NORMALIZATION = 9, - SOFTMAX = 10, - RESHAPE = 11, - SPLIT = 12, - FAKE_QUANT = 13, - ADD = 14, - FULLY_CONNECTED = 15, - CAST = 16, - MUL = 17, - L2_NORMALIZATION = 18, - LOGISTIC = 19, - RELU = 20, - RELU6 = 21, - RELU1 = 22, - TANH = 23, - DEQUANTIZE = 24, - FLOOR = 25, - GATHER = 26, + DEQUANTIZE = 8, + EMBEDDING_LOOKUP = 9, + FAKE_QUANT = 10, + FLOOR = 11, + FULLY_CONNECTED = 12, + GATHER = 13, + HASHTABLE_LOOKUP = 14, + L2_NORMALIZATION = 15, + L2_POOL = 16, + LOCAL_RESPONSE_NORMALIZATION = 17, + LOGISTIC = 18, + LSH_PROJECTION = 19, + LSTM = 20, + MAX_POOL = 21, + MUL = 22, + RELU = 23, + RELU1 = 24, + RELU6 = 25, + RESHAPE = 26, RESIZE_BILINEAR = 27, - LSH_PROJECTION = 28, - LSTM = 29, - SVDF = 30, - RNN = 31, - N_GRAM = 32, - EMBEDDING_LOOKUP = 33, - HASHTABLE_LOOKUP = 34, + RNN = 28, + SOFTMAX = 29, + SPACE_TO_DEPTH = 30, + SPLIT = 31, + SVDF = 32, + TANH = 33, }; // Two special values that can be used instead of a regular poolIndex. From a7ea9ae197a22f90753bfc6f20de2ad94aea49f6 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Mon, 28 Aug 2017 16:45:19 +0530 Subject: [PATCH 181/265] bug fix: add missing color formats to the check for valid formats Component can support 420PackedPlanar and 420PackedSemiPlanar as their choice of color formats. The current test application can fail in this case. This is corrected. Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Test -l INFO Bug: 63796949 Change-Id: I38bbbb40b34dcdd4526e87708667dc116af900f1 --- .../video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index c75bd7c64c..248fd07544 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -814,7 +814,7 @@ void getDefaultColorFormat(sp omxNode, OMX_U32 kPortIndexOutput, OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; *eColorFormat = OMX_COLOR_FormatUnused; portFormat.nIndex = 0; - while (1) { + while (portFormat.nIndex < 512) { status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, kPortIndexOutput, &portFormat); if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; @@ -828,7 +828,9 @@ void getDefaultColorFormat(sp omxNode, OMX_U32 kPortIndexOutput, break; } if (OMX_COLOR_FormatYUV420SemiPlanar == portFormat.eColorFormat || - OMX_COLOR_FormatYUV420Planar == portFormat.eColorFormat) { + OMX_COLOR_FormatYUV420Planar == portFormat.eColorFormat || + OMX_COLOR_FormatYUV420PackedPlanar == portFormat.eColorFormat || + OMX_COLOR_FormatYUV420PackedSemiPlanar == portFormat.eColorFormat) { *eColorFormat = portFormat.eColorFormat; break; } From eb9e25a3e265a984a1c114a1925dc33bf445f28f Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Fri, 1 Sep 2017 13:58:40 +0530 Subject: [PATCH 182/265] bug fix: disable timestamp deviation test for audio decoder Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Test -l INFO Bug: 64128634 Bug: 65166112 Change-Id: I8a08a8da7dd203cd16cbfbfd3f15e27966db711f --- .../functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp index 0c698da11d..ab18b6cc3d 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp @@ -755,7 +755,7 @@ TEST_F(AudioDecHidlTest, DecodeTest) { int bytesCount = 0; uint32_t flags = 0; uint32_t timestamp = 0; - timestampDevTest = true; + timestampDevTest = false; while (1) { if (!(eleInfo >> bytesCount)) break; eleInfo >> flags; From a230bad8d47ff203beeb84ca0b277fe7c3a9eae6 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Tue, 29 Aug 2017 14:08:47 +0530 Subject: [PATCH 183/265] bug fix: handle multiple port settings change events signalled at once Components can send various kinds of port settings changed events all at once. During a full port reconfiguration this is causing problems due to limited flexibility in the message handling design. For now, before committing to a full port reconfiguration defer any events waiting in the queue to be addressed to a later point. Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Test -l INFO Bug: 64468705 Change-Id: I537cdd3e7d92cdc6d54168f091d7897afe541599 --- .../VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index 9773cb00b9..6bc72bfee3 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -482,6 +482,21 @@ void portReconfiguration(sp omxNode, sp observer, ASSERT_EQ(msg.data.eventData.data1, kPortIndexOutput); if (msg.data.eventData.data2 == OMX_IndexParamPortDefinition || msg.data.eventData.data2 == 0) { + // Components can send various kinds of port settings changed events + // all at once. Before committing to a full port reconfiguration, + // defer any events waiting in the queue to be addressed to a later + // point. + android::List msgQueueDefer; + while (1) { + status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, + iBuffer, oBuffer); + if (status != + android::hardware::media::omx::V1_0::Status::TIMED_OUT) { + msgQueueDefer.push_back(msg); + continue; + } else + break; + } status = omxNode->sendCommand( toRawCommandType(OMX_CommandPortDisable), kPortIndexOutput); ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); @@ -557,6 +572,16 @@ void portReconfiguration(sp omxNode, sp observer, ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable); ASSERT_EQ(msg.data.eventData.data2, kPortIndexOutput); + // Push back deferred messages to the list + android::List::iterator it = msgQueueDefer.begin(); + while (it != msgQueueDefer.end()) { + status = omxNode->dispatchMessage(*it); + ASSERT_EQ( + status, + ::android::hardware::media::omx::V1_0::Status::OK); + it++; + } + // dispatch output buffers for (size_t i = 0; i < oBuffer->size(); i++) { dispatchOutputBuffer(omxNode, oBuffer, i, oPortMode); From 9fe004c216239a1915616fe5349274544805c7ca Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Wed, 26 Jul 2017 17:30:32 +0530 Subject: [PATCH 184/265] Modify SetDefaultPortParams test 1. For output port in video encoder and input port in video decoder, it is allowed to configure the size of the buffer. Make adjustments in the test application to validate this scenario. 2. useBuffer api call is allowed only after sending loaded to idle state transition command. Ensure this requirement is met. Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Test -l INFO Bug: 63796949 Change-Id: I1aba7703e1344b87f556d3388a4cde8199898499 --- .../VtsHalMediaOmxV1_0TargetComponentTest.cpp | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp index 0f29d91f99..235cfeffad 100644 --- a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp +++ b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp @@ -371,7 +371,7 @@ TEST_F(ComponentHidlTest, DISABLED_SetDefaultPortParams) { kPortIndexOutput = kPortIndexInput + 1; } - for (size_t i = kPortIndexInput; i < kPortIndexOutput; i++) { + for (size_t i = kPortIndexInput; i <= kPortIndexOutput; i++) { OMX_PARAM_PORTDEFINITIONTYPE portDef; status = getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); @@ -406,10 +406,32 @@ TEST_F(ComponentHidlTest, DISABLED_SetDefaultPortParams) { setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); portDef = mirror; - portDef.nBufferSize >>= 1; + OMX_U32 nBufferSize = portDef.nBufferSize >> 1; + if (nBufferSize != 0) { + if (!strncmp(gEnv->getComponent().c_str(), "OMX.google.", 11)) { + portDef.nBufferSize = nBufferSize; + } else { + // Probable alignment requirements of vendor component + portDef.nBufferSize = ALIGN_POWER_OF_TWO(nBufferSize, 12); + nBufferSize = portDef.nBufferSize; + } + } else { + ASSERT_TRUE(false) << "Unexpected buffer size"; + } setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); - EXPECT_EQ(portDef.nBufferSize, mirror.nBufferSize); + // SPECIAL CASE: For video decoder, allow configuration of input + // buffer size even if it is less than minimum requirement and + // similarly for encoder allow configuration of output port buffer + // size. + if ((compClass == video_encoder && i == kPortIndexOutput) || + (compClass == video_decoder && i == kPortIndexInput)) { + double dev = (portDef.nBufferSize / (double)nBufferSize); + dev -= 1; + if (dev < 0 || dev > 0.1) EXPECT_TRUE(false); + } else { + EXPECT_EQ(portDef.nBufferSize, mirror.nBufferSize); + } setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); portDef = mirror; @@ -467,6 +489,11 @@ TEST_F(ComponentHidlTest, DISABLED_PopulatePort) { portBase = params.nStartPortNumber; } + // set state to idle + status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), + OMX_StateIdle); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + OMX_PARAM_PORTDEFINITIONTYPE portDef; status = getPortParam(omxNode, OMX_IndexParamPortDefinition, portBase, &portDef); From 7fe0b2bfac08ff077bc9dbf0e42ea6167f8fba82 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Wed, 23 Aug 2017 17:25:00 +0530 Subject: [PATCH 185/265] Add portMode configuration test Configuration of port mode of a component is allowed only when the component is in loaded state. When the component is in idle/execute state this operation is denied. This commit adds a test fixture that verifies this. Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Test -l INFO Bug: 63796949 Merged-In: Ib958c671873fe1d9bb4227ce3e7214f948469f19 Change-Id: Ib958c671873fe1d9bb4227ce3e7214f948469f19 --- .../VtsHalMediaOmxV1_0TargetComponentTest.cpp | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp index 0f29d91f99..37d995670e 100644 --- a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp +++ b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp @@ -556,6 +556,67 @@ TEST_F(ComponentHidlTest, Flush) { kPortIndexInput, kPortIndexOutput); } +// test port mode configuration when the component is in various states +TEST_F(ComponentHidlTest, PortModeConfig) { + description("Test Port Mode Configuration"); + if (disableTest) return; + android::hardware::media::omx::V1_0::Status status; + uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; + Message msg; + + status = setRole(omxNode, gEnv->getRole().c_str()); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + OMX_PORT_PARAM_TYPE params; + if (compClass == audio_decoder || compClass == audio_encoder) { + status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); + } else { + status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); + } + if (status == ::android::hardware::media::omx::V1_0::Status::OK) { + ASSERT_EQ(params.nPorts, 2U); + kPortIndexInput = params.nStartPortNumber; + kPortIndexOutput = kPortIndexInput + 1; + } + + android::Vector iBuffer, oBuffer; + + // set port mode + PortMode portMode[2]; + initPortMode(portMode, isSecure, compClass); + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // set state to idle + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode); + // Only Allow Port Mode configuration in loaded state + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // set state to executing + changeStateIdletoExecute(omxNode, observer); + // Only Allow Port Mode configuration in loaded state + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // set state to idle + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + // set state to loaded + changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput); + + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); +} + // state transitions test TEST_F(ComponentHidlTest, StateTransitions) { description("Test State Transitions Loaded<->Idle<->Execute"); From 0e2ac1bb885d7ba77e80a082526fd1b510190a72 Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Fri, 1 Sep 2017 10:59:38 -0700 Subject: [PATCH 186/265] NNAPI Concurrent Query Management -- HAL and VTS update The NNAPI requires requests on a model to be asynchronously processed. This CL implements a basic Event that can later be used to block the runtime thread until the asynchronous request has completed. Bug: 63905942 Test: VtsHalNeuralnetworksV1_0TargetTest (32-bit, 64-bit) with sample driver enabled by cherry-pick frameworks/ml/nn/runtime/test with and without sample driver enabled Change-Id: Ie27a574aaaac312e7cbb731750f9c06278357a1c --- neuralnetworks/1.0/Android.bp | 7 + neuralnetworks/1.0/IEvent.hal | 49 +++++ neuralnetworks/1.0/IPreparedModel.hal | 5 +- neuralnetworks/1.0/types.hal | 5 + neuralnetworks/1.0/vts/functional/Android.bp | 5 +- neuralnetworks/1.0/vts/functional/Event.cpp | 76 +++++++ neuralnetworks/1.0/vts/functional/Event.h | 192 ++++++++++++++++++ .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 22 +- .../VtsHalNeuralnetworksV1_0TargetTest.h | 8 +- 9 files changed, 361 insertions(+), 8 deletions(-) create mode 100644 neuralnetworks/1.0/IEvent.hal create mode 100644 neuralnetworks/1.0/vts/functional/Event.cpp create mode 100644 neuralnetworks/1.0/vts/functional/Event.h diff --git a/neuralnetworks/1.0/Android.bp b/neuralnetworks/1.0/Android.bp index b5603a2ecc..d7c3bbbf72 100644 --- a/neuralnetworks/1.0/Android.bp +++ b/neuralnetworks/1.0/Android.bp @@ -5,6 +5,7 @@ filegroup { srcs: [ "types.hal", "IDevice.hal", + "IEvent.hal", "IPreparedModel.hal", ], } @@ -19,6 +20,7 @@ genrule { out: [ "android/hardware/neuralnetworks/1.0/types.cpp", "android/hardware/neuralnetworks/1.0/DeviceAll.cpp", + "android/hardware/neuralnetworks/1.0/EventAll.cpp", "android/hardware/neuralnetworks/1.0/PreparedModelAll.cpp", ], } @@ -38,6 +40,11 @@ genrule { "android/hardware/neuralnetworks/1.0/BnHwDevice.h", "android/hardware/neuralnetworks/1.0/BpHwDevice.h", "android/hardware/neuralnetworks/1.0/BsDevice.h", + "android/hardware/neuralnetworks/1.0/IEvent.h", + "android/hardware/neuralnetworks/1.0/IHwEvent.h", + "android/hardware/neuralnetworks/1.0/BnHwEvent.h", + "android/hardware/neuralnetworks/1.0/BpHwEvent.h", + "android/hardware/neuralnetworks/1.0/BsEvent.h", "android/hardware/neuralnetworks/1.0/IPreparedModel.h", "android/hardware/neuralnetworks/1.0/IHwPreparedModel.h", "android/hardware/neuralnetworks/1.0/BnHwPreparedModel.h", diff --git a/neuralnetworks/1.0/IEvent.hal b/neuralnetworks/1.0/IEvent.hal new file mode 100644 index 0000000000..63afeaf9c3 --- /dev/null +++ b/neuralnetworks/1.0/IEvent.hal @@ -0,0 +1,49 @@ +/* + * Copyright (C) 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. + */ + +/* This HAL is a work in progress */ + +package android.hardware.neuralnetworks@1.0; + +/** + * The IEvent interface is a callback object passed by the + * Neuralnetworks runtime to the vendor service. It is used as a + * synchronization primitive between one or more runtime threads and a + * single asynchronous vendor thread. An event object is passed as an + * argument to a HIDL call that is expected to take a non-trivial + * amount of time. When the asynchronous execution thread has + * completed its computation, it must call "notify" on the event to + * indicate to the Neuralnetworks runtime whether the computation was + * successful or not, and that the corresponding output is ready to be + * consumed if the execution was successful. + * + * TODO: Mention that "notify" is also called by a runtime thread + * during CPU fallback execution? Depends on whether the HIDL comments + * are strictly for vendors or not. + */ +interface IEvent { + + /** + * IEvent::notify is called by the server thread (i.e. the thread doing the + * work) to mark the event as completed so that any threads requiring the + * corresponding resources can continue executing. + * + * @param status Status of the execution associated with the Event. + * Should be SUCCESS or ERROR. + */ + oneway notify(Status status); + +}; diff --git a/neuralnetworks/1.0/IPreparedModel.hal b/neuralnetworks/1.0/IPreparedModel.hal index 566d6ace44..428ddc7a1a 100644 --- a/neuralnetworks/1.0/IPreparedModel.hal +++ b/neuralnetworks/1.0/IPreparedModel.hal @@ -18,8 +18,9 @@ package android.hardware.neuralnetworks@1.0; +import IEvent; + interface IPreparedModel { - // TODO: The execution is synchronous. Change that to have a callback on completion. // Multiple threads can call this execute function concurrently. - execute(Request request) generates(bool success); + execute(Request request, IEvent event) generates(bool success); }; diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index 77f1021cf2..61af70b090 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -181,3 +181,8 @@ struct Request { vec outputs; vec pools; }; + +enum Status : uint32_t { + SUCCESS, + ERROR, +}; diff --git a/neuralnetworks/1.0/vts/functional/Android.bp b/neuralnetworks/1.0/vts/functional/Android.bp index d76b2c3320..1efff0e0e5 100644 --- a/neuralnetworks/1.0/vts/functional/Android.bp +++ b/neuralnetworks/1.0/vts/functional/Android.bp @@ -16,7 +16,10 @@ cc_test { name: "VtsHalNeuralnetworksV1_0TargetTest", - srcs: ["VtsHalNeuralnetworksV1_0TargetTest.cpp"], + srcs: [ + "Event.cpp", + "VtsHalNeuralnetworksV1_0TargetTest.cpp", + ], defaults: ["VtsHalTargetTestDefaults"], static_libs: [ "android.hardware.neuralnetworks@1.0", diff --git a/neuralnetworks/1.0/vts/functional/Event.cpp b/neuralnetworks/1.0/vts/functional/Event.cpp new file mode 100644 index 0000000000..0fab86b6b3 --- /dev/null +++ b/neuralnetworks/1.0/vts/functional/Event.cpp @@ -0,0 +1,76 @@ +#include "Event.h" +#include + +namespace android { +namespace hardware { +namespace neuralnetworks { +namespace V1_0 { +namespace implementation { + +Event::Event() : mStatus(Status::WAITING) {} + +Event::~Event() { + if (mThread.joinable()) { + mThread.join(); + } +} + +Return Event::notify(ReturnedStatus status) { + { + std::lock_guard lock(mMutex); + mStatus = status == ReturnedStatus::SUCCESS ? Status::SUCCESS : Status::ERROR; + if (mStatus == Status::SUCCESS && mCallback != nullptr) { + bool success = mCallback(); + if (!success) { + LOG(ERROR) << "Event::notify -- callback failed"; + } + } + } + mCondition.notify_all(); + return Void(); +} + +Event::Status Event::poll() { + std::lock_guard lock(mMutex); + return mStatus; +} + +Event::Status Event::wait() { + std::unique_lock lock(mMutex); + mCondition.wait(lock, [this]{return mStatus != Status::WAITING;}); + return mStatus; +} + +bool Event::on_finish(std::function callback) { + std::lock_guard lock(mMutex); + if (mCallback != nullptr) { + LOG(ERROR) << "Event::on_finish -- a callback has already been bound to this event"; + return false; + } + if (callback == nullptr) { + LOG(ERROR) << "Event::on_finish -- the new callback is invalid"; + return false; + } + mCallback = std::move(callback); + return true; +} + +bool Event::bind_thread(std::thread&& asyncThread) { + std::lock_guard lock(mMutex); + if (mThread.joinable()) { + LOG(ERROR) << "Event::bind_thread -- a thread has already been bound to this event"; + return false; + } + if (!asyncThread.joinable()) { + LOG(ERROR) << "Event::bind_thread -- the new thread is not joinable"; + return false; + } + mThread = std::move(asyncThread); + return true; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace neuralnetworks +} // namespace hardware +} // namespace android diff --git a/neuralnetworks/1.0/vts/functional/Event.h b/neuralnetworks/1.0/vts/functional/Event.h new file mode 100644 index 0000000000..2e19585ef2 --- /dev/null +++ b/neuralnetworks/1.0/vts/functional/Event.h @@ -0,0 +1,192 @@ +#ifndef ANDROID_HARDWARE_NEURALNETWORKS_V1_0_EVENT_H +#define ANDROID_HARDWARE_NEURALNETWORKS_V1_0_EVENT_H + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace android { +namespace hardware { +namespace neuralnetworks { +namespace V1_0 { +namespace implementation { + +using ::android::hardware::hidl_array; +using ::android::hardware::hidl_memory; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +using ReturnedStatus = ::android::hardware::neuralnetworks::V1_0::Status; + +/** + * The Event class is used internally by the Neuralnetworks runtime to + * synchronize between different threads. An asynchronous task is launched + * paired with an event object. When a client thread requires the output being + * processed by the asynchronous task, the client thread can wait for the result + * and be blocked until it has completed or a timeout condition has been + * reached, or poll the result periodically. Both poll and wait* may safely be + * called concurrently, even on the same event. When the server thread has + * completed, it should immediately call "notify" to indicate the corresponding + * output has been produced and awaken any client threads waiting on the event. + * + * This class exists to enable synchronization across HIDL. When synchronization + * is only required in the same process, consider using std::future, std::mutex, + * std::condition_variable, or std::experimental::latch instead. + */ +struct Event : public IEvent { + Event(); + ~Event() override; + + /** + * Event::Status::WAITING -- The corresponding asynchronous execution has + * not yet finished. + * Event::Status::SUCCESS -- The corresponding asynchronous execution has + * succeeded and the output is ready to be + * consumed. + * Event::Status::TIMEOUT -- The calling thread has waited longer than the + * user has specified. This only applies to the + * methods Event::wait_for and Event::wait_until. + * Event::Status::ERROR -- The corresponding asynchronous execution has + * failed to properly execute. + */ + enum class Status : uint32_t { + WAITING, + SUCCESS, + TIMEOUT, + ERROR, + }; + + /** + * IEvent::notify marks the event with the return status of the + * asynchronous call the event is paired with and enables all + * prior and future wait calls on the Event object to proceed. The + * call to IEvent::notify happens before any wait* calls on + * this event return (except in the case of TIMEOUT) and before + * any poll calls that see the resulting status. The asynchronous + * call the event is paired with must ensure that any update to + * state that should be visible to the caller of wait* or poll + * happens before the call to IEvent::notify. + * + * IEvent::notify can be called at most once on a given event. + * + * @param neuralnetworks::V1_0::Status SUCCESS or ERROR + */ + Return notify(ReturnedStatus status) override; + + /** + * Event::poll returns the current status of the event. + * + * @return Status SUCCESS, ERROR, or WAITING + */ + Event::Status poll(); + + /** + * Event::wait blocks until the event has been signaled. + * + * @return Status SUCCESS or ERROR + */ + Event::Status wait(); + + /** + * Event::wait_for blocks until the event has been signaled or the time + * duration from the time the wait_for function was called has expired, + * whichever comes first. + * + * @return Status SUCCESS, ERROR, or TIMEOUT + */ + template + Event::Status wait_for(const std::chrono::duration& timeout_duration); + + /** + * Event::wait_until blocks until the event has been signaled or a certain + * time has been reached, whichever comes first. + * + * @return Status SUCCESS, ERROR, or TIMEOUT + */ + template + Event::Status wait_until(const std::chrono::time_point& timeout_duration); + + /** + * Event::on_finish binds a callback function to the event. The + * callback will be executed when IEvent::notify is called, before + * any calls to wait* return. (Note that wait_for or wait_until + * can return TIMEOUT before IEvent::notify is called for the + * first time, and hence before the callback is executed.) + * + * The callback function must not synchronize with or otherwise + * access the event object it is bound to. + * + * Event::on_finish can be called at most once on a given event. + * + * @param callback Function to be invoked the first time IEvent::notify is + * called. Must have a target -- i.e., must not compare equal + * to nullptr. Callback returns true if it successfully + * completes, false if it fails. + * @return bool True if the callback was successfully bound, false if + * unsuccessful. + * + * TODO: What if notify has already been called before on_finish? + * TODO: Why does the return value of the callback matter? + */ + bool on_finish(std::function callback); + + /** + * Event::bind_thread binds a thread to the event ensuring that the thread + * has fully finished and cleaned its resources before the event is + * destroyed. The thread should be bound using std::move. + * + * The bound thread shall not call any Event method with the exception of + * IEvent::notify, which it will call when the thread has finished its + * computation. + * + * Event::bind_thread can be called at most once on a given event. + * + * @param asyncThread Thread to be bound to the event. The thread object + * must represent a thread of execution -- i.e., + * asyncThread.joinable() must be true. + * @return bool True if successful, false if thread was not properly bound. + */ + bool bind_thread(std::thread&& asyncThread); + + private: + Status mStatus; + std::mutex mMutex; + std::condition_variable mCondition; + std::function mCallback; + std::thread mThread; +}; + + +// template function implementations + +template +Event::Status Event::wait_for(const std::chrono::duration& timeout_duration) { + std::unique_lock lock(mMutex); + std::cv_status status = mCondition.wait_for(lock, timeout_duration, + [this]{return mStatus != Status::WAITING;}); + return status != std::cv_status::timeout ? mStatus : Status::TIMEOUT; +} + +template +Event::Status Event::wait_until(const std::chrono::time_point& timeout_time) { + std::unique_lock lock(mMutex); + std::cv_status status = mCondition.wait_until(lock, timeout_time, + [this]{return mStatus != Status::WAITING;}); + return status != std::cv_status::timeout ? mStatus : Status::TIMEOUT; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace neuralnetworks +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_NEURALNETWORKS_V1_0_EVENT_H diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp index 84e67cb9fa..6655ad3b5c 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -16,6 +16,7 @@ #define LOG_TAG "neuralnetworks_hidl_hal_test" +#include "Event.h" #include "VtsHalNeuralnetworksV1_0TargetTest.h" #include #include @@ -29,9 +30,13 @@ namespace V1_0 { namespace vts { namespace functional { +using ::android::hardware::neuralnetworks::V1_0::implementation::Event; + // A class for test environment setup NeuralnetworksHidlEnvironment::NeuralnetworksHidlEnvironment() {} +NeuralnetworksHidlEnvironment::~NeuralnetworksHidlEnvironment() {} + NeuralnetworksHidlEnvironment* NeuralnetworksHidlEnvironment::getInstance() { // This has to return a "new" object because it is freed inside // ::testing::AddGlobalTestEnvironment when the gtest is being torn down @@ -44,6 +49,8 @@ void NeuralnetworksHidlEnvironment::registerTestServices() { } // The main test class for NEURALNETWORK HIDL HAL. +NeuralnetworksHidlTest::~NeuralnetworksHidlTest() {} + void NeuralnetworksHidlTest::SetUp() { device = ::testing::VtsHalHidlTargetTestBase::getService( NeuralnetworksHidlEnvironment::getInstance()); @@ -226,21 +233,32 @@ TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphTest) { float* outputPtr = reinterpret_cast(static_cast(outputMemory->getPointer())); ASSERT_NE(nullptr, inputPtr); ASSERT_NE(nullptr, outputPtr); + inputMemory->update(); + outputMemory->update(); std::copy(inputData.begin(), inputData.end(), inputPtr); std::copy(outputData.begin(), outputData.end(), outputPtr); inputMemory->commit(); outputMemory->commit(); // execute request - bool success = preparedModel->execute({.inputs = inputs, .outputs = outputs, .pools = pools}); + sp event = sp(new Event()); + ASSERT_NE(nullptr, event.get()); + bool success = preparedModel->execute({.inputs = inputs, .outputs = outputs, .pools = pools}, + event); EXPECT_TRUE(success); + Event::Status status = event->wait(); + EXPECT_EQ(Event::Status::SUCCESS, status); // validate results { 1+5, 2+6, 3+7, 4+8 } - outputMemory->update(); + outputMemory->read(); std::copy(outputPtr, outputPtr + outputData.size(), outputData.begin()); + outputMemory->commit(); EXPECT_EQ(expectedData, outputData); } +// TODO: Add tests for execution failure, or wait_for/wait_until timeout. +// Discussion: https://googleplex-android-review.git.corp.google.com/#/c/platform/hardware/interfaces/+/2654636/5/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp@222 + } // namespace functional } // namespace vts } // namespace V1_0 diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h index bb0cdaa457..fdd3b0b38c 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h @@ -59,15 +59,17 @@ class NeuralnetworksHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvB NeuralnetworksHidlEnvironment& operator=(NeuralnetworksHidlEnvironment&&) = delete; public: + ~NeuralnetworksHidlEnvironment() override; static NeuralnetworksHidlEnvironment* getInstance(); - virtual void registerTestServices() override; + void registerTestServices() override; }; // The main test class for NEURALNETWORKS HIDL HAL. class NeuralnetworksHidlTest : public ::testing::VtsHalHidlTargetTestBase { public: - virtual void SetUp() override; - virtual void TearDown() override; + ~NeuralnetworksHidlTest() override; + void SetUp() override; + void TearDown() override; sp device; }; From 83b64ff05433c953ffdd62a01e6e264a62e58a04 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 24 Jul 2017 11:11:01 -0700 Subject: [PATCH 187/265] graphics: ignore/reduce spurious vsync in VTS Bug: 62802718 Test: VTS Change-Id: I1ed73e0b2f14414f540865a96e6bd5ac1599fbf3 (cherry picked from commit e0ff3e4a2679cb505e801db5df4d1546f6caa41a) --- .../2.1/vts/functional/VtsHalGraphicsComposerTestUtils.cpp | 5 +++++ .../vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerTestUtils.cpp b/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerTestUtils.cpp index 33cf84c37e..68aede2364 100644 --- a/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerTestUtils.cpp +++ b/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerTestUtils.cpp @@ -290,6 +290,11 @@ void ComposerClient::setVsyncEnabled(Display display, bool enabled) { : IComposerClient::Vsync::DISABLE; Error error = mClient->setVsyncEnabled(display, vsync); ASSERT_EQ(Error::NONE, error) << "failed to set vsync mode"; + + // give the hwbinder thread some time to handle any pending vsync callback + if (!enabled) { + usleep(5 * 1000); + } } } // namespace tests diff --git a/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp b/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp index 387222fbbe..4261d006da 100644 --- a/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp +++ b/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp @@ -118,7 +118,7 @@ class GraphicsComposerCallback : public IComposerCallback { // the set of all currently connected displays std::unordered_set mDisplays; // true only when vsync is enabled - bool mVsyncAllowed = false; + bool mVsyncAllowed = true; // track invalid callbacks int mInvalidHotplugCount = 0; @@ -137,6 +137,10 @@ class GraphicsComposerHidlTest : public ::testing::VtsHalHidlTargetTestBase { // assume the first display is primary and is never removed mPrimaryDisplay = waitForFirstDisplay(); + + // explicitly disable vsync + mComposerClient->setVsyncEnabled(mPrimaryDisplay, false); + mComposerCallback->setVsyncAllowed(false); } void TearDown() override { From 43d25f2f26eee5655214cf5426a629916aece061 Mon Sep 17 00:00:00 2001 From: Kevin Rocard Date: Thu, 31 Aug 2017 16:45:08 -0700 Subject: [PATCH 188/265] Allow partially dynamic profile in the audio policy config The audio policy configuration deserializer supports fully dynamic profiles by not setting a profile in a port. It also supports partially dynamic profile by not setting @format, @samplingRates or @channelMasks Nevertheless this last feature of partial dynamic profile was mistakenly not allowed by the configuration xsd. Bug: 63541622 Change-Id: I78f77a77a3c62bba28a7da5a0e3c8c608b5a01d9 Signed-off-by: Kevin Rocard --- audio/2.0/config/audio_policy_configuration.xsd | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/audio/2.0/config/audio_policy_configuration.xsd b/audio/2.0/config/audio_policy_configuration.xsd index c94da80bfa..eb59152c91 100644 --- a/audio/2.0/config/audio_policy_configuration.xsd +++ b/audio/2.0/config/audio_policy_configuration.xsd @@ -365,10 +365,10 @@ - - - - + + + + From 1c1d17733feb982aaaac9789b48cf65ba86735a7 Mon Sep 17 00:00:00 2001 From: Sanket Padawe Date: Thu, 24 Aug 2017 20:50:54 -0700 Subject: [PATCH 189/265] Add sim absent error for supplyNetworkDepersonalization. Bug: 62926561 Test: vts Change-Id: Iac98fd41b8c949781185f9504623d511ff46d36c Merged-in: Iac98fd41b8c949781185f9504623d511ff46d36c (cherry picked from commit f9ced6d3fea99550c1f0a1427331025ee8c8ab5f) --- radio/1.0/vts/functional/radio_hidl_hal_icc.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/1.0/vts/functional/radio_hidl_hal_icc.cpp b/radio/1.0/vts/functional/radio_hidl_hal_icc.cpp index 9e003e2d77..130064aa52 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_icc.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_icc.cpp @@ -317,6 +317,7 @@ TEST_F(RadioHidlTest, getIccCardStatus) { radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || radioRsp->rspInfo.error == RadioError::INVALID_SIM_STATE || radioRsp->rspInfo.error == RadioError::PASSWORD_INCORRECT || - radioRsp->rspInfo.error == RadioError::INTERNAL_ERR); + radioRsp->rspInfo.error == RadioError::INTERNAL_ERR || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } From dc6270ecc1d6a3ac18b2820ef176bb4ea58fba3f Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Wed, 30 Aug 2017 11:56:33 +0530 Subject: [PATCH 190/265] bug fix: restore support for broken flag timestampDevTest flag can be used to disable timestamp deviation tests. The flag is not working as intended. This is corrected. Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Test -l INFO Bug: 64743270 Bug: 65166112 Merged-In: I611e96498a4677b6ccbff33c291d56eed7b48f6f Change-Id: I611e96498a4677b6ccbff33c291d56eed7b48f6f --- .../functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp | 4 ++-- .../functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 4 ++-- .../functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp index ab18b6cc3d..9e5dde1ff7 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp @@ -761,7 +761,7 @@ TEST_F(AudioDecHidlTest, DecodeTest) { eleInfo >> flags; eleInfo >> timestamp; Info.push_back({bytesCount, flags, timestamp}); - if (flags != OMX_BUFFERFLAG_CODECCONFIG) + if (timestampDevTest && (flags != OMX_BUFFERFLAG_CODECCONFIG)) timestampUslist.push_back(timestamp); } eleInfo.close(); @@ -803,7 +803,7 @@ TEST_F(AudioDecHidlTest, DecodeTest) { packedArgs audioArgs = {eEncoding, compName}; testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, nullptr, portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs); - EXPECT_EQ(timestampUslist.empty(), true); + if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); // set state to idle changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); // set state to executing diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index 9773cb00b9..00685350e8 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -777,7 +777,7 @@ TEST_F(VideoDecHidlTest, DecodeTest) { eleInfo >> flags; eleInfo >> timestamp; Info.push_back({bytesCount, flags, timestamp}); - if (flags != OMX_BUFFERFLAG_CODECCONFIG) + if (timestampDevTest && (flags != OMX_BUFFERFLAG_CODECCONFIG)) timestampUslist.push_back(timestamp); } eleInfo.close(); @@ -834,7 +834,7 @@ TEST_F(VideoDecHidlTest, DecodeTest) { kPortIndexInput, kPortIndexOutput, portMode[1]); testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode, portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); - EXPECT_EQ(timestampUslist.empty(), true); + if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); // set state to idle changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); // set state to executing diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp index cd6eaf5632..bbe08435da 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp @@ -1286,7 +1286,7 @@ TEST_F(VideoEncHidlTest, EncodeTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer); testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); - EXPECT_EQ(timestampUslist.empty(), true); + if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); // set state to idle changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); From 065a085a3f972953461bf465a642ce0f186f8c7c Mon Sep 17 00:00:00 2001 From: Scott Randolph Date: Tue, 15 Aug 2017 19:15:16 -0700 Subject: [PATCH 191/265] Add RINGTONE to Vehicle HAL AUDIO_FOCUS Test: build on Mojave with associated CarService changes Change-Id: I7fcf9b4bb1808971f4fc8265a7d581dce57be3d3 Bug: 64729839 --- automotive/vehicle/2.0/types.hal | 3 +++ current.txt | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/automotive/vehicle/2.0/types.hal b/automotive/vehicle/2.0/types.hal index 12b92dd352..cb9b7ffc25 100644 --- a/automotive/vehicle/2.0/types.hal +++ b/automotive/vehicle/2.0/types.hal @@ -2224,6 +2224,9 @@ enum VehicleAudioContextFlag : int32_t { /** Ext source is played. This is for tagging generic ext sources. */ EXT_SOURCE_FLAG = 0x1000, + + /** The phone ring tone is played */ + RINGTONE_FLAG = 0x2000 }; /** diff --git a/current.txt b/current.txt index c0dd0fa762..a11886e4a6 100644 --- a/current.txt +++ b/current.txt @@ -189,7 +189,7 @@ fe3c3c2f572b72f15f8594c538b0577bd5c28722c31879cfe6231330cddb6747 android.hardwar # ABI preserving changes to HALs during Android O MR1 (Initial Set) -05e0edf31db5b3ae19047d87059545cc2f836023edf8f9d969319e15e3485158 android.hardware.automotive.vehicle@2.0::types +d4f2b9c1ec923de301c344d2fc52e54a7db0b0a01bb40f49d844b95394f09cc0 android.hardware.automotive.vehicle@2.0::types 150a338ce11fcec70757c9675d83cf6a5d7b40d0c812741b91671fecce59eac9 android.hardware.broadcastradio@1.0::types dc7e6d4f537b9943e27edc4f86c5a03bb643b18f18f866f8c3c71c0ac4ea8cbc android.hardware.broadcastradio@1.0::types 760485232f6cce07f8bb05e3475509956996b702f77415ee5bff05e2ec5a5bcc android.hardware.dumpstate@1.0::IDumpstateDevice From cd8d92d06ecf4a3a2145f8d0feee9b6b3bd9e26c Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Tue, 5 Sep 2017 15:41:40 -0700 Subject: [PATCH 192/265] Remove media.cas requirement. This is a requirement on android phones and tv but not on watches. Owner will handle putting that requirement in place, but removing requirement from this file specifically only in order to have O-MR1 interfaces frozen. Bug: 63603463 Test: m system_compatibility_matrix.xml compatibility_matrix.xml manifest.xml system_manifest.xml -j Change-Id: Iefdc231c2928dfdb8e04a5de8a08ab9b23bae73d --- compatibility_matrix.27.xml | 2 +- compatibility_matrix.current.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/compatibility_matrix.27.xml b/compatibility_matrix.27.xml index 22ca426bfa..5c81f26616 100644 --- a/compatibility_matrix.27.xml +++ b/compatibility_matrix.27.xml @@ -71,7 +71,7 @@ legacy/0 - + android.hardware.cas 1.0 diff --git a/compatibility_matrix.current.xml b/compatibility_matrix.current.xml index 22ca426bfa..5c81f26616 100644 --- a/compatibility_matrix.current.xml +++ b/compatibility_matrix.current.xml @@ -71,7 +71,7 @@ legacy/0 - + android.hardware.cas 1.0 From 66339cfc3aea9c8907f454d08c17c941f2ae60e9 Mon Sep 17 00:00:00 2001 From: Scott Randolph Date: Tue, 5 Sep 2017 16:29:29 -0700 Subject: [PATCH 193/265] Additonal usage note updates for Audio properties Mostly comment updates for clarification. Updates the names of a few constants (but not their value nor usage). Test: build for Mojave Change-Id: Ic9021f82fa4bd960189e005f074f2b407be13ae7 bug: 65384336 --- automotive/vehicle/2.0/types.hal | 72 ++++++++++++++++---------------- current.txt | 2 +- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/automotive/vehicle/2.0/types.hal b/automotive/vehicle/2.0/types.hal index cb9b7ffc25..7c08b4a036 100644 --- a/automotive/vehicle/2.0/types.hal +++ b/automotive/vehicle/2.0/types.hal @@ -785,7 +785,8 @@ enum VehicleProperty: int32_t { * requested by Android side. The focus has both per stream characteristics * and global characteristics. * - * Focus request (get of this property) must take the following form: + * Focus request (get of this property) must take the following form with indices defined + * by VehicleAudioFocusIndex: * int32Values[0]: VehicleAudioFocusRequest type * int32Values[1]: bit flags of streams requested by this focus request. * There can be up to 32 streams. @@ -803,7 +804,7 @@ enum VehicleProperty: int32_t { * REQUEST_RELEASE). In that case, audio module must * maintain mute state until user's explicit action to * play some media. - * int32Values[3]: Currently active audio contexts. Use combination of + * int32Values[3]: Audio contexts wishing to be active. Use combination of * flags from VehicleAudioContextFlag. * This can be used as a hint to adjust audio policy or * other policy decision. @@ -818,7 +819,7 @@ enum VehicleProperty: int32_t { * request. * * Focus response (set and subscription callback for this property) must - * take the following form: + * take the following form with indices defined by VehicleAudioFocusIndex: * int32Values[0]: VehicleAudioFocusState type * int32Values[1]: bit flags of streams allowed. * int32Values[2]: External focus state: bit flags of currently active @@ -847,9 +848,10 @@ enum VehicleProperty: int32_t { * side is playing something permanent. * LOSS_TRANSIENT: must always be * VehicleAudioExtFocusFlag#PERMANENT_FLAG - * int32Values[3]: context requested by android side when responding to - * focus request. When car side is taking focus away, - * this must be zero. + * int32Values[3]: Audio context(s) allowed to be active. When responding positively to a + * focus request from Android, the request's original context must be + * repeated here. When taking focus away, or denying a request, the + * rejected or stopped context would have its corresponding bit cleared. * * A focus response must be sent per each focus request even if there is * no change in focus state. This can happen in case like focus request @@ -890,8 +892,8 @@ enum VehicleProperty: int32_t { * * VehiclePropConfig * configArray[0] : bit flags of all supported audio contexts from - * VehicleAudioContextFlag. If this is 0, audio volume is - * controlled per physical stream. + * VehicleAudioContextFlag. If this is 0, audio volume + * is controlled per physical stream. * configArray[1] : flags defined in VehicleAudioVolumeCapabilityFlag to * represent audio module's capability. * configArray[2..3] : reserved @@ -901,7 +903,7 @@ enum VehicleProperty: int32_t { * indicates mute state. * * Data type looks like: - * int32Values[0] : stream context as defined in VehicleAudioContextFlag. + * int32Values[0] : audio context as defined in VehicleAudioContextFlag. * If only physical stream is supported * (configArray[0] == 0), this must represent physical * stream number. @@ -909,8 +911,8 @@ enum VehicleProperty: int32_t { * defined in the config. * int32Values[2] : One of VehicleAudioVolumeState. * - * This property requires per stream based get. HAL implementation must - * check stream number in get call to return the right volume. + * HAL implementations must check the incoming value of audio context + * field in get call to return the right volume. * * @change_mode VehiclePropertyChangeMode:ON_CHANGE * @access VehiclePropertyAccess:READ_WRITE @@ -949,18 +951,18 @@ enum VehicleProperty: int32_t { * to represent audio module's capability. * * Data type looks like: - * int32Values[0] : stream context as defined in VehicleAudioContextFlag. + * int32Values[0] : audio context as defined in VehicleAudioContextFlag. * If only physical stream is supported * (configArray[0] == 0), this must represent physical * stream number. * int32Values[1] : maximum volume set to the stream. If there is no - * restriction, this value must be bigger than + * restriction, this value must be equal to * AUDIO_VOLUME's max value. * * If car does not support this feature, this property must not be * populated by HAL. - * This property requires per stream based get. HAL implementation must - * check stream number in get call to return the right volume. + * HAL implementations must check the incoming value of audio context + * field in get call to return the right volume. * * @change_mode VehiclePropertyChangeMode:ON_CHANGE * @access VehiclePropertyAccess:READ_WRITE @@ -974,10 +976,8 @@ enum VehicleProperty: int32_t { /** * Property to share audio routing policy of android side. This property is - * set at the beginning to pass audio policy in android side down to + * set at startup to pass audio policy in android side down to * vehicle HAL and car audio module. - * This can be used as a hint to adjust audio policy or other policy - * decision. * * int32Values[0] : audio stream where the audio for the application * context must be routed by default. Note that this is @@ -1001,11 +1001,11 @@ enum VehicleProperty: int32_t { | VehicleArea:GLOBAL), /** - * Property to return audio H/W variant type used in this car. This allows - * android side to support different audio policy based on H/W variant used. - * Note that other components like CarService may need overlay update to - * support additional variants. If this property does not - * exist, default audio policy must be used. + * Property to return audio H/W variant type used in this car. This is a + * zero based index into the set of audio routing policies defined in + * R.array.audioRoutingPolicy on CarService, which may be overlaid to + * support multiple variants. If this property does not exist, the default + * audio policy must be used. * * @change_mode VehiclePropertyChangeMode:STATIC * @access VehiclePropertyAccess:READ @@ -2235,23 +2235,23 @@ enum VehicleAudioContextFlag : int32_t { */ enum VehicleAudioVolumeCapabilityFlag : int32_t { /** - * External audio module or vehicle hal has persistent storage - * to keep the volume level. This must be set only when per context - * volume level is supported. When this is set, audio volume level per - * each context will be retrieved from the property when system starts up. + * External audio module or vehicle hal has persistent storage to keep the + * volume level. When this is set, the audio volume level for each context + * will be retrieved from the property when the system starts up. * And external audio module is also expected to adjust volume automatically * whenever there is an audio context change. * When this flag is not set, android side will assume that there is no - * persistent storage and stored value in android side will be used to - * initialize the volume level. And android side will set volume level - * of each physical streams whenever there is an audio context change. + * persistent storage and the value stored in the android side will be used to + * initialize the volume level, and android side will set volume level + * of each physical stream whenever there is an audio context change. */ PERSISTENT_STORAGE = 0x1, /** + * [DEPRECATED] * When this flag is set, the H/W can support only single master volume for - * all streams. - * There is no way to set volume level differently per each stream or context. + * all streams. There is no way to set volume level differently for each stream + * or context. */ MASTER_VOLUME_ONLY = 0x2, }; @@ -2267,16 +2267,16 @@ enum VehicleAudioVolumeState : int32_t { * VehicleProperty#AUDIO_VOLUME_LIMIT and user's request to increase volume * further is not allowed. */ - LIMIT_REACHED = 1, + STATE_LIMIT_REACHED = 1, }; /** * Index in int32Values for VehicleProperty#AUDIO_VOLUME property. */ enum VehicleAudioVolumeIndex : int32_t { - INDEX_STREAM = 0, - INDEX_VOLUME = 1, - INDEX_STATE = 2, + STREAM = 0, + VOLUME = 1, + STATE = 2, }; /** diff --git a/current.txt b/current.txt index a11886e4a6..f045fd852d 100644 --- a/current.txt +++ b/current.txt @@ -189,7 +189,7 @@ fe3c3c2f572b72f15f8594c538b0577bd5c28722c31879cfe6231330cddb6747 android.hardwar # ABI preserving changes to HALs during Android O MR1 (Initial Set) -d4f2b9c1ec923de301c344d2fc52e54a7db0b0a01bb40f49d844b95394f09cc0 android.hardware.automotive.vehicle@2.0::types +26a4dd19a71f3a28249100af29be470f80e08355165fe6a7173aaa1ef264640d android.hardware.automotive.vehicle@2.0::types 150a338ce11fcec70757c9675d83cf6a5d7b40d0c812741b91671fecce59eac9 android.hardware.broadcastradio@1.0::types dc7e6d4f537b9943e27edc4f86c5a03bb643b18f18f866f8c3c71c0ac4ea8cbc android.hardware.broadcastradio@1.0::types 760485232f6cce07f8bb05e3475509956996b702f77415ee5bff05e2ec5a5bcc android.hardware.dumpstate@1.0::IDumpstateDevice From 9a721b808743069fc26d6cf226595e2823e347a6 Mon Sep 17 00:00:00 2001 From: Sanket Padawe Date: Sun, 3 Sep 2017 22:32:43 -0700 Subject: [PATCH 194/265] Fix VTS test which turns off radio. Since the purpose of most of the test cases in current VTS is to check if proper errors are returned and there is no crash seen in vendor code, updating setRadioPower test case to turn on the radio instead of turning off. We want to avoid test cases which turn off radio or leads to modem shut down as those test cases affect other tests. Test: VTS Change-Id: I4fb9f18884f7ef21162015a0032c4431444f7025 Bug: 65230472 --- radio/1.0/vts/functional/radio_hidl_hal_misc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp index d93b176d2a..795af86a0c 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp @@ -70,7 +70,7 @@ TEST_F(RadioHidlTest, getOperator) { TEST_F(RadioHidlTest, setRadioPower) { int serial = GetRandomSerialNumber(); - radio->setRadioPower(serial, 0); + radio->setRadioPower(serial, 1); EXPECT_EQ(std::cv_status::no_timeout, wait()); EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type); EXPECT_EQ(serial, radioRsp->rspInfo.serial); From 3092b31b1438046cd1b8494b6bbeab9886872e74 Mon Sep 17 00:00:00 2001 From: Kevin Rocard Date: Thu, 31 Aug 2017 16:45:08 -0700 Subject: [PATCH 195/265] Allow partially dynamic profile in the audio policy config The audio policy configuration deserializer supports fully dynamic profiles by not setting a profile in a port. It also supports partially dynamic profile by not setting @format, @samplingRates or @channelMasks Nevertheless this last feature of partial dynamic profile was mistakenly not allowed by the configuration xsd. Bug: 63541622 Change-Id: I78f77a77a3c62bba28a7da5a0e3c8c608b5a01d9 Merged-In: I78f77a77a3c62bba28a7da5a0e3c8c608b5a01d9 Signed-off-by: Kevin Rocard (cherry picked from commit 43d25f2f26eee5655214cf5426a629916aece061) --- audio/2.0/config/audio_policy_configuration.xsd | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/audio/2.0/config/audio_policy_configuration.xsd b/audio/2.0/config/audio_policy_configuration.xsd index c94da80bfa..eb59152c91 100644 --- a/audio/2.0/config/audio_policy_configuration.xsd +++ b/audio/2.0/config/audio_policy_configuration.xsd @@ -365,10 +365,10 @@ - - - - + + + + From c7c333931cb4dc6e0f75da865d052f43828e1f17 Mon Sep 17 00:00:00 2001 From: Myles Watson Date: Wed, 6 Sep 2017 16:26:49 -0700 Subject: [PATCH 196/265] Bluetooth: Remove credit check from Loopback tests The Bluetooth specification doesn't require data credits to come back within a specific timeframe, so the VTS test can not require it. Bug: 65269854 Test: VtsHalBlueoothV1_0TargetTest with simulated chip (no credits) Change-Id: If2fc052d3b5236f6a3097f3d5403882226561404 (cherry picked from commit 0e06a63c76f4c02ac307c6294f3d6f61ae6406e7) --- .../VtsHalBluetoothV1_0TargetTest.cpp | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/bluetooth/1.0/vts/functional/VtsHalBluetoothV1_0TargetTest.cpp b/bluetooth/1.0/vts/functional/VtsHalBluetoothV1_0TargetTest.cpp index fb53366c2f..6c9aa1879d 100644 --- a/bluetooth/1.0/vts/functional/VtsHalBluetoothV1_0TargetTest.cpp +++ b/bluetooth/1.0/vts/functional/VtsHalBluetoothV1_0TargetTest.cpp @@ -464,8 +464,9 @@ void BluetoothHidlTest::sendAndCheckACL(int num_packets, size_t size, // Return the number of completed packets reported by the controller. int BluetoothHidlTest::wait_for_completed_packets_event(uint16_t handle) { - EXPECT_TRUE(bluetooth_cb->WaitForCallback(kCallbackNameHciEventReceived) - .no_timeout); + if (!bluetooth_cb->WaitForCallback(kCallbackNameHciEventReceived).no_timeout) { + ALOGW("%s: WaitForCallback timed out.", __func__); + } int packets_processed = 0; while (event_queue.size() > 0) { hidl_vec event = event_queue.front(); @@ -604,20 +605,24 @@ TEST_F(BluetoothHidlTest, LoopbackModeSinglePackets) { // This should work, but breaks on some current platforms. Figure out how to // grandfather older devices but test new ones. - int sco_packets_sent = 0; if (0 && sco_connection_handles.size() > 0) { sendAndCheckSCO(1, max_sco_data_packet_length, sco_connection_handles[0]); - sco_packets_sent = 1; - EXPECT_EQ(sco_packets_sent, - wait_for_completed_packets_event(sco_connection_handles[0])); + int sco_packets_sent = 1; + int completed_packets = wait_for_completed_packets_event(sco_connection_handles[0]); + if (sco_packets_sent != completed_packets) { + ALOGW("%s: packets_sent (%d) != completed_packets (%d)", __func__, sco_packets_sent, + completed_packets); + } } - int acl_packets_sent = 0; if (acl_connection_handles.size() > 0) { sendAndCheckACL(1, max_acl_data_packet_length, acl_connection_handles[0]); - acl_packets_sent = 1; - EXPECT_EQ(acl_packets_sent, - wait_for_completed_packets_event(acl_connection_handles[0])); + int acl_packets_sent = 1; + int completed_packets = wait_for_completed_packets_event(acl_connection_handles[0]); + if (acl_packets_sent != completed_packets) { + ALOGW("%s: packets_sent (%d) != completed_packets (%d)", __func__, acl_packets_sent, + completed_packets); + } } } @@ -633,22 +638,26 @@ TEST_F(BluetoothHidlTest, LoopbackModeBandwidth) { // This should work, but breaks on some current platforms. Figure out how to // grandfather older devices but test new ones. - int sco_packets_sent = 0; if (0 && sco_connection_handles.size() > 0) { sendAndCheckSCO(NUM_SCO_PACKETS_BANDWIDTH, max_sco_data_packet_length, sco_connection_handles[0]); - sco_packets_sent = NUM_SCO_PACKETS_BANDWIDTH; - EXPECT_EQ(sco_packets_sent, - wait_for_completed_packets_event(sco_connection_handles[0])); + int sco_packets_sent = NUM_SCO_PACKETS_BANDWIDTH; + int completed_packets = wait_for_completed_packets_event(sco_connection_handles[0]); + if (sco_packets_sent != completed_packets) { + ALOGW("%s: packets_sent (%d) != completed_packets (%d)", __func__, sco_packets_sent, + completed_packets); + } } - int acl_packets_sent = 0; if (acl_connection_handles.size() > 0) { sendAndCheckACL(NUM_ACL_PACKETS_BANDWIDTH, max_acl_data_packet_length, acl_connection_handles[0]); - acl_packets_sent = NUM_ACL_PACKETS_BANDWIDTH; - EXPECT_EQ(acl_packets_sent, - wait_for_completed_packets_event(acl_connection_handles[0])); + int acl_packets_sent = NUM_ACL_PACKETS_BANDWIDTH; + int completed_packets = wait_for_completed_packets_event(acl_connection_handles[0]); + if (acl_packets_sent != completed_packets) { + ALOGW("%s: packets_sent (%d) != completed_packets (%d)", __func__, acl_packets_sent, + completed_packets); + } } } From 76efe01bbd841b4f4e8e57fa8a72a3e3af77a042 Mon Sep 17 00:00:00 2001 From: Kevin Rocard Date: Fri, 8 Sep 2017 11:29:32 -0700 Subject: [PATCH 197/265] Audio VTS: remove expectation of policy configuration unicity The XML audio policy configuration is expected to be located in /vendor. Additionally for AOSP builds (no vendor) and as a fallback in case of missing vendor configuration, the system supports loading the XML from /system. This fallback config is not guaranty to be compatible with the phone HAL, but probably does for a wide range of android phones (at least for basic use cases). In each of those cases, there is only one configuration file, either in /vendor or /system. As a result, the audio policy configuration VTS test was asserting that only one audio_policy_configuration.xml could be found. If multiple were found, one was useless and the platform integrator should remove it. But VTS are now run on phone with a /system partition from an AOSP build and a /vendor partition from a device build. In such scenario two audio policy config are now present on the device, thus breaking the VTS expectation. This is not a problem for the framework because it does not look for a /system config if one was found in /vendor. In the future, the /system XML might be removed as boards specific config should be found in /vendor only as per treble requirements. Test: Compile Bug: 65482614 Change-Id: I7cd7eb7284c0aa52782aa591411f8a9bf2a87a76 Signed-off-by: Kevin Rocard --- audio/2.0/vts/functional/ValidateAudioConfiguration.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/audio/2.0/vts/functional/ValidateAudioConfiguration.cpp b/audio/2.0/vts/functional/ValidateAudioConfiguration.cpp index 5fc1b3d3e4..ee490239bf 100644 --- a/audio/2.0/vts/functional/ValidateAudioConfiguration.cpp +++ b/audio/2.0/vts/functional/ValidateAudioConfiguration.cpp @@ -24,13 +24,9 @@ TEST(CheckConfig, audioPolicyConfigurationValidation) { const char* possibleConfigLocations[] = {"/odm/etc", "/vendor/etc", "/system/etc"}; const char* configSchemaPath = "/data/local/tmp/audio_policy_configuration.xsd"; - bool found = false; for (std::string folder : possibleConfigLocations) { const auto configPath = folder + '/' + configName; if (access(configPath.c_str(), R_OK) == 0) { - ASSERT_FALSE(found) << "Multiple " << configName << " found in " - << ::testing::PrintToString(possibleConfigLocations); - found = true; ASSERT_VALID_XML(configPath.c_str(), configSchemaPath); } } From 48ffe289b0b8fb6515f77affbac6a261ef6552fe Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 8 Sep 2017 11:24:32 -0700 Subject: [PATCH 198/265] graphics: discard stale data from message queue Our use of message queues is synchronous. If there are already data in the queue when writeQueue is called, we know they are stale and can be discarded. Bug: 65449888 Test: manual Change-Id: Ie29b8a7386c9733c183a6c3569e3572efa62cbc2 --- .../2.1/default/IComposerCommandBuffer.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/graphics/composer/2.1/default/IComposerCommandBuffer.h b/graphics/composer/2.1/default/IComposerCommandBuffer.h index 9ee5f4f88d..058709c5ed 100644 --- a/graphics/composer/2.1/default/IComposerCommandBuffer.h +++ b/graphics/composer/2.1/default/IComposerCommandBuffer.h @@ -92,6 +92,23 @@ public: bool writeQueue(bool* outQueueChanged, uint32_t* outCommandLength, hidl_vec* outCommandHandles) { + // After data are written to the queue, it may not be read by the + // remote reader when + // + // - the writer does not send them (because of other errors) + // - the hwbinder transaction fails + // - the reader does not read them (because of other errors) + // + // Discard the stale data here. + size_t staleDataSize = mQueue ? mQueue->availableToRead() : 0; + if (staleDataSize > 0) { + ALOGW("discarding stale data from message queue"); + CommandQueueType::MemTransaction tx; + if (mQueue->beginRead(staleDataSize, &tx)) { + mQueue->commitRead(staleDataSize); + } + } + // write data to queue, optionally resizing it if (mQueue && (mDataMaxSize <= mQueue->getQuantumCount())) { if (!mQueue->write(mData.get(), mDataWritten)) { From 199aa8641156f79d7d79971472efef6857412f18 Mon Sep 17 00:00:00 2001 From: Miao Wang Date: Fri, 8 Sep 2017 16:57:49 -0700 Subject: [PATCH 199/265] Add FusedActivationFunc enum and renamed certain operations. - Add "_2D" to CONV, DEPTHWISE_CONV, AVG_POOL, MAX_POOL, and L2_POOL, since they are only supposed to do 2D computation. - Remove CAST, GATHER, SPLIT. - Also update the tests to reflect the changes. Bug: 63905942 Test: mm Test: NeuralNetworksTests pass for both CPU path and sample hidl driver. Change-Id: I5bcf219c4c6cd4f866c1023d1f35cdc83ca69a85 --- neuralnetworks/1.0/types.hal | 69 ++++++++++--------- .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 2 +- .../VtsHalNeuralnetworksV1_0TargetTest.h | 1 + 3 files changed, 39 insertions(+), 33 deletions(-) diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index 61af70b090..5fe151326f 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -44,38 +44,43 @@ enum OperandType : uint32_t { enum OperationType : uint32_t { OEM_OPERATION = 0, ADD = 1, - AVERAGE_POOL = 2, - CAST = 3, - CONCATENATION = 4, - CONV = 5, - DEPTHWISE_CONV = 6, - DEPTH_TO_SPACE = 7, - DEQUANTIZE = 8, - EMBEDDING_LOOKUP = 9, - FAKE_QUANT = 10, - FLOOR = 11, - FULLY_CONNECTED = 12, - GATHER = 13, - HASHTABLE_LOOKUP = 14, - L2_NORMALIZATION = 15, - L2_POOL = 16, - LOCAL_RESPONSE_NORMALIZATION = 17, - LOGISTIC = 18, - LSH_PROJECTION = 19, - LSTM = 20, - MAX_POOL = 21, - MUL = 22, - RELU = 23, - RELU1 = 24, - RELU6 = 25, - RESHAPE = 26, - RESIZE_BILINEAR = 27, - RNN = 28, - SOFTMAX = 29, - SPACE_TO_DEPTH = 30, - SPLIT = 31, - SVDF = 32, - TANH = 33, + AVERAGE_POOL_2D = 2, + CONCATENATION = 3, + CONV_2D = 4, + DEPTHWISE_CONV_2D = 5, + DEPTH_TO_SPACE = 6, + DEQUANTIZE = 7, + EMBEDDING_LOOKUP = 8, + FAKE_QUANT = 9, + FLOOR = 10, + FULLY_CONNECTED = 11, + HASHTABLE_LOOKUP = 12, + L2_NORMALIZATION = 13, + L2_POOL_2D = 14, + LOCAL_RESPONSE_NORMALIZATION = 15, + LOGISTIC = 16, + LSH_PROJECTION = 17, + LSTM = 18, + MAX_POOL_2D = 19, + MUL = 20, + RELU = 21, + RELU1 = 22, + RELU6 = 23, + RESHAPE = 24, + RESIZE_BILINEAR = 25, + RNN = 26, + SOFTMAX = 27, + SPACE_TO_DEPTH = 28, + SVDF = 29, + TANH = 30, +}; + +// Fused activation functions +enum FusedActivationFunc : int32_t { + NONE = 0, + RELU = 1, + RELU1 = 2, + RELU6 = 3, }; // Two special values that can be used instead of a regular poolIndex. diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp index 6655ad3b5c..bb9f9424ae 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -150,7 +150,7 @@ Model createTestModel() { std::vector operandValues( reinterpret_cast(operand2Data.data()), reinterpret_cast(operand2Data.data()) + size); - int32_t activation[1] = {0}; + int32_t activation[1] = {static_cast(FusedActivationFunc::NONE)}; operandValues.insert(operandValues.end(), reinterpret_cast(&activation[0]), reinterpret_cast(&activation[1])); diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h index fdd3b0b38c..9c56e6a118 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h @@ -31,6 +31,7 @@ using ::android::hardware::neuralnetworks::V1_0::IDevice; using ::android::hardware::neuralnetworks::V1_0::IPreparedModel; using ::android::hardware::neuralnetworks::V1_0::Capabilities; using ::android::hardware::neuralnetworks::V1_0::DeviceStatus; +using ::android::hardware::neuralnetworks::V1_0::FusedActivationFunc; using ::android::hardware::neuralnetworks::V1_0::Model; using ::android::hardware::neuralnetworks::V1_0::OperationType; using ::android::hardware::neuralnetworks::V1_0::PerformanceInfo; From 62cc79bdf0c52c773602d9e93bbf732b1c54b934 Mon Sep 17 00:00:00 2001 From: Jean-Luc Brouillet Date: Sat, 9 Sep 2017 20:45:55 -0700 Subject: [PATCH 200/265] Refactor how arguments are tracked. Use an explicit description of the lifetime of an operand rather than relying on poolIndex to do the job. Bug: 63905942 Test: Ran unit tests Change-Id: I53c4c10b40fd3312232b0689b43d0f72a2818490 --- neuralnetworks/1.0/types.hal | 55 +++++++++++++------ .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 16 ++++-- 2 files changed, 49 insertions(+), 22 deletions(-) diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index 5fe151326f..844c44c14d 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -83,14 +83,20 @@ enum FusedActivationFunc : int32_t { RELU6 = 3, }; -// Two special values that can be used instead of a regular poolIndex. -enum LocationValues : uint32_t { - // The location will be specified at runtime. It's either a temporary - // variable, an input, or an output. - LOCATION_AT_RUN_TIME = 0xFFFFFFFF, - // The operand's value is stored in the - // TODO: Only for old - LOCATION_SAME_BLOCK = 0xFFFFFFFE +// How an operand is used. +enum OperandLifeTime : uint32_t { + // The operand is internal to the model. It's created by an operation + // and consumed by other operations. + TEMPORARY_VARIABLE, + // The operand is an input of the model. An operand can't be both + // input and output of a model. + MODEL_INPUT, + // The operand is an output of the model. + MODEL_OUTPUT, + // The operand is a constant found in Model.operandValues. + CONSTANT_COPY, + // The operand is a constant that was specified via a Memory object. + CONSTANT_REFERENCE }; // Status of a device. @@ -150,7 +156,20 @@ struct Operand { float scale; int32_t zeroPoint; + // How the operand is used. + OperandLifeTime lifetime; + // Where to find the data for this operand. + // If the lifetime is TEMPORARY_VARIABLE, MODEL_INPUT, or MODEL_OUTPUT: + // - All the fields will be 0. + // If the lifetime is CONSTANT_COPY: + // - location.poolIndex is 0. + // - location.offset is the offset in bytes into Model.operandValues. + // - location.length is set. + // If the lifetime is CONSTANT_REFERENCE: + // - location.poolIndex is set. + // - location.offset is the offset in bytes into the specified pool. + // - location.length is set. DataLocation location; }; @@ -166,12 +185,6 @@ struct Operation { vec outputs; }; -struct InputOutputInfo { - DataLocation location; - // If dimensions.size() > 0, we have updated dimensions. - vec dimensions; -}; - struct Model { vec operands; vec operations; @@ -181,9 +194,19 @@ struct Model { vec pools; }; +struct RequestArgument { + // The location within one of the memory pools + DataLocation location; + // If dimensions.size() > 0, dimension information was provided along with the + // argument. This can be the case for models that accept inputs of varying size. + // This can't change the rank, just the value of the dimensions that were + // unspecified in the model. + vec dimensions; +}; + struct Request { - vec inputs; - vec outputs; + vec inputs; + vec outputs; vec pools; }; diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp index bb9f9424ae..90ccd0609d 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -103,7 +103,8 @@ Model createTestModel() { .numberOfConsumers = 1, .scale = 0.0f, .zeroPoint = 0, - .location = {.poolIndex = static_cast(LocationValues::LOCATION_AT_RUN_TIME), + .lifetime = OperandLifeTime::MODEL_INPUT, + .location = {.poolIndex = 0, .offset = 0, .length = 0}, }, @@ -113,7 +114,8 @@ Model createTestModel() { .numberOfConsumers = 1, .scale = 0.0f, .zeroPoint = 0, - .location = {.poolIndex = static_cast(LocationValues::LOCATION_SAME_BLOCK), + .lifetime = OperandLifeTime::CONSTANT_COPY, + .location = {.poolIndex = 0, .offset = 0, .length = size}, }, @@ -123,7 +125,8 @@ Model createTestModel() { .numberOfConsumers = 1, .scale = 0.0f, .zeroPoint = 0, - .location = {.poolIndex = static_cast(LocationValues::LOCATION_SAME_BLOCK), + .lifetime = OperandLifeTime::CONSTANT_COPY, + .location = {.poolIndex = 0, .offset = size, .length = sizeof(int32_t)}, }, @@ -133,7 +136,8 @@ Model createTestModel() { .numberOfConsumers = 0, .scale = 0.0f, .zeroPoint = 0, - .location = {.poolIndex = static_cast(LocationValues::LOCATION_AT_RUN_TIME), + .lifetime = OperandLifeTime::MODEL_OUTPUT, + .location = {.poolIndex = 0, .offset = 0, .length = 0}, }, @@ -213,10 +217,10 @@ TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphTest) { // prepare inputs uint32_t inputSize = static_cast(inputData.size() * sizeof(float)); uint32_t outputSize = static_cast(outputData.size() * sizeof(float)); - std::vector inputs = {{ + std::vector inputs = {{ .location = {.poolIndex = INPUT, .offset = 0, .length = inputSize}, .dimensions = {}, }}; - std::vector outputs = {{ + std::vector outputs = {{ .location = {.poolIndex = OUTPUT, .offset = 0, .length = outputSize}, .dimensions = {}, }}; std::vector pools = {allocateSharedMemory(inputSize), From ad2baebb3b1c4455d3f7fe3cfd9f91e2a1442c15 Mon Sep 17 00:00:00 2001 From: Enrico Granata Date: Mon, 11 Sep 2017 15:06:40 -0700 Subject: [PATCH 201/265] Do not write initial empty values for the diagnostic properties. There is a separate step that initializes them with meaningful values. Change-Id: I2480a029773b62b0e77b8c52c73f2ee465caf17c Fixes: b/65125128 Test: runtest -x packages/services/Car/tests/android_car_api_test/src/android/car/apitest/CarDiagnosticManagerTest.java --- .../impl/vhal_v2_0/EmulatedVehicleHal.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp index 385f03de5c..6bc0522403 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp @@ -162,12 +162,29 @@ StatusCode EmulatedVehicleHal::set(const VehiclePropValue& propValue) { return StatusCode::OK; } +static bool isDiagnosticProperty(VehiclePropConfig propConfig) { + switch (propConfig.prop) { + case OBD2_LIVE_FRAME: + case OBD2_FREEZE_FRAME: + case OBD2_FREEZE_FRAME_CLEAR: + case OBD2_FREEZE_FRAME_INFO: + return true; + } + return false; +} + // Parse supported properties list and generate vector of property values to hold current values. void EmulatedVehicleHal::onCreate() { for (auto& it : kVehicleProperties) { VehiclePropConfig cfg = it.config; int32_t supportedAreas = cfg.supportedAreas; + if (isDiagnosticProperty(cfg)) { + // do not write an initial empty value for the diagnostic properties + // as we will initialize those separately. + continue; + } + // A global property will have supportedAreas = 0 if (isGlobalProp(cfg.prop)) { supportedAreas = 0; From 0380d7f60a79f80f397bf9fca700a32b5ce52110 Mon Sep 17 00:00:00 2001 From: David Gross Date: Mon, 11 Sep 2017 16:23:17 -0700 Subject: [PATCH 202/265] Fix bug in the way an Event handles a bound thread. This just keeps the (test) Event representation in sync with the runtime Event representation, which is modified by https://googleplex-android-review.git.corp.google.com/#/c/platform/frameworks/ml/+/2880348/ Bug: 63905942 Test: vts Change-Id: I2a6de4397c5e31e35cb3d02e241dd21452c21ca6 --- neuralnetworks/1.0/vts/functional/Event.cpp | 24 ++++++++++++-- neuralnetworks/1.0/vts/functional/Event.h | 36 ++++++++++++++++++--- 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/neuralnetworks/1.0/vts/functional/Event.cpp b/neuralnetworks/1.0/vts/functional/Event.cpp index 0fab86b6b3..67de4f566a 100644 --- a/neuralnetworks/1.0/vts/functional/Event.cpp +++ b/neuralnetworks/1.0/vts/functional/Event.cpp @@ -10,9 +10,15 @@ namespace implementation { Event::Event() : mStatus(Status::WAITING) {} Event::~Event() { - if (mThread.joinable()) { - mThread.join(); - } + // Note that we cannot call Event::join_thread from here: Event is + // intended to be reference counted, and it is possible that the + // reference count drops to zero in the bound thread, causing the + // bound thread to call this destructor. If a thread tries to join + // itself, it throws an exception, producing a message like the + // following: + // + // terminating with uncaught exception of type std::__1::system_error: + // thread::join failed: Resource deadlock would occur } Return Event::notify(ReturnedStatus status) { @@ -38,6 +44,7 @@ Event::Status Event::poll() { Event::Status Event::wait() { std::unique_lock lock(mMutex); mCondition.wait(lock, [this]{return mStatus != Status::WAITING;}); + join_thread_locked(); return mStatus; } @@ -69,6 +76,17 @@ bool Event::bind_thread(std::thread&& asyncThread) { return true; } +void Event::join_thread() { + std::lock_guard lock(mMutex); + join_thread_locked(); +} + +void Event::join_thread_locked() { + if (mThread.joinable()) { + mThread.join(); + } +} + } // namespace implementation } // namespace V1_0 } // namespace neuralnetworks diff --git a/neuralnetworks/1.0/vts/functional/Event.h b/neuralnetworks/1.0/vts/functional/Event.h index 2e19585ef2..4f7f2f603e 100644 --- a/neuralnetworks/1.0/vts/functional/Event.h +++ b/neuralnetworks/1.0/vts/functional/Event.h @@ -136,12 +136,21 @@ struct Event : public IEvent { * TODO: What if notify has already been called before on_finish? * TODO: Why does the return value of the callback matter? */ - bool on_finish(std::function callback); + bool on_finish(std::function callback); /** - * Event::bind_thread binds a thread to the event ensuring that the thread - * has fully finished and cleaned its resources before the event is - * destroyed. The thread should be bound using std::move. + * Event::bind_thread binds a thread to the event for later use by + * Event::join_thread. + * + * The thread must be passed using std::move. + * + * Once a thread is bound with Event::bind_thread, the client code + * should ensure that one of the following occurs before the event is + * destroyed: + * - Event::join_thread has been called. + * - Event::wait has been called. + * - Event::wait_for has been called and returned other than TIMEOUT. + * - Event::wait_until has been called and returned other than TIMEOUT. * * The bound thread shall not call any Event method with the exception of * IEvent::notify, which it will call when the thread has finished its @@ -154,9 +163,20 @@ struct Event : public IEvent { * asyncThread.joinable() must be true. * @return bool True if successful, false if thread was not properly bound. */ - bool bind_thread(std::thread&& asyncThread); + bool bind_thread(std::thread&& asyncThread); + + /** + * Event::join_thread ensures that the thread (if any) bound to + * this event with Event::bind_thread has fully finished and + * cleaned its resources. It is legal to call this function + * multiple times, concurrently or sequentially. + */ + void join_thread(); private: + // Same as Event::join_thread but assumes we already hold a lock on mMutex. + void join_thread_locked(); + Status mStatus; std::mutex mMutex; std::condition_variable mCondition; @@ -172,6 +192,9 @@ Event::Status Event::wait_for(const std::chrono::duration& timeout_d std::unique_lock lock(mMutex); std::cv_status status = mCondition.wait_for(lock, timeout_duration, [this]{return mStatus != Status::WAITING;}); + if (status != std::cv_status::timeout) { + join_thread_locked(); + } return status != std::cv_status::timeout ? mStatus : Status::TIMEOUT; } @@ -180,6 +203,9 @@ Event::Status Event::wait_until(const std::chrono::time_point& t std::unique_lock lock(mMutex); std::cv_status status = mCondition.wait_until(lock, timeout_time, [this]{return mStatus != Status::WAITING;}); + if (status != std::cv_status::timeout) { + join_thread_locked(); + } return status != std::cv_status::timeout ? mStatus : Status::TIMEOUT; } From e9dc1674f0b45a4a076a1161616fa66e8c784046 Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Mon, 11 Sep 2017 13:53:19 -0700 Subject: [PATCH 203/265] Make prepareModel asynchronous. Updated the corresponding VTS tests. Bug: 63905942 Test: mm, vts Change-Id: Ie520af845f491dbdd93ea66fd643d77cfb4703f7 --- neuralnetworks/1.0/IDevice.hal | 3 ++- .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 18 +++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/neuralnetworks/1.0/IDevice.hal b/neuralnetworks/1.0/IDevice.hal index b826b23774..9e190977bc 100644 --- a/neuralnetworks/1.0/IDevice.hal +++ b/neuralnetworks/1.0/IDevice.hal @@ -18,6 +18,7 @@ package android.hardware.neuralnetworks@1.0; +import IEvent; import IPreparedModel; interface IDevice { @@ -25,7 +26,7 @@ interface IDevice { getSupportedSubgraph(Model model) generates(vec supported); - prepareModel(Model model) generates(IPreparedModel preparedModel); + prepareModel(Model model, IEvent event) generates(IPreparedModel preparedModel); getStatus() generates(DeviceStatus status); }; diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp index 90ccd0609d..9c64c04825 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -209,10 +209,14 @@ TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphTest) { const uint32_t INPUT = 0; const uint32_t OUTPUT = 1; - // prpeare request + // prepare request Model model = createTestModel(); - sp preparedModel = device->prepareModel(model); + sp preparationEvent = new Event(); + ASSERT_NE(nullptr, preparationEvent.get()); + sp preparedModel = device->prepareModel(model, preparationEvent); ASSERT_NE(nullptr, preparedModel.get()); + Event::Status preparationStatus = preparationEvent->wait(); + EXPECT_EQ(Event::Status::SUCCESS, preparationStatus); // prepare inputs uint32_t inputSize = static_cast(inputData.size() * sizeof(float)); @@ -245,13 +249,13 @@ TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphTest) { outputMemory->commit(); // execute request - sp event = sp(new Event()); - ASSERT_NE(nullptr, event.get()); + sp executionEvent = new Event(); + ASSERT_NE(nullptr, executionEvent.get()); bool success = preparedModel->execute({.inputs = inputs, .outputs = outputs, .pools = pools}, - event); + executionEvent); EXPECT_TRUE(success); - Event::Status status = event->wait(); - EXPECT_EQ(Event::Status::SUCCESS, status); + Event::Status executionStatus = executionEvent->wait(); + EXPECT_EQ(Event::Status::SUCCESS, executionStatus); // validate results { 1+5, 2+6, 3+7, 4+8 } outputMemory->read(); From 4497a5fe338c4a19dc31312641b2caa8454eb24e Mon Sep 17 00:00:00 2001 From: Ahmed ElArabawy Date: Fri, 8 Sep 2017 09:11:48 -0700 Subject: [PATCH 204/265] Remove default implementation for PowerHal 1.1 Default implementation in powerHAL 1.1 is not used by any device Devices using powerHal 1.1 have their own implementation in their device// while older devices don't use 1.1 at all. This CL removes the default implementation for the PowerHAL 1.1 Bug: 65453628 Test: Build successfully (code not used anyway) Merged-In: I695348683c6e2e504a523897082543274dc239aa Change-Id: I695348683c6e2e504a523897082543274dc239aa Signed-off-by: Ahmed ElArabawy --- power/1.1/default/Android.bp | 33 ---- power/1.1/default/Power.cpp | 177 ------------------ power/1.1/default/Power.h | 63 ------- .../android.hardware.power@1.1-service.rc | 4 - power/1.1/default/service.cpp | 89 --------- power/Android.bp | 1 - 6 files changed, 367 deletions(-) delete mode 100644 power/1.1/default/Android.bp delete mode 100644 power/1.1/default/Power.cpp delete mode 100644 power/1.1/default/Power.h delete mode 100644 power/1.1/default/android.hardware.power@1.1-service.rc delete mode 100644 power/1.1/default/service.cpp diff --git a/power/1.1/default/Android.bp b/power/1.1/default/Android.bp deleted file mode 100644 index 0b3598bbf5..0000000000 --- a/power/1.1/default/Android.bp +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2016 The Android Open Source Project -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -cc_binary { - proprietary: true, - defaults: ["hidl_defaults"], - relative_install_path: "hw", - name: "android.hardware.power@1.1-service", - init_rc: ["android.hardware.power@1.1-service.rc"], - srcs: ["service.cpp" , "Power.cpp"], - - shared_libs: [ - "liblog", - "libdl", - "libutils", - "libhardware", - "libhidlbase", - "libhidltransport", - "android.hardware.power@1.0", - "android.hardware.power@1.1", - ], -} diff --git a/power/1.1/default/Power.cpp b/power/1.1/default/Power.cpp deleted file mode 100644 index b5d0c84bcc..0000000000 --- a/power/1.1/default/Power.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "android.hardware.power@1.1-impl" - -#include - -#include -#include - -#include "Power.h" - -namespace android { -namespace hardware { -namespace power { -namespace V1_1 { -namespace implementation { - -using ::android::hardware::power::V1_0::Feature; -using ::android::hardware::power::V1_0::PowerHint; -using ::android::hardware::power::V1_0::PowerStatePlatformSleepState; -using ::android::hardware::power::V1_0::Status; -using ::android::hardware::power::V1_1::PowerStateSubsystem; -using ::android::hardware::hidl_vec; -using ::android::hardware::Return; -using ::android::hardware::Void; - -Power::Power(power_module_t *module) : mModule(module) { - if (mModule) - mModule->init(mModule); -} - -Power::~Power() { - delete(mModule); -} - -// Methods from ::android::hardware::power::V1_0::IPower follow. -Return Power::setInteractive(bool interactive) { - if (mModule->setInteractive) - mModule->setInteractive(mModule, interactive ? 1 : 0); - return Void(); -} - -Return Power::powerHint(PowerHint hint, int32_t data) { - int32_t param = data; - if (mModule->powerHint) { - if (data) - mModule->powerHint(mModule, static_cast(hint), ¶m); - else - mModule->powerHint(mModule, static_cast(hint), NULL); - } - return Void(); -} - -Return Power::setFeature(Feature feature, bool activate) { - if (mModule->setFeature) - mModule->setFeature(mModule, static_cast(feature), - activate ? 1 : 0); - return Void(); -} - -Return Power::getPlatformLowPowerStats(getPlatformLowPowerStats_cb _hidl_cb) { - hidl_vec states; - ssize_t number_platform_modes; - size_t *voters = nullptr; - power_state_platform_sleep_state_t *legacy_states = nullptr; - int ret; - - if (mModule->get_number_of_platform_modes == nullptr || - mModule->get_voter_list == nullptr || - mModule->get_platform_low_power_stats == nullptr) - { - _hidl_cb(states, Status::SUCCESS); - return Void(); - } - - number_platform_modes = mModule->get_number_of_platform_modes(mModule); - if (number_platform_modes) - { - if ((ssize_t) (SIZE_MAX / sizeof(size_t)) <= number_platform_modes) // overflow - goto done; - voters = new (std::nothrow) size_t [number_platform_modes]; - if (voters == nullptr) - goto done; - - ret = mModule->get_voter_list(mModule, voters); - if (ret != 0) - goto done; - - if ((ssize_t) (SIZE_MAX / sizeof(power_state_platform_sleep_state_t)) - <= number_platform_modes) // overflow - goto done; - legacy_states = new (std::nothrow) - power_state_platform_sleep_state_t [number_platform_modes]; - if (legacy_states == nullptr) - goto done; - - for (int i = 0; i < number_platform_modes; i++) - { - legacy_states[i].voters = nullptr; - legacy_states[i].voters = new power_state_voter_t [voters[i]]; - if (legacy_states[i].voters == nullptr) - goto done; - } - - ret = mModule->get_platform_low_power_stats(mModule, legacy_states); - if (ret != 0) - goto done; - - states.resize(number_platform_modes); - for (int i = 0; i < number_platform_modes; i++) - { - power_state_platform_sleep_state_t& legacy_state = legacy_states[i]; - PowerStatePlatformSleepState& state = states[i]; - state.name = legacy_state.name; - state.residencyInMsecSinceBoot = legacy_state.residency_in_msec_since_boot; - state.totalTransitions = legacy_state.total_transitions; - state.supportedOnlyInSuspend = legacy_state.supported_only_in_suspend; - state.voters.resize(voters[i]); - for(size_t j = 0; j < voters[i]; j++) - { - state.voters[j].name = legacy_state.voters[j].name; - state.voters[j].totalTimeInMsecVotedForSinceBoot = legacy_state.voters[j].total_time_in_msec_voted_for_since_boot; - state.voters[j].totalNumberOfTimesVotedSinceBoot = legacy_state.voters[j].total_number_of_times_voted_since_boot; - } - } - } -done: - if (legacy_states) - { - for (int i = 0; i < number_platform_modes; i++) - { - if(legacy_states[i].voters) - delete(legacy_states[i].voters); - } - } - delete[] legacy_states; - delete[] voters; - _hidl_cb(states, Status::SUCCESS); - return Void(); -} - -// Methods from ::android::hardware::power::V1_1::IPower follow. -Return Power::getSubsystemLowPowerStats(getSubsystemLowPowerStats_cb _hidl_cb) { - hidl_vec subsystems; - ssize_t number_subsystems = 0; - - //This API will report zero subsystems to support older devices - //For devices that support this API, they will have their own implementation - subsystems.resize(number_subsystems); - _hidl_cb(subsystems, Status::SUCCESS); - return Void(); -} - -Return Power::powerHintAsync(PowerHint hint, int32_t data) { - // just call the normal power hint in this oneway function - return powerHint(hint, data); -} - -} // namespace implementation -} // namespace V1_1 -} // namespace power -} // namespace hardware -} // namespace android diff --git a/power/1.1/default/Power.h b/power/1.1/default/Power.h deleted file mode 100644 index e779d64d37..0000000000 --- a/power/1.1/default/Power.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_HARDWARE_POWER_V1_1_POWER_H -#define ANDROID_HARDWARE_POWER_V1_1_POWER_H - -#include -#include -#include -#include - -namespace android { -namespace hardware { -namespace power { -namespace V1_1 { -namespace implementation { - -using ::android::hardware::power::V1_0::Feature; -using ::android::hardware::power::V1_0::PowerHint; -using ::android::hardware::power::V1_1::IPower; -using ::android::hardware::Return; -using ::android::hardware::Void; - -struct Power : public IPower { - Power(power_module_t* module); - ~Power(); - - // Methods from ::android::hardware::power::V1_0::IPower follow - Return setInteractive(bool interactive) override; - Return powerHint(PowerHint hint, int32_t data) override; - Return setFeature(Feature feature, bool activate) override; - Return getPlatformLowPowerStats(getPlatformLowPowerStats_cb _hidl_cb) override; - - // Methods from ::android::hardware::power::V1_1::IPower follow. - Return getSubsystemLowPowerStats(getSubsystemLowPowerStats_cb _hidl_cb) override; - Return powerHintAsync(PowerHint hint, int32_t data) override; - - // Methods from ::android::hidl::base::V1_0::IBase follow. - - private: - power_module_t* mModule; -}; - -} // namespace implementation -} // namespace V1_1 -} // namespace power -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_POWER_V1_1_POWER_H diff --git a/power/1.1/default/android.hardware.power@1.1-service.rc b/power/1.1/default/android.hardware.power@1.1-service.rc deleted file mode 100644 index f2512f1b53..0000000000 --- a/power/1.1/default/android.hardware.power@1.1-service.rc +++ /dev/null @@ -1,4 +0,0 @@ -service power-hal-1-1 /vendor/bin/hw/android.hardware.power@1.1-service - class hal - user system - group system diff --git a/power/1.1/default/service.cpp b/power/1.1/default/service.cpp deleted file mode 100644 index 571db2f31c..0000000000 --- a/power/1.1/default/service.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "android.hardware.power@1.1-service" - -#include -#include -#include -#include -#include "Power.h" - -using android::sp; -using android::status_t; -using android::OK; - -// libhwbinder: -using android::hardware::configureRpcThreadpool; -using android::hardware::joinRpcThreadpool; - -// Generated HIDL files -using android::hardware::power::V1_1::IPower; -using android::hardware::power::V1_1::implementation::Power; - -int main() { - - status_t status; - android::sp service = nullptr; - const hw_module_t* hw_module = nullptr; - power_module_t* power_module = nullptr; - int err; - - ALOGI("Power HAL Service 1.1 (Default) is starting."); - - err = hw_get_module(POWER_HARDWARE_MODULE_ID, &hw_module); - if (err) { - ALOGE("hw_get_module %s failed: %d", POWER_HARDWARE_MODULE_ID, err); - goto shutdown; - } - - if (!hw_module->methods || !hw_module->methods->open) { - power_module = reinterpret_cast( - const_cast(hw_module)); - } else { - err = hw_module->methods->open(hw_module, POWER_HARDWARE_MODULE_ID, - reinterpret_cast(&power_module)); - if (err) { - ALOGE("Passthrough failed to load legacy HAL."); - goto shutdown; - } - } - - service = new Power(power_module); - if (service == nullptr) { - ALOGE("Can not create an instance of Power HAL Iface, exiting."); - - goto shutdown; - } - - configureRpcThreadpool(1, true /*callerWillJoin*/); - - status = service->registerAsService(); - if (status != OK) { - ALOGE("Could not register service for Power HAL Iface (%d).", status); - goto shutdown; - } - - ALOGI("Power Service is ready"); - joinRpcThreadpool(); - //Should not pass this line - -shutdown: - // In normal operation, we don't expect the thread pool to exit - - ALOGE("Power Service is shutting down"); - return 1; -} diff --git a/power/Android.bp b/power/Android.bp index 7a315faab3..a5415df348 100644 --- a/power/Android.bp +++ b/power/Android.bp @@ -4,6 +4,5 @@ subdirs = [ "1.0/default", "1.0/vts/functional", "1.1", - "1.1/default", "1.1/vts/functional", ] From 8d2d747e9edcd6f3d20ddffe2c6ca80b61766c1e Mon Sep 17 00:00:00 2001 From: Nathan Harold Date: Tue, 29 Aug 2017 20:41:36 -0700 Subject: [PATCH 205/265] Fix docstrings for RIL_CellIdentity Update the documentation to match the current CTS requirements for Cell Identity reporting -For LTE, WCDMA, and GSM require that the channel number be reported. -For LTE and WCDMA, require that the correct physical channel identifier be reported. Note that due to b/32774471 we still cannot require BSIC to be reported. Bug: 65174915 Test: none, comment-only change Change-Id: I93fcce3b39401e8965f724722361c2cadc4a88cc --- current.txt | 1 + radio/1.0/types.hal | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/current.txt b/current.txt index f045fd852d..5207c6aa05 100644 --- a/current.txt +++ b/current.txt @@ -244,5 +244,6 @@ a432d6d9200248dc2126827bcd6cdea31dd65eff39b939f64585d27d915a5857 android.hardwar 86ba9c03978b79a742e990420bc5ced0673d25a939f82572996bef92621e2014 android.hardware.cas@1.0::IMediaCasService 503da837d1a67cbdb7c08a033e927e5430ae1b159d98bf72c6336b4dcc5e76f5 android.hardware.cas.native@1.0::types 619600109232ed64b827c8a11beed8070b1827ae464547d7aa146cf0473b4bca android.hardware.cas.native@1.0::IDescrambler +0a159f81359cd4f71bbe00972ee8403ea79351fb7c0cd48be72ebb3e424dbaef android.hardware.radio@1.0::types f4945e397b5dea41bb64518dfde59be71245d8a125fd1e0acffeb57ac7b08fed android.hardware.thermal@1.1::IThermal c8bc853546dd55584611def2a9fa1d99f657e3366c976d2f60fe6b8aa6d2cb87 android.hardware.thermal@1.1::IThermalCallback diff --git a/radio/1.0/types.hal b/radio/1.0/types.hal index c5d7f8aa04..4d22bc0f27 100644 --- a/radio/1.0/types.hal +++ b/radio/1.0/types.hal @@ -1507,8 +1507,8 @@ struct CellIdentityGsm { int32_t lac; // 16-bit Location Area Code, 0..65535, INT_MAX if unknown int32_t cid; // 16-bit GSM Cell Identity described in // TS 27.007, 0..65535, INT_MAX if unknown - int32_t arfcn; // 16-bit GSM Absolute RF channel number, INT_MAX if - // unknown + int32_t arfcn; // 16-bit GSM Absolute RF channel number; this value must + // be valid uint8_t bsic; // 6-bit Base Station Identity Code, 0xFF if unknown }; @@ -1520,9 +1520,9 @@ struct CellIdentityWcdma { int32_t cid; // 28-bit UMTS Cell Identity described in // TS 25.331, 0..268435455, INT_MAX if unknown int32_t psc; // 9-bit UMTS Primary Scrambling Code described in - // TS 25.331, 0..511, INT_MAX if unknown - int32_t uarfcn; // 16-bit UMTS Absolute RF Channel Number, INT_MAX if - // unknown + // TS 25.331, 0..511; this value must be valid + int32_t uarfcn; // 16-bit UMTS Absolute RF Channel Number; this value must + // be valid }; struct CellIdentityCdma { @@ -1547,10 +1547,10 @@ struct CellIdentityLte { // unknown int32_t ci; // 28-bit Cell Identity described in TS TS 27.007, INT_MAX // if unknown - int32_t pci; // physical cell id 0..503, INT_MAX if unknown + int32_t pci; // physical cell id 0..503; this value must be valid int32_t tac; // 16-bit tracking area code, INT_MAX if unknown - int32_t earfcn; // 18-bit LTE Absolute RC Channel Number, INT_MAX if - // unknown + int32_t earfcn; // 18-bit LTE Absolute RF Channel Number; this value must + // be valid }; struct CellIdentityTdscdma { From ab70ddf2eb6089012d8fcf74ad629f3d7561399b Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Tue, 12 Sep 2017 11:36:06 -0700 Subject: [PATCH 206/265] Adjust AM/FM region ranges. Bug: 64541927 Test: instrumentation Change-Id: I34ea5b0b426f0c0c73d1cbc2d64cb67e2d4b7bd6 --- broadcastradio/1.1/default/BroadcastRadio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/broadcastradio/1.1/default/BroadcastRadio.cpp b/broadcastradio/1.1/default/BroadcastRadio.cpp index 38b4b99007..1bcfd824f7 100644 --- a/broadcastradio/1.1/default/BroadcastRadio.cpp +++ b/broadcastradio/1.1/default/BroadcastRadio.cpp @@ -64,7 +64,7 @@ static const map gModuleConfigs{ }), AmFmBandConfig({ Band::FM_HD, - 87900, // lowerLimit + 87700, // lowerLimit 107900, // upperLimit {200}, // spacings }), From 6550022dbafb199568af856bda200d56b5ebacbf Mon Sep 17 00:00:00 2001 From: Yin-Chia Yeh Date: Tue, 12 Sep 2017 16:35:29 -0700 Subject: [PATCH 207/265] Camera: synchronize access to mMemoryMap Test: stress test on partner device Bug: 64831570 Change-Id: Ib9ece2f876ccb309c4f1bb8f90242a3e91081f47 --- camera/device/1.0/default/CameraDevice.cpp | 26 ++++++++++++++++---- camera/device/1.0/default/CameraDevice_1_0.h | 2 ++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/camera/device/1.0/default/CameraDevice.cpp b/camera/device/1.0/default/CameraDevice.cpp index c53c0d8b56..a03bbc8670 100644 --- a/camera/device/1.0/default/CameraDevice.cpp +++ b/camera/device/1.0/default/CameraDevice.cpp @@ -377,10 +377,14 @@ camera_memory_t* CameraDevice::sGetMemory(int fd, size_t buf_size, uint_t num_bu hidl_handle hidlHandle = mem->mHidlHandle; MemoryId id = object->mDeviceCallback->registerMemory(hidlHandle, buf_size, num_bufs); mem->handle.mId = id; - if (object->mMemoryMap.count(id) != 0) { - ALOGE("%s: duplicate MemoryId %d returned by client!", __FUNCTION__, id); + + { + Mutex::Autolock _l(object->mMemoryMapLock); + if (object->mMemoryMap.count(id) != 0) { + ALOGE("%s: duplicate MemoryId %d returned by client!", __FUNCTION__, id); + } + object->mMemoryMap[id] = mem; } - object->mMemoryMap[id] = mem; mem->handle.mDevice = object; return &mem->handle; } @@ -398,7 +402,10 @@ void CameraDevice::sPutMemory(camera_memory_t *data) { ALOGE("%s: camera HAL return memory while camera is not opened!", __FUNCTION__); } device->mDeviceCallback->unregisterMemory(mem->handle.mId); - device->mMemoryMap.erase(mem->handle.mId); + { + Mutex::Autolock _l(device->mMemoryMapLock); + device->mMemoryMap.erase(mem->handle.mId); + } mem->decStrong(mem); } @@ -826,7 +833,16 @@ void CameraDevice::releaseRecordingFrameLocked( return; } if (mDevice->ops->release_recording_frame) { - CameraHeapMemory* camMemory = mMemoryMap.at(memId); + CameraHeapMemory* camMemory; + { + Mutex::Autolock _l(mMemoryMapLock); + auto it = mMemoryMap.find(memId); + if (it == mMemoryMap.end() || it->second == nullptr) { + ALOGE("%s unknown memoryId %d", __FUNCTION__, memId); + return; + } + camMemory = it->second; + } if (bufferIndex >= camMemory->mNumBufs) { ALOGE("%s: bufferIndex %d exceeds number of buffers %d", __FUNCTION__, bufferIndex, camMemory->mNumBufs); diff --git a/camera/device/1.0/default/CameraDevice_1_0.h b/camera/device/1.0/default/CameraDevice_1_0.h index c078596317..2c980f0a8f 100644 --- a/camera/device/1.0/default/CameraDevice_1_0.h +++ b/camera/device/1.0/default/CameraDevice_1_0.h @@ -165,6 +165,8 @@ private: sp mDeviceCallback = nullptr; + mutable Mutex mMemoryMapLock; // gating access to mMemoryMap + // must not hold mLock after this lock is acquired std::unordered_map mMemoryMap; bool mMetadataMode = false; From 61ae6edbe635759cece1102749ec4cb6e6b7e485 Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Mon, 11 Sep 2017 20:27:50 -0700 Subject: [PATCH 208/265] Neuralnetworks HAL cleanup -- hardware/interfaces Does three primary cleanups: 1) Removes unused OperandTypes, creates OEM types 2) Creates explicit ErrorStatus; functions return status 3) IDevice::initialize renamed to getCapabilities, IDevice::getSupportedSubgraph renamed to getSupportedOperations Additionally fixes the corresponding VTS tests. Bug: 63905942 Test: mm, vts Change-Id: Ib4c61b9b13963ac2367f21dc3c20e5946eb955a9 --- neuralnetworks/1.0/IDevice.hal | 10 +-- neuralnetworks/1.0/IEvent.hal | 2 +- neuralnetworks/1.0/IPreparedModel.hal | 2 +- neuralnetworks/1.0/types.hal | 27 ++++---- neuralnetworks/1.0/vts/functional/Event.cpp | 4 +- neuralnetworks/1.0/vts/functional/Event.h | 6 +- .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 65 +++++++++++-------- 7 files changed, 63 insertions(+), 53 deletions(-) diff --git a/neuralnetworks/1.0/IDevice.hal b/neuralnetworks/1.0/IDevice.hal index 9e190977bc..ec3b27f985 100644 --- a/neuralnetworks/1.0/IDevice.hal +++ b/neuralnetworks/1.0/IDevice.hal @@ -22,11 +22,13 @@ import IEvent; import IPreparedModel; interface IDevice { - initialize() generates(Capabilities capabilities); + getCapabilities() generates (ErrorStatus status, Capabilities capabilities); - getSupportedSubgraph(Model model) generates(vec supported); + getSupportedOperations(Model model) + generates (ErrorStatus status, vec supportedOperations); - prepareModel(Model model, IEvent event) generates(IPreparedModel preparedModel); + prepareModel(Model model, IEvent event) + generates (ErrorStatus status, IPreparedModel preparedModel); - getStatus() generates(DeviceStatus status); + getStatus() generates (DeviceStatus status); }; diff --git a/neuralnetworks/1.0/IEvent.hal b/neuralnetworks/1.0/IEvent.hal index 63afeaf9c3..cf71bbcd41 100644 --- a/neuralnetworks/1.0/IEvent.hal +++ b/neuralnetworks/1.0/IEvent.hal @@ -44,6 +44,6 @@ interface IEvent { * @param status Status of the execution associated with the Event. * Should be SUCCESS or ERROR. */ - oneway notify(Status status); + oneway notify(ErrorStatus status); }; diff --git a/neuralnetworks/1.0/IPreparedModel.hal b/neuralnetworks/1.0/IPreparedModel.hal index 428ddc7a1a..1b826102b3 100644 --- a/neuralnetworks/1.0/IPreparedModel.hal +++ b/neuralnetworks/1.0/IPreparedModel.hal @@ -22,5 +22,5 @@ import IEvent; interface IPreparedModel { // Multiple threads can call this execute function concurrently. - execute(Request request, IEvent event) generates(bool success); + execute(Request request, IEvent event) generates (ErrorStatus status); }; diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index 844c44c14d..870c06778d 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -22,18 +22,14 @@ package android.hardware.neuralnetworks@1.0; // These values are the same as found in the NeuralNetworks.h file. // When modifying, be sure to update HAL_NUM_OPERAND_TYPES in HalIntefaces.h. enum OperandType : uint32_t { - FLOAT16 = 0, + OEM = 0, FLOAT32 = 1, - INT8 = 2, - UINT8 = 3, - INT16 = 4, - UINT16 = 5, - INT32 = 6, - UINT32 = 7, - TENSOR_FLOAT16 = 8, - TENSOR_FLOAT32 = 9, - TENSOR_INT32 = 10, - TENSOR_QUANT8_ASYMM = 11, + INT32 = 2, // TODO: is this needed? + UINT32 = 3, + TENSOR_OEM_BYTE = 4, + TENSOR_FLOAT32 = 5, + TENSOR_INT32 = 6, + TENSOR_QUANT8_ASYMM = 7, }; // The type of operations. Unlike the operation types found in @@ -210,7 +206,10 @@ struct Request { vec pools; }; -enum Status : uint32_t { - SUCCESS, - ERROR, +enum ErrorStatus : uint32_t { + NONE, + DEVICE_UNAVAILABLE, + GENERAL_FAILURE, + OUTPUT_INSUFFICIENT_SIZE, + INVALID_ARGUMENT, }; diff --git a/neuralnetworks/1.0/vts/functional/Event.cpp b/neuralnetworks/1.0/vts/functional/Event.cpp index 67de4f566a..efaacb3dcb 100644 --- a/neuralnetworks/1.0/vts/functional/Event.cpp +++ b/neuralnetworks/1.0/vts/functional/Event.cpp @@ -21,10 +21,10 @@ Event::~Event() { // thread::join failed: Resource deadlock would occur } -Return Event::notify(ReturnedStatus status) { +Return Event::notify(ErrorStatus status) { { std::lock_guard lock(mMutex); - mStatus = status == ReturnedStatus::SUCCESS ? Status::SUCCESS : Status::ERROR; + mStatus = status == ErrorStatus::NONE ? Status::SUCCESS : Status::ERROR; if (mStatus == Status::SUCCESS && mCallback != nullptr) { bool success = mCallback(); if (!success) { diff --git a/neuralnetworks/1.0/vts/functional/Event.h b/neuralnetworks/1.0/vts/functional/Event.h index 4f7f2f603e..7dd40703c5 100644 --- a/neuralnetworks/1.0/vts/functional/Event.h +++ b/neuralnetworks/1.0/vts/functional/Event.h @@ -24,8 +24,6 @@ using ::android::hardware::Return; using ::android::hardware::Void; using ::android::sp; -using ReturnedStatus = ::android::hardware::neuralnetworks::V1_0::Status; - /** * The Event class is used internally by the Neuralnetworks runtime to * synchronize between different threads. An asynchronous task is launched @@ -77,9 +75,9 @@ struct Event : public IEvent { * * IEvent::notify can be called at most once on a given event. * - * @param neuralnetworks::V1_0::Status SUCCESS or ERROR + * @param neuralnetworks::V1_0::ErrorStatus ErrorStatus::NONE on success */ - Return notify(ReturnedStatus status) override; + Return notify(ErrorStatus status) override; /** * Event::poll returns the current status of the event. diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp index 9c64c04825..cd8a527b26 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -64,24 +64,27 @@ TEST_F(NeuralnetworksHidlTest, CreateDevice) {} // status test TEST_F(NeuralnetworksHidlTest, StatusTest) { - DeviceStatus status = device->getStatus(); - EXPECT_EQ(DeviceStatus::AVAILABLE, status); + Return status = device->getStatus(); + ASSERT_TRUE(status.isOk()); + EXPECT_EQ(DeviceStatus::AVAILABLE, static_cast(status)); } // initialization -TEST_F(NeuralnetworksHidlTest, InitializeTest) { - Return ret = device->initialize([](const Capabilities& capabilities) { - EXPECT_NE(nullptr, capabilities.supportedOperationTuples.data()); - EXPECT_NE(0ull, capabilities.supportedOperationTuples.size()); - EXPECT_EQ(0u, static_cast(capabilities.cachesCompilation) & ~0x1); - EXPECT_LT(0.0f, capabilities.bootupTime); - EXPECT_LT(0.0f, capabilities.float16Performance.execTime); - EXPECT_LT(0.0f, capabilities.float16Performance.powerUsage); - EXPECT_LT(0.0f, capabilities.float32Performance.execTime); - EXPECT_LT(0.0f, capabilities.float32Performance.powerUsage); - EXPECT_LT(0.0f, capabilities.quantized8Performance.execTime); - EXPECT_LT(0.0f, capabilities.quantized8Performance.powerUsage); - }); +TEST_F(NeuralnetworksHidlTest, GetCapabilitiesTest) { + Return ret = + device->getCapabilities([](ErrorStatus status, const Capabilities& capabilities) { + EXPECT_EQ(ErrorStatus::NONE, status); + EXPECT_NE(nullptr, capabilities.supportedOperationTuples.data()); + EXPECT_NE(0ull, capabilities.supportedOperationTuples.size()); + EXPECT_EQ(0u, static_cast(capabilities.cachesCompilation) & ~0x1); + EXPECT_LT(0.0f, capabilities.bootupTime); + EXPECT_LT(0.0f, capabilities.float16Performance.execTime); + EXPECT_LT(0.0f, capabilities.float16Performance.powerUsage); + EXPECT_LT(0.0f, capabilities.float32Performance.execTime); + EXPECT_LT(0.0f, capabilities.float32Performance.powerUsage); + EXPECT_LT(0.0f, capabilities.quantized8Performance.execTime); + EXPECT_LT(0.0f, capabilities.quantized8Performance.powerUsage); + }); EXPECT_TRUE(ret.isOk()); } @@ -192,13 +195,14 @@ hidl_memory allocateSharedMemory(int64_t size, const std::string& type = "ashmem } // anonymous namespace // supported subgraph test -TEST_F(NeuralnetworksHidlTest, SupportedSubgraphTest) { +TEST_F(NeuralnetworksHidlTest, SupportedOperationsTest) { Model model = createTestModel(); - std::vector supported; - Return ret = device->getSupportedSubgraph( - model, [&](const hidl_vec& hidl_supported) { supported = hidl_supported; }); - ASSERT_TRUE(ret.isOk()); - EXPECT_EQ(/*model.operations.size()*/ 0ull, supported.size()); + Return ret = device->getSupportedOperations( + model, [&](ErrorStatus status, const hidl_vec& supported) { + EXPECT_EQ(ErrorStatus::NONE, status); + EXPECT_EQ(model.operations.size(), supported.size()); + }); + EXPECT_TRUE(ret.isOk()); } // execute simple graph @@ -211,9 +215,15 @@ TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphTest) { // prepare request Model model = createTestModel(); + sp preparedModel; sp preparationEvent = new Event(); ASSERT_NE(nullptr, preparationEvent.get()); - sp preparedModel = device->prepareModel(model, preparationEvent); + Return prepareRet = device->prepareModel( + model, preparationEvent, [&](ErrorStatus status, const sp& prepared) { + EXPECT_EQ(ErrorStatus::NONE, status); + preparedModel = prepared; + }); + ASSERT_TRUE(prepareRet.isOk()); ASSERT_NE(nullptr, preparedModel.get()); Event::Status preparationStatus = preparationEvent->wait(); EXPECT_EQ(Event::Status::SUCCESS, preparationStatus); @@ -251,11 +261,12 @@ TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphTest) { // execute request sp executionEvent = new Event(); ASSERT_NE(nullptr, executionEvent.get()); - bool success = preparedModel->execute({.inputs = inputs, .outputs = outputs, .pools = pools}, - executionEvent); - EXPECT_TRUE(success); - Event::Status executionStatus = executionEvent->wait(); - EXPECT_EQ(Event::Status::SUCCESS, executionStatus); + Return executeStatus = preparedModel->execute( + {.inputs = inputs, .outputs = outputs, .pools = pools}, executionEvent); + ASSERT_TRUE(executeStatus.isOk()); + EXPECT_EQ(ErrorStatus::NONE, static_cast(executeStatus)); + Event::Status eventStatus = executionEvent->wait(); + EXPECT_EQ(Event::Status::SUCCESS, eventStatus); // validate results { 1+5, 2+6, 3+7, 4+8 } outputMemory->read(); From 2c4e1368e1dacbe9fa3d8e696e713bb08f09953e Mon Sep 17 00:00:00 2001 From: "I-Jui (Ray) Sung" Date: Wed, 6 Sep 2017 02:15:54 -0700 Subject: [PATCH 209/265] Test harness for generated tests Created initial test harness for test models and examples from NNAPI test generator in VtsHalNeuralnetworksV1_0TargetTest. As an example, also added a test generated from test spec at frameworks/ml/nn/tools/test_generator/tests/P_vts_full/. Generated model setup code and examples are from: frameworks/ml/nn/runtime/test/generated/examples and frameworks/ml/nn/runtime/test/generated/vts_models respectively. Bug: 63905942 Bug: 63525563 Test: VtsHalNeuralnetworksV1_0TargetTest with sample driver enabled by cherry-pick Change-Id: Ief029eed9718c8724ef0b64fc6a7f6b9a7bc7b7b --- neuralnetworks/1.0/vts/functional/Android.bp | 5 + .../vts/functional/GeneratedTestHarness.cpp | 191 ++++++++++++++++++ .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 37 ++-- 3 files changed, 217 insertions(+), 16 deletions(-) create mode 100644 neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp diff --git a/neuralnetworks/1.0/vts/functional/Android.bp b/neuralnetworks/1.0/vts/functional/Android.bp index 1efff0e0e5..2318430020 100644 --- a/neuralnetworks/1.0/vts/functional/Android.bp +++ b/neuralnetworks/1.0/vts/functional/Android.bp @@ -18,6 +18,7 @@ cc_test { name: "VtsHalNeuralnetworksV1_0TargetTest", srcs: [ "Event.cpp", + "GeneratedTestHarness.cpp", "VtsHalNeuralnetworksV1_0TargetTest.cpp", ], defaults: ["VtsHalTargetTestDefaults"], @@ -27,4 +28,8 @@ cc_test { "android.hidl.memory@1.0", "libhidlmemory", ], + header_libs: [ + "libneuralnetworks_generated_test_harness_headers", + "libneuralnetworks_generated_tests", + ], } diff --git a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp new file mode 100644 index 0000000000..2f557f8794 --- /dev/null +++ b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp @@ -0,0 +1,191 @@ +/* + * Copyright (C) 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. + */ + +#include "Event.h" +#include "TestHarness.h" +#include "VtsHalNeuralnetworksV1_0TargetTest.h" + +#include +#include +#include + +namespace android { +namespace hardware { +namespace neuralnetworks { +namespace V1_0 { +namespace vts { +namespace functional { +// allocator helper +hidl_memory allocateSharedMemory(int64_t size, const std::string& type = "ashmem"); + +namespace generated_tests { +using ::android::hardware::neuralnetworks::V1_0::implementation::Event; +using ::generated_tests::for_all; +using ::generated_tests::for_each; +using ::generated_tests::resize_accordingly; +using ::generated_tests::MixedTyped; +using ::generated_tests::MixedTypedExampleType; +using ::generated_tests::Float32Operands; +using ::generated_tests::Int32Operands; +using ::generated_tests::Quant8Operands; +// Top level driver for models and examples generated by test_generator.py +// Test driver for those generated from ml/nn/runtime/test/spec +void Execute(const sp& device, std::function create_model, + const std::vector& examples) { + Model model = create_model(); + sp preparedModel; + sp preparationEvent = new Event(); + ASSERT_NE(nullptr, preparationEvent.get()); + Return prepareRet = device->prepareModel( + model, preparationEvent, [&](ErrorStatus status, const sp& prepared) { + EXPECT_EQ(ErrorStatus::NONE, status); + preparedModel = prepared; + }); + ASSERT_TRUE(prepareRet.isOk()); + ASSERT_NE(nullptr, preparedModel.get()); + Event::Status preparationStatus = preparationEvent->wait(); + EXPECT_EQ(Event::Status::SUCCESS, preparationStatus); + + const uint32_t INPUT = 0; + const uint32_t OUTPUT = 1; + + int example_no = 1; + for (auto& example : examples) { + SCOPED_TRACE(example_no++); + + const MixedTyped& inputs = example.first; + const MixedTyped& golden = example.second; + + std::vector inputs_info, outputs_info; + uint32_t inputSize = 0, outputSize = 0; + + // This function only partially specifies the metadata (vector of RequestArguments). + // The contents are copied over below. + for_all(inputs, [&inputs_info, &inputSize](int index, auto, auto s) { + if (inputs_info.size() <= static_cast(index)) inputs_info.resize(index + 1); + RequestArgument arg = { + .location = {.poolIndex = INPUT, .offset = 0, .length = static_cast(s)}, + .dimensions = {}, + }; + inputs_info[index] = arg; + inputSize += s; + }); + // Compute offset for inputs 1 and so on + { + size_t offset = 0; + for (auto& i : inputs_info) { + i.location.offset = offset; + offset += i.location.length; + } + } + + MixedTyped test; // holding test results + + // Go through all outputs, initialize RequestArgument descriptors + resize_accordingly(golden, test); + resize_accordingly(golden, test); + resize_accordingly(golden, test); + for_all(golden, [&outputs_info, &outputSize](int index, auto, auto s) { + if (outputs_info.size() <= static_cast(index)) outputs_info.resize(index + 1); + RequestArgument arg = { + .location = {.poolIndex = OUTPUT, .offset = 0, .length = static_cast(s)}, + .dimensions = {}, + }; + outputs_info[index] = arg; + outputSize += s; + }); + // Compute offset for outputs 1 and so on + { + size_t offset = 0; + for (auto& i : outputs_info) { + i.location.offset = offset; + offset += i.location.length; + } + } + std::vector pools = {allocateSharedMemory(inputSize), + allocateSharedMemory(outputSize)}; + ASSERT_NE(0ull, pools[INPUT].size()); + ASSERT_NE(0ull, pools[OUTPUT].size()); + + // load data + sp inputMemory = mapMemory(pools[INPUT]); + sp outputMemory = mapMemory(pools[OUTPUT]); + ASSERT_NE(nullptr, inputMemory.get()); + ASSERT_NE(nullptr, outputMemory.get()); + char* inputPtr = reinterpret_cast(static_cast(inputMemory->getPointer())); + char* outputPtr = reinterpret_cast(static_cast(outputMemory->getPointer())); + ASSERT_NE(nullptr, inputPtr); + ASSERT_NE(nullptr, outputPtr); + inputMemory->update(); + outputMemory->update(); + + // Go through all inputs, copy the values + for_all(inputs, [&inputs_info, inputPtr](int index, auto p, auto s) { + char* begin = (char*)p; + char* end = begin + s; + // TODO: handle more than one input + std::copy(begin, end, inputPtr + inputs_info[index].location.offset); + }); + + inputMemory->commit(); + outputMemory->commit(); + // execute request + sp executionEvent = new Event(); + ASSERT_NE(nullptr, executionEvent.get()); + Return executeStatus = preparedModel->execute( + {.inputs = inputs_info, .outputs = outputs_info, .pools = pools}, executionEvent); + ASSERT_TRUE(executeStatus.isOk()); + EXPECT_EQ(ErrorStatus::NONE, static_cast(executeStatus)); + Event::Status eventStatus = executionEvent->wait(); + EXPECT_EQ(Event::Status::SUCCESS, eventStatus); + + // validate results + outputMemory->read(); +#define COPY_BACK(ty) \ + for_each(test, [&outputs_info, outputPtr](int index, std::vector& m) { \ + RequestArgument& i = outputs_info[index]; \ + ASSERT_EQ(m.size(), i.location.length / sizeof(ty)); \ + char* begin = outputPtr + i.location.offset; \ + memcpy(m.data(), begin, i.location.length); \ + }); + COPY_BACK(float); + COPY_BACK(int32_t); + COPY_BACK(uint8_t); +#undef COPY_BACK + outputMemory->commit(); + // We want "close-enough" results for float + for_each(golden, [&test](int index, auto& golden_float) { + auto& test_float_operands = std::get(test); + auto& test_float = test_float_operands[index]; + for (unsigned int i = 0; i < golden_float.size(); i++) { + SCOPED_TRACE(i); + EXPECT_FLOAT_EQ(golden_float[i], test_float[i]); + } + }); + + EXPECT_EQ(std::get(golden), std::get(test)); + EXPECT_EQ(std::get(golden), std::get(test)); + } +} + +} // namespace generated_tests + +} // namespace functional +} // namespace vts +} // namespace V1_0 +} // namespace neuralnetworks +} // namespace hardware +} // namespace android diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp index cd8a527b26..5a20f44a60 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -16,12 +16,13 @@ #define LOG_TAG "neuralnetworks_hidl_hal_test" -#include "Event.h" #include "VtsHalNeuralnetworksV1_0TargetTest.h" +#include "Event.h" +#include "TestHarness.h" + #include #include #include -#include namespace android { namespace hardware { @@ -31,6 +32,11 @@ namespace vts { namespace functional { using ::android::hardware::neuralnetworks::V1_0::implementation::Event; +using ::generated_tests::MixedTypedExampleType; +namespace generated_tests { +extern void Execute(const sp&, std::function, + const std::vector&); +} // A class for test environment setup NeuralnetworksHidlEnvironment::NeuralnetworksHidlEnvironment() {} @@ -107,9 +113,7 @@ Model createTestModel() { .scale = 0.0f, .zeroPoint = 0, .lifetime = OperandLifeTime::MODEL_INPUT, - .location = {.poolIndex = 0, - .offset = 0, - .length = 0}, + .location = {.poolIndex = 0, .offset = 0, .length = 0}, }, { .type = OperandType::TENSOR_FLOAT32, @@ -118,9 +122,7 @@ Model createTestModel() { .scale = 0.0f, .zeroPoint = 0, .lifetime = OperandLifeTime::CONSTANT_COPY, - .location = {.poolIndex = 0, - .offset = 0, - .length = size}, + .location = {.poolIndex = 0, .offset = 0, .length = size}, }, { .type = OperandType::INT32, @@ -129,9 +131,7 @@ Model createTestModel() { .scale = 0.0f, .zeroPoint = 0, .lifetime = OperandLifeTime::CONSTANT_COPY, - .location = {.poolIndex = 0, - .offset = size, - .length = sizeof(int32_t)}, + .location = {.poolIndex = 0, .offset = size, .length = sizeof(int32_t)}, }, { .type = OperandType::TENSOR_FLOAT32, @@ -140,9 +140,7 @@ Model createTestModel() { .scale = 0.0f, .zeroPoint = 0, .lifetime = OperandLifeTime::MODEL_OUTPUT, - .location = {.poolIndex = 0, - .offset = 0, - .length = 0}, + .location = {.poolIndex = 0, .offset = 0, .length = 0}, }, }; @@ -172,6 +170,7 @@ Model createTestModel() { .pools = pools, }; } +} // anonymous namespace // allocator helper hidl_memory allocateSharedMemory(int64_t size, const std::string& type = "ashmem") { @@ -192,7 +191,6 @@ hidl_memory allocateSharedMemory(int64_t size, const std::string& type = "ashmem return memory; } -} // anonymous namespace // supported subgraph test TEST_F(NeuralnetworksHidlTest, SupportedOperationsTest) { @@ -275,8 +273,15 @@ TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphTest) { EXPECT_EQ(expectedData, outputData); } +// Mixed-typed examples +typedef MixedTypedExampleType MixedTypedExample; + +// in frameworks/ml/nn/runtime/tests/generated/ +#include "all_generated_vts_tests.cpp" + // TODO: Add tests for execution failure, or wait_for/wait_until timeout. -// Discussion: https://googleplex-android-review.git.corp.google.com/#/c/platform/hardware/interfaces/+/2654636/5/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp@222 +// Discussion: +// https://googleplex-android-review.git.corp.google.com/#/c/platform/hardware/interfaces/+/2654636/5/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp@222 } // namespace functional } // namespace vts From 74e087bb1da26f63b89ad9598b7632f2249ec1f7 Mon Sep 17 00:00:00 2001 From: Zhuoyao Zhang Date: Wed, 16 Aug 2017 10:21:09 -0700 Subject: [PATCH 210/265] Move android.hardware.tests.libhwbinder@1.0-impl to system.img Bug: 64723866 Test: make vts vts-tradefed run vts-performance Merged-In: Ib5e993d98f7fa12dcb2b418a995887b59394c849 Change-Id: Ib5e993d98f7fa12dcb2b418a995887b59394c849 --- tests/libhwbinder/1.0/default/Android.bp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/libhwbinder/1.0/default/Android.bp b/tests/libhwbinder/1.0/default/Android.bp index af4caeca11..13f9c1830a 100644 --- a/tests/libhwbinder/1.0/default/Android.bp +++ b/tests/libhwbinder/1.0/default/Android.bp @@ -1,7 +1,6 @@ cc_library_shared { name: "android.hardware.tests.libhwbinder@1.0-impl", relative_install_path: "hw", - proprietary: true, srcs: [ "Benchmark.cpp", "ScheduleTest.cpp", From 7adaf002becf87211b3ea02a8eb3708b39fa9ea6 Mon Sep 17 00:00:00 2001 From: Jeff Vander Stoep Date: Wed, 13 Sep 2017 07:54:45 -0700 Subject: [PATCH 211/265] Allow clock_gettime syscall for logging Addresses: __kernel_clock_gettime" access failed. The call flow is as follow: "configstore -> hidltransport.tryShortenProcessName -> ALOGI -> __android_log_print -> logdOpen -> netdClientConnect -> clock_gettime". Bug: 65611466 Test: build and boot sailfish Change-Id: I9e12c3a0969a7fe67c017d70f39a85792cf10bae --- .../1.0/default/seccomp_policy/configstore@1.0-arm64.policy | 1 + 1 file changed, 1 insertion(+) diff --git a/configstore/1.0/default/seccomp_policy/configstore@1.0-arm64.policy b/configstore/1.0/default/seccomp_policy/configstore@1.0-arm64.policy index 7e3dfe0c54..43bf1fac3c 100644 --- a/configstore/1.0/default/seccomp_policy/configstore@1.0-arm64.policy +++ b/configstore/1.0/default/seccomp_policy/configstore@1.0-arm64.policy @@ -39,6 +39,7 @@ exit_group: 1 rt_sigreturn: 1 getrlimit: 1 madvise: 1 +clock_gettime: 1 # used during process crash by crash_dump to dump process info rt_sigprocmask: 1 From a7cdb30b19a75de7fe0e516c86096d4b7a9e794f Mon Sep 17 00:00:00 2001 From: David Gross Date: Wed, 13 Sep 2017 12:31:33 -0700 Subject: [PATCH 212/265] Move OEM codes out of NeuralNetworks.h to new file NeuralNetworksOEM.h. Also remove FAKE_QUANT operation. Bug: 63905942 Test: nn/runtime/tests, vts Change-Id: Icfb5e7dbb9c2cca6e719ec2ab6344dbe5d95c86b --- neuralnetworks/1.0/types.hal | 87 ++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index 870c06778d..730d1f2741 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -19,56 +19,55 @@ package android.hardware.neuralnetworks@1.0; // The types an operand can have. -// These values are the same as found in the NeuralNetworks.h file. -// When modifying, be sure to update HAL_NUM_OPERAND_TYPES in HalIntefaces.h. +// These values are the same as found in the NeuralNetworks.h and NeuralNetworksOEM.h files. enum OperandType : uint32_t { - OEM = 0, - FLOAT32 = 1, - INT32 = 2, // TODO: is this needed? - UINT32 = 3, - TENSOR_OEM_BYTE = 4, - TENSOR_FLOAT32 = 5, - TENSOR_INT32 = 6, - TENSOR_QUANT8_ASYMM = 7, + FLOAT32 = 0, + INT32 = 1, + UINT32 = 2, + TENSOR_FLOAT32 = 3, + TENSOR_INT32 = 4, + TENSOR_QUANT8_ASYMM = 5, + + OEM = 10000, + TENSOR_OEM_BYTE = 10001, }; -// The type of operations. Unlike the operation types found in -// NeuralNetworks.h file, these specify the data type they operate on. +// The type of operations. Unlike the operation types found in the +// NeuralNetworks.h and NeuralNetworksOEM.h files, these specify the data type they operate on. // This is done to simplify the work of drivers. // TODO: Currently they are the same. Add a conversion when finalizing the model. -// When modifying, be sure to update HAL_NUM_OPERATION_TYPES in HalIntefaces.h. enum OperationType : uint32_t { - OEM_OPERATION = 0, - ADD = 1, - AVERAGE_POOL_2D = 2, - CONCATENATION = 3, - CONV_2D = 4, - DEPTHWISE_CONV_2D = 5, - DEPTH_TO_SPACE = 6, - DEQUANTIZE = 7, - EMBEDDING_LOOKUP = 8, - FAKE_QUANT = 9, - FLOOR = 10, - FULLY_CONNECTED = 11, - HASHTABLE_LOOKUP = 12, - L2_NORMALIZATION = 13, - L2_POOL_2D = 14, - LOCAL_RESPONSE_NORMALIZATION = 15, - LOGISTIC = 16, - LSH_PROJECTION = 17, - LSTM = 18, - MAX_POOL_2D = 19, - MUL = 20, - RELU = 21, - RELU1 = 22, - RELU6 = 23, - RESHAPE = 24, - RESIZE_BILINEAR = 25, - RNN = 26, - SOFTMAX = 27, - SPACE_TO_DEPTH = 28, - SVDF = 29, - TANH = 30, + ADD = 0, + AVERAGE_POOL_2D = 1, + CONCATENATION = 2, + CONV_2D = 3, + DEPTHWISE_CONV_2D = 4, + DEPTH_TO_SPACE = 5, + DEQUANTIZE = 6, + EMBEDDING_LOOKUP = 7, + FLOOR = 8, + FULLY_CONNECTED = 9, + HASHTABLE_LOOKUP = 10, + L2_NORMALIZATION = 11, + L2_POOL_2D = 12, + LOCAL_RESPONSE_NORMALIZATION = 13, + LOGISTIC = 14, + LSH_PROJECTION = 15, + LSTM = 16, + MAX_POOL_2D = 17, + MUL = 18, + RELU = 19, + RELU1 = 20, + RELU6 = 21, + RESHAPE = 22, + RESIZE_BILINEAR = 23, + RNN = 24, + SOFTMAX = 25, + SPACE_TO_DEPTH = 26, + SVDF = 27, + TANH = 28, + + OEM_OPERATION = 10000, }; // Fused activation functions From 5ea3ece7ca99dae31b5e505c267a54906556bafc Mon Sep 17 00:00:00 2001 From: Miao Wang Date: Wed, 13 Sep 2017 15:51:54 -0700 Subject: [PATCH 213/265] Make the enums signed int, remove unused info. Bug: 63905942 Test: NeuralNetworksTest pass Change-Id: I40ca1120d05ea8900f4f4e49409d3096f46ec0e1 --- neuralnetworks/1.0/types.hal | 13 +++++-------- .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 3 --- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index 730d1f2741..5e3cf54b3c 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -20,7 +20,7 @@ package android.hardware.neuralnetworks@1.0; // The types an operand can have. // These values are the same as found in the NeuralNetworks.h and NeuralNetworksOEM.h files. -enum OperandType : uint32_t { +enum OperandType : int32_t { FLOAT32 = 0, INT32 = 1, UINT32 = 2, @@ -36,7 +36,7 @@ enum OperandType : uint32_t { // NeuralNetworks.h and NeuralNetworksOEM.h files, these specify the data type they operate on. // This is done to simplify the work of drivers. // TODO: Currently they are the same. Add a conversion when finalizing the model. -enum OperationType : uint32_t { +enum OperationType : int32_t { ADD = 0, AVERAGE_POOL_2D = 1, CONCATENATION = 2, @@ -79,7 +79,7 @@ enum FusedActivationFunc : int32_t { }; // How an operand is used. -enum OperandLifeTime : uint32_t { +enum OperandLifeTime : int32_t { // The operand is internal to the model. It's created by an operation // and consumed by other operations. TEMPORARY_VARIABLE, @@ -95,7 +95,7 @@ enum OperandLifeTime : uint32_t { }; // Status of a device. -enum DeviceStatus : uint32_t { +enum DeviceStatus : int32_t { AVAILABLE, BUSY, OFFLINE, @@ -120,11 +120,8 @@ struct OperationTuple { // The capabilities of a driver. struct Capabilities { vec supportedOperationTuples; - // TODO Do the same for baseline model IDs bool cachesCompilation; // TODO revisit the data types and scales. - float bootupTime; // in nanoseconds - PerformanceInfo float16Performance; PerformanceInfo float32Performance; PerformanceInfo quantized8Performance; }; @@ -205,7 +202,7 @@ struct Request { vec pools; }; -enum ErrorStatus : uint32_t { +enum ErrorStatus : int32_t { NONE, DEVICE_UNAVAILABLE, GENERAL_FAILURE, diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp index 5a20f44a60..0302717767 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -83,9 +83,6 @@ TEST_F(NeuralnetworksHidlTest, GetCapabilitiesTest) { EXPECT_NE(nullptr, capabilities.supportedOperationTuples.data()); EXPECT_NE(0ull, capabilities.supportedOperationTuples.size()); EXPECT_EQ(0u, static_cast(capabilities.cachesCompilation) & ~0x1); - EXPECT_LT(0.0f, capabilities.bootupTime); - EXPECT_LT(0.0f, capabilities.float16Performance.execTime); - EXPECT_LT(0.0f, capabilities.float16Performance.powerUsage); EXPECT_LT(0.0f, capabilities.float32Performance.execTime); EXPECT_LT(0.0f, capabilities.float32Performance.powerUsage); EXPECT_LT(0.0f, capabilities.quantized8Performance.execTime); From 773369a372b7d90d89c6c4dd5782907789d69797 Mon Sep 17 00:00:00 2001 From: "I-Jui (Ray) Sung" Date: Wed, 13 Sep 2017 16:47:50 -0700 Subject: [PATCH 214/265] Relax tolerance for FP comparison in test harness Tests like RNN needs slightly more relaxed tolerance than 4ULP. Use 1e-5 from corresponding TFLite tests. Bug: 63905942 Test: VtsHalNeuralnetworksV1_0TargetTest on Angler Change-Id: I721711e13575f56e956d87e3ad537467f85e93f4 --- neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp index 2f557f8794..9c85c8c2cc 100644 --- a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp @@ -172,7 +172,7 @@ void Execute(const sp& device, std::function create_model, auto& test_float = test_float_operands[index]; for (unsigned int i = 0; i < golden_float.size(); i++) { SCOPED_TRACE(i); - EXPECT_FLOAT_EQ(golden_float[i], test_float[i]); + EXPECT_NEAR(golden_float[i], test_float[i], 1.e-5); } }); From c7821107652db4724b6c60d483824d72b8a6b663 Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Mon, 11 Sep 2017 16:03:36 -0700 Subject: [PATCH 215/265] Add documentation to the Neuralnetworks HIDL HAL. Bug: 63905942 Test: not needed Change-Id: I1582d20e66ef939581d82f21088f0db0bc0f5eb7 --- neuralnetworks/1.0/IDevice.hal | 49 + neuralnetworks/1.0/IEvent.hal | 14 +- neuralnetworks/1.0/IPreparedModel.hal | 26 +- neuralnetworks/1.0/types.hal | 1261 +++++++++++++++++++++++-- 4 files changed, 1237 insertions(+), 113 deletions(-) diff --git a/neuralnetworks/1.0/IDevice.hal b/neuralnetworks/1.0/IDevice.hal index ec3b27f985..b6f94330a2 100644 --- a/neuralnetworks/1.0/IDevice.hal +++ b/neuralnetworks/1.0/IDevice.hal @@ -21,14 +21,63 @@ package android.hardware.neuralnetworks@1.0; import IEvent; import IPreparedModel; +/** + * This interface represents a device driver. + */ interface IDevice { + /** + * Gets the capabilities of a driver. + * + * @return status ErrorStatus::NONE if successful. + * @return capabilities Capabilities of the driver. + */ getCapabilities() generates (ErrorStatus status, Capabilities capabilities); + /** + * Gets the supported operations in a model. + * + * getSupportedSubgraph provides a more nuanced indication on whether a + * model is able to be compiled by the driver. Having the entire model + * allows for additional information such as tensor shapes to inputs or + * tensor strides, information which is not known in "initialize". + * + * @param model A model whose operations--and their corresponding + * operands--are to be verified by the driver. + * @return status ErrorStatus::NONE if successful. + * @return supportedOperations A list of supported operations, where true + * indicates the operation is supported and + * false indicates the operation is not + * supported. The index of "supported" + * corresponds with the index of the operation + * it is describing. + */ getSupportedOperations(Model model) generates (ErrorStatus status, vec supportedOperations); + /** + * Prepares a model for execution. + * + * prepareModel is used to make any necessary transformations or alternative + * representations to a model for execution, possible including + * transformations on the constant data, optimization on the model's graph, + * or compilation into the device's native binary. + * + * The only information that may be unknown to the model at this stage is + * the shape of the tensors, which may only be known at execution time. + * + * @param model The model to be prepared for execution. + * @param event A synchronization callback that must be signaled once the + * execution has finished. + * @return status ErrorStatus::NONE if successful. + * @return preparedModel A handle to the resultant prepared model. + */ prepareModel(Model model, IEvent event) generates (ErrorStatus status, IPreparedModel preparedModel); + /** + * Returns the current status of a driver. + * + * @return status Status of the driver. + */ getStatus() generates (DeviceStatus status); }; diff --git a/neuralnetworks/1.0/IEvent.hal b/neuralnetworks/1.0/IEvent.hal index cf71bbcd41..2ebda58948 100644 --- a/neuralnetworks/1.0/IEvent.hal +++ b/neuralnetworks/1.0/IEvent.hal @@ -29,21 +29,15 @@ package android.hardware.neuralnetworks@1.0; * indicate to the Neuralnetworks runtime whether the computation was * successful or not, and that the corresponding output is ready to be * consumed if the execution was successful. - * - * TODO: Mention that "notify" is also called by a runtime thread - * during CPU fallback execution? Depends on whether the HIDL comments - * are strictly for vendors or not. */ interface IEvent { /** - * IEvent::notify is called by the server thread (i.e. the thread doing the - * work) to mark the event as completed so that any threads requiring the - * corresponding resources can continue executing. + * IEvent::notify is called by the server thread (i.e., the thread doing + * the work) to mark the event as completed so that any threads requiring + * the corresponding output can continue executing. * - * @param status Status of the execution associated with the Event. - * Should be SUCCESS or ERROR. + * @param status ErrorStatus::NONE if successful. */ oneway notify(ErrorStatus status); - }; diff --git a/neuralnetworks/1.0/IPreparedModel.hal b/neuralnetworks/1.0/IPreparedModel.hal index 1b826102b3..a7c3342093 100644 --- a/neuralnetworks/1.0/IPreparedModel.hal +++ b/neuralnetworks/1.0/IPreparedModel.hal @@ -14,13 +14,33 @@ * limitations under the License. */ -/* This HAL is a work in progress */ - package android.hardware.neuralnetworks@1.0; import IEvent; +/** + * IPreparedModel describes a model that has been prepared for execution and + * is used to launch executions. + */ interface IPreparedModel { - // Multiple threads can call this execute function concurrently. + /** + * Spawns an asynchronous execution on a prepared model. + * + * Executions are asynchronous with respect to the Neuralnetworks runtime. + * To support this, IPreparedModel::execute must spawn a new task and return + * whether the task was successfully launched. The asynchronous task which + * performs the execution must call event's IEvent::notify with the status + * of the execution immediately after the execution has finished. + * + * Multiple threads can call this execute function concurrently. + * + * @param request The input and output information on which the prepared + * model is to be executed. + * prepared model. + * @param event A callback used for synchronization that must be signaled + * once the execution has finished. + * @return status ErrorStatus::NONE if the asynchronous task was + * successfully launched. + */ execute(Request request, IEvent event) generates (ErrorStatus status); }; diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index 5e3cf54b3c..39e3d345c0 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -14,63 +14,945 @@ * limitations under the License. */ -/* This HAL is a work in progress */ - package android.hardware.neuralnetworks@1.0; -// The types an operand can have. -// These values are the same as found in the NeuralNetworks.h and NeuralNetworksOEM.h files. +/** + * Operand types. + * + * The type of an operand in a model. + * + * Types prefaced with TENSOR_* must be used for tensor data (i.e., tensors + * with at least one dimension). Types not prefaced by TENSOR_* represent + * scalar values and must have no dimensions. + */ enum OperandType : int32_t { - FLOAT32 = 0, - INT32 = 1, - UINT32 = 2, - TENSOR_FLOAT32 = 3, - TENSOR_INT32 = 4, - TENSOR_QUANT8_ASYMM = 5, + /** + * The following entries are used to declare scalars. + */ + FLOAT32 = 0, + INT32 = 1, + UINT32 = 2, - OEM = 10000, - TENSOR_OEM_BYTE = 10001, + /** + * The following entries are used to declare tensors. + */ + TENSOR_FLOAT32 = 3, + TENSOR_INT32 = 4, + + /** + * A tensor of 8 bit integers that represent real numbers. + * + * Attached to this tensor are two numbers that can be used to convert the + * 8 bit integer to the real value and vice versa. These two numbers are: + * - scale: a 32 bit floating point value + * - zero_value: a 32 bit integer + * + * The formula is: + * real_value = (integer_value - zero_value) * scale. + */ + TENSOR_QUANT8_ASYMM = 5, + + /** + * The following entries are OEM specific operand types. + */ + OEM = 10000, + TENSOR_OEM_BYTE = 10001, }; -// The type of operations. Unlike the operation types found in the -// NeuralNetworks.h and NeuralNetworksOEM.h files, these specify the data type they operate on. -// This is done to simplify the work of drivers. -// TODO: Currently they are the same. Add a conversion when finalizing the model. +/** + * Operation types. + * + * The type of an operation in a model. + */ enum OperationType : int32_t { - ADD = 0, - AVERAGE_POOL_2D = 1, - CONCATENATION = 2, - CONV_2D = 3, - DEPTHWISE_CONV_2D = 4, - DEPTH_TO_SPACE = 5, - DEQUANTIZE = 6, - EMBEDDING_LOOKUP = 7, - FLOOR = 8, - FULLY_CONNECTED = 9, - HASHTABLE_LOOKUP = 10, - L2_NORMALIZATION = 11, - L2_POOL_2D = 12, - LOCAL_RESPONSE_NORMALIZATION = 13, - LOGISTIC = 14, - LSH_PROJECTION = 15, - LSTM = 16, - MAX_POOL_2D = 17, - MUL = 18, - RELU = 19, - RELU1 = 20, - RELU6 = 21, - RESHAPE = 22, - RESIZE_BILINEAR = 23, - RNN = 24, - SOFTMAX = 25, - SPACE_TO_DEPTH = 26, - SVDF = 27, - TANH = 28, + /** + * Adds two tensors, elment-wise. + * + * Takes two input tensors of identical type and compatible dimensions. The output + * is the sum of both input tensors, optionally modified by an activation function. + * + * Two dimensions are compatible when: + * 1. they are equal, or + * 2. one of them is 1 + * + * The size of the output is the maximum size along each dimension of the input operands. + * It starts with the trailing dimensions, and works its way forward. + * + * Example: + * input1.dimension = {4, 1, 2} + * input2.dimension = {5, 4, 3, 1} + * output.dimension = {5, 4, 3, 2} + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * Supported tensor rank: up to 4 + * + * Inputs: + * 0: A tensor. + * 1: A tensor of the same type, and compatible dimensions as input0. + * 2: An INT32 value, and has to be one of the {@link FusedActivationFunc} values. + * Specifies the activation to invoke on the result of each addition. + * + * Ouputs: + * 0: The sum, a tensor of the same type as input0. + */ + ADD = 0, - OEM_OPERATION = 10000, + /** + * Performs a 2-D average pooling operation. + * + * The output dimensions are functions of the filter dimensions, stride, and padding. + * + * The values in output Tensor is computed as: + * output[batch, row, col, channel] = + * sum_{i, j}(input[batch, row + i, col + j, channel]) / sum(1) + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: 4, with "NHWC" data layout. + * + * Inputs: + * 0: A 4-D tensor, of shape [batches, height, width, depth], specifying the input. + * 1: An INT32 value, specifying the padding on the left, in the ‘width’ dimension. + * 2: An INT32 value, specifying the padding on the right,in the ‘width’ dimension. + * 3: An INT32 value, specifying the padding on the top, in the ‘height’ dimension. + * 4: An INT32 value, specifying the padding on the bottom, in the ‘height’ dimension. + * 5: An INT32 value, specifying the output stride in the ‘width’ dimension. + * 6: An INT32 value, specifying the output stride in the ‘height’ dimension. + * 7: An INT32 value, specifying the filter width. + * 8: An INT32 value, specifying the filter height. + * 9: An INT32 value, and has to be one of the {@link FusedActivationFunc} values. + * Specifies the activation to invoke on the result of each addition. + * + * Ouputs: + * 0: The output 4-D tensor, of shape [batches, out_height, out_width, depth]. + */ + AVERAGE_POOL_2D = 1, + + /** + * Concatenates the input tensors along the given dimension. + * + * The input tensors must have identical type and the same dimensions except the + * dimension along the concatenation axis. + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: up to 4 + * + * Inputs: + * 0 ~ n: The list on n input tensors, of shape [D0, D1, ..., Daxis(i), ..., Dm] + * n+1: An INT32 value, specifying the concatenation axis. + * n+2: An INT32 value, and has to be one of the {@link FusedActivationFunc} values. + * Specifies the activation to invoke on the result of each addition. + * + * Ouputs: + * 0: The output, a tensor of the same type as the input tensors. + The output shape is [D0, D1, ..., sum(Daxis(i)), ..., Dm]. + */ + CONCATENATION = 2, + + /** + * Performs an 2-D convolution operation. + * + * The CONV_2D op sweeps a 2-D filter that can mix channels together over a batch of + * images, applying the filter to each window of each image of the appropriate size. + * + * The output dimensions are functions of the filter dimensions, stride, and padding. + * + * The values in output Tensor is computed as: + * output[batch, row, col, channel] = + * sum_{i, j} ( + * input[batch, row + i, col + j, k] * + * filter[channel, row + i, col + j, k] + + * bias[channel] + * ) + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: 4, with "NHWC" data layout. + * + * Inputs: + * 0: A 4-D tensor, of shape [batches, height, width, depth_in], specifying the input. + * 1: A 4-D tensor, of shape [depth_out, filter_height, filter_width, depth_in], + * specifying the filter. + * 2: A 1-D tensor, of shape [depth_out], specifying the bias. + * For input tensor of {@link OperandType::TENSOR_FLOAT32} type, the bias should + * also be of {@link OperandType::TENSOR_FLOAT32}. + * For input tensor of {@link OperandType::TENSOR_QUANT8_ASYMM} type, the bias + * should be of {@link OperandType::TENSOR_INT32}. + * 3: An INT32 value, specifying the padding on the left, in the ‘width’ dimension. + * 4: An INT32 value, specifying the padding on the right,in the ‘width’ dimension. + * 5: An INT32 value, specifying the padding on the top, in the ‘height’ dimension. + * 6: An INT32 value, specifying the padding on the bottom, in the ‘height’ dimension. + * 7: An INT32 value, specifying the output stride in the ‘width’ dimension. + * 8: An INT32 value, specifying the output stride in the ‘height’ dimension. + * 9: An INT32 value, and has to be one of the {@link FusedActivationFunc} values. + * Specifies the activation to invoke on the result of each addition. + * + * Ouputs: + * 0: The output 4-D tensor, of shape [batches, out_height, out_width, depth_out]. + */ + CONV_2D = 3, + + /** + * Performs an depthwise 2-D convolution operation. + * + * Given an input tensor of shape [batches, height, width, depth_in] and a filter + * tensor of shape [depth_out, filter_height, filter_width, depth_in] containing + * in_channels convolutional filters of depth 1, DEPTHWISE_CONV applies a different + * filter to each input channel (expanding from 1 channel to channel_multiplier channels + * for each), then concatenates the results together. + * + * The output has depth_out = depth_in * depth_multiplier channels. + * The output dimensions are functions of the filter dimensions, stride, and padding. + * + * The values in output Tensor is computed as: + * output[b, i, j, k * channel_multiplier + q] = + * sum_{di, dj} ( + * input[b, strides[1] * i + di, strides[2] * j + dj, k] * + * filter[di, dj, k, q] + * ) + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: 4, with "NHWC" data layout. + * + * Inputs: + * 0: A 4-D tensor, of shape [batches, height, width, depth_in], specifying the input. + * 1: A 4-D tensor, of shape [depth_out, filter_height, filter_width, depth_in], + * specifying the filter. + * 2: A 1-D tensor, of shape [depth_out], specifying the bias. + * For input tensor of {@link OperandType::TENSOR_FLOAT32} type, the bias should + * also be of {@link OperandType::TENSOR_FLOAT32}. + * For input tensor of {@link OperandType::TENSOR_QUANT8_ASYMM} type, the bias + * should be of {@link OperandType::TENSOR_INT32}. + * 3: An INT32 value, specifying the padding on the left, in the ‘width’ dimension. + * 4: An INT32 value, specifying the padding on the right,in the ‘width’ dimension. + * 5: An INT32 value, specifying the padding on the top, in the ‘height’ dimension. + * 6: An INT32 value, specifying the padding on the bottom, in the ‘height’ dimension. + * 7: An INT32 value, specifying the output stride in the ‘width’ dimension. + * 8: An INT32 value, specifying the output stride in the ‘height’ dimension. + * 9: An INT32 value, specifying the depthwise multiplier. + * 10: An INT32 value, and has to be one of the {@link FusedActivationFunc} values. + * Specifies the activation to invoke on the result of each addition. + * + * Ouputs: + * 0: The output 4-D tensor, of shape [batches, out_height, out_width, depth_out]. + */ + DEPTHWISE_CONV_2D = 4, + + /** + * Rearranges data from depth into blocks of spatial data. + * + * More specifically, this op outputs a copy of the input tensor where values from + * the depth dimension are moved in spatial blocks to the height and width dimensions. + * The value block_size indicates the input block size and how the data is moved. + * + * Chunks of data of size block_size * block_size from depth are rearranged into + * non-overlapping blocks of size block_size x block_size. + * + * The width of the output tensor is input_depth * block_size, whereas the height is + * input_height * block_size. + * The depth of the input tensor must be divisible by block_size * block_size + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: 4, with "NHWC" data layout. + * + * Inputs: + * 0: A 4-D tensor, of shape [batches, height, width, depth_in], specifying the input. + * 1: An INT32 value, specifying the block_size. block_size must be >=1 and + * block_size * block_size must be a divisor of the input depth. + * + * Ouputs: + * 0: The output 4-D tensor, of shape [batch, height*block_size, width*block_size, + * depth/(block_size*block_size)]. + */ + DEPTH_TO_SPACE = 5, + + /** + * Dequantizes the input tensor. + * + * The formula is: + * output = (input - zero_value) * scale. + * + * Supported tensor types: {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: up to 4 + * + * Inputs: + * 0: A tensor of type {@link OperandType::TENSOR_QUANT8_ASYMM}. + * + * Ouputs: + * 0: The output tensor of same shape as input0, but with type + {@link OperandType::TENSOR_FLOAT32}. + */ + DEQUANTIZE = 6, + + /** + * Looks up items from a given tensor. + * + * Each item in the output is a raw copy of the corresponding item in + * the input “values”. If the the given “lookup” indices are out of bounds, + * the op will fail and an error will be reported. + * + * Inputs: + * * 0: Values. An n-D tensor of any type X (where n >= 2). E.g., if n is 2, + * then the shape would be [lookup_dimension, values_dimension], where + * “lookup_dimension” corresponds to the indexing dimension in the lookup + * table, and “values_dimension” to the contents. + * * 1: Lookups. An 1-D tensor of type T, of shape [lookup_size], where + * “lookup_size” is the number of elements to look for, and each entry + * corresponds to the first dimension of the “values” tensor. + * + * Output: + * * 0: A n-D tensor of type X and the same rank and shape as the “values” + * tensor, except for the first dimension which has size “lookup_size”. + */ + EMBEDDING_LOOKUP = 7, + + /** + * Computes element-wise floor() on the input tensor. + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * Supported tensor rank: up to 4 + * + * Inputs: + * 0: A tensor. + * + * Ouputs: + * 0: The output, a tensor of the same type and dimensions as input0. + */ + FLOOR = 8, + + /** + * Denotes a fully (densely) connected layer, which connects all elements in the input + * tensor with each element in the output tensor. + * + * This layer implements the operation: + * outputs = activation(inputs * weights’ + bias) + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: up to 4. + * + * Inputs: + * 0: A tensor, specifying the input. If rank is greater than 2, then it gets flattened to + * a 2-D Tensor. The 2-D Tensor is handled as if dimensions corresponded to shape + * [batch_size, input_size], where “batch_size” corresponds to the batching dimension, + * and “input_size” is the size of the input. + * 1: A 2-D tensor, specifying the weights, of shape [num_units, input_size], where “num_units” + * corresponds to the number of output nodes. + * 2: A 1-D tensor, of shape [num_units], specifying the bias. + * For input tensor of {@link OperandType::TENSOR_FLOAT32} type, the bias should + * also be of {@link OperandType::TENSOR_FLOAT32}. + * For input tensor of {@link OperandType::TENSOR_QUANT8_ASYMM} type, the bias + * should be of {@link OperandType::TENSOR_INT32}. + * 3: An INT32 value, and has to be one of the {@link FusedActivationFunc} values. + * Specifies the activation to invoke on the result of each addition. + * + * Ouputs: + * 0: The output tensor, of shape [batch_size, num_units]. + */ + FULLY_CONNECTED = 9, + + /** + * Looks up values of a hash table with given keys. + * + * Inputs: + * * 0: Lookups. A 1-D int32 tensor with shape [ k ]. + * * 1: Keys. A 1-D int32 tensor with shape [ n ], *MUST* be sorted in + * ascending order. + * * 2: Values. A tensor with shape [ n … ]. + * + * Outputs: + * * 0: Output. A tensor with shape [ k …]. + * * 1: Hits. A uint8 tensor with shape [ k ] indicates whether the lookup + * hits or not. + */ + HASHTABLE_LOOKUP = 10, + + /** + * Applies L2 normalization along a the depth dimension. + * + * The values in output Tensor is computed as: + * output[batch, row, col, channel] = + * input[batch, row, col, channel] / + * sqrt(sum_{c} pow(input[batch, row, col, c], 2)) + * + * For x with more dimensions, independently normalizes each 1-D slice along dimension dim. + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * Supported tensor rank: 4, with "NHWC" data layout. + * + * Inputs: + * 0: A 4-D tensor, of shape [batches, height, width, depth], specifying the input. + * + * Ouputs: + * 0: The output 4-D tensor, of shape [batches, out_height, out_width, depth]. + */ + L2_NORMALIZATION = 11, + + /** + * Performs an 2-D L2 pooling operation. + * + * The output dimensions are functions of the filter dimensions, stride, and padding. + * + * The values in output Tensor is computed as: + * output[batch, row, col, channel] = + * sqrt(sum_{i, j} pow(input[batch, row + i, col + j, channel], 2) / sum(1)) + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * Supported tensor rank: 4, with "NHWC" data layout. + * + * Inputs: + * 0: A 4-D tensor, of shape [batches, height, width, depth], specifying the input. + * 1: An INT32 value, specifying the padding on the left, in the ‘width’ dimension. + * 2: An INT32 value, specifying the padding on the right,in the ‘width’ dimension. + * 3: An INT32 value, specifying the padding on the top, in the ‘height’ dimension. + * 4: An INT32 value, specifying the padding on the bottom, in the ‘height’ dimension. + * 5: An INT32 value, specifying the output stride in the ‘width’ dimension. + * 6: An INT32 value, specifying the output stride in the ‘height’ dimension. + * 7: An INT32 value, specifying the filter width. + * 8: An INT32 value, specifying the filter height. + * 9: An INT32 value, and has to be one of the {@link FusedActivationFunc} values. + * Specifies the activation to invoke on the result of each addition. + * + * Ouputs: + * 0: The output 4-D tensor, of shape [batches, out_height, out_width, depth]. + */ + L2_POOL_2D = 12, + + /** + * Applies Local Response Normalization along the depth dimension. + * + * The 4-D input tensor is treated as a 3-D array of 1-D vectors (along the last + * dimension), and each vector is normalized independently. Within a given vector, + * each component is divided by the weighted, squared sum of inputs within depth_radius. + * + * In details: + * sqr_sum[a, b, c, d] = + * sum(pow(input[a, b, c, d - depth_radius : d + depth_radius + 1], 2) + * output = input / pow((bias + alpha * sqr_sum), beta) + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * Supported tensor rank: 4, with "NHWC" data layout. + * + * Inputs: + * 0: A 4-D tensor, of shape [batches, height, width, depth], specifying the input. + * 1: An INT32 value, specifying the radius of the normalization window. + * 2: A FLOAT32 value, specifying the bias, must not be zero. + * 3: A FLOAT32 value, specifying the scale factor, alpha. + * 4: A FLOAT32 value, specifying the exponent, beta. + * + * Ouputs: + * 0: The output tensor of same shape as input0. + */ + LOCAL_RESPONSE_NORMALIZATION = 13, + + /** + * Computes sigmoid activation on the input tensor element-wise. + * + * In details: + * output = 1 / (1 + exp(-input)) + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: up to 4. + * + * Inputs: + * 0: A tensor, specifying the input. + * + * Ouputs: + * 0: The output tensor of same shape as input0. + */ + LOGISTIC = 14, + + /** + * Projects an input to a bit vector via locality senstive hashing. + * + * Inputs: + * * 0: Hash functions. Dim.size == 2, DataType: Float. + * Tensor[0].Dim[0]: Number of hash functions. + * Tensor[0].Dim[1]: Number of seeds per hash functions. + * Tensor[0].Dim[1] <= 32 in sparse case. + * + * * 1: Input. Dim.size >= 1, no restriction on DataType. + * * 2: Weight. Optional. Dim.size == 1, DataType: Float. + * If not set, each input element is considered to have the same weight of + * 1.0. + * Tensor[1].Dim[0] == Tensor[2].Dim[0] + * * 3: Type: + * Sparse: Value LSHProjectionType_SPARSE(=1). + * Computed bit vector is considered to be sparse. + * Each output element is an int32 made up of multiple bits computed from + * hash functions. + * + * Dense: Value LSHProjectionType_DENSE(=2). + * Computed bit vector is considered to be dense. Each output element + * represents a bit and can take the value of either 0 or 1. + * + * Outputs: + * * 0: If the projection type is sparse: + * Output.Dim == { Tensor[0].Dim[0] } + * A tensor of int32 that represents hash signatures. + * If the projection type is Dense: + * Output.Dim == { Tensor[0].Dim[0] * Tensor[0].Dim[1] } + * A flattened tensor that represents projected bit vectors. + */ + LSH_PROJECTION = 15, + + /** + * Long short-term memory unit (LSTM) recurrent network layer. + * + * The default non-peephole implementation is based on: + * http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf + * S. Hochreiter and J. Schmidhuber. "Long Short-Term Memory". Neural + * Computation, 9(8):1735-1780, 1997. + * + * The peephole implementation is based on: + * https://research.google.com/pubs/archive/43905.pdf + * Hasim Sak, Andrew Senior, and Francoise Beaufays. "Long short-term memory + * recurrent neural network architectures for large scale acoustic modeling." + * INTERSPEECH, 2014. + * + * The coupling of input and forget gate (CIFG) is based on: + * http://arxiv.org/pdf/1503.04069.pdf + * Greff et al. "LSTM: A Search Space Odyssey" + * + * The class has the following independently optional inputs: + * * If input gate (if CIFG): “input_to_forget_weights”, + * “recurrent_to_input_weights”, “cell_to_input_weights”, “input_gate_bias”. + * * If no peephole connections: “cell_to_input_weights”, + * “cell_to_forget_weights”, “cell_to_output_weights”. + * * If no projection layer: “projection_weights” and “projection_bias”. + * * If no projection bias: “projection_bias”. + * + * Supported tensor types: + * * {@link OperandType::TENSOR_FLOAT32} + * + * Inputs: + * * 0: Input. + * A 2-D tensor of type T, of shape [batch_size, input_size], where + * “batch_size” corresponds to the batching dimension, and “input_size” + * is the size of the input. + * * 1: input_to_input_weights. + * A 2-D tensor of type T, of shape [num_units, input_size], where + * “num_units” corresponds to the number of cell units. + * * 2: input_to_forget_weights. + * A 2-D tensor of type T, of shape [num_units, input_size]. + * * 3: input_to_cell_weights. + * A 2-D tensor of type T, of shape [num_units, input_size]. + * * 4: input_to_output_weights. + * A 2-D tensor of type T, of shape [num_units, input_size]. + * * 5: recurrent_to_input_weights. + * A 2-D tensor of type T, of shape [num_units, output_size], where + * “output_size” corresponds to either the number of cell units (i.e., + * “num_units”), or the second dimension of the “projection_weights”, if + * defined. + * * 6: recurrent_to_forget_weights. + * A 2-D tensor of type T, of shape [num_units, output_size]. + * * 7: recurrent_to_cell_weights. + * A 2-D tensor of type T, of shape [num_units, output_size]. + * * 8: recurrent_to_output_weights. + * A 2-D tensor of type T, of shape [num_units, output_size]. + * * 9: cell_to_input_weights. + * A 1-D tensor of type T, of shape [num_units]. + * * 10:cell_to_forget_weights. + * A 1-D tensor of type T, of shape [num_units]. + * * 11:cell_to_output_weights. + * A 1-D tensor of type T, of shape [num_units]. + * * 12:input_gate_bias. + * A 1-D tensor of type T, of shape [num_units]. + * * 13:forget_gate_bias. + * A 1-D tensor of type T, of shape [num_units]. + * * 14:cell_bias. + * A 1-D tensor of type T, of shape [num_units]. + * * 15:output_gate_bias. + * A 1-D tensor of type T, of shape [num_units]. + * * 16:projection_weights. + * A 2-D tensor of type T, of shape [output_size, num_units]. + * * 17:projection_bias. + * A 1-D tensor of type T, of shape [output_size]. + * + * Parameters: + * * 18:fused_activation_function. + * An (optional) ActivationFunctionType indicating the activation + * function. + * If “NONE” is specified then it results in a linear activation. + * * 19:cell_clip. + * A clipping threshold for the cell state, such that values are bound + * within [-cell_clip, cell_clip]. If set to 0.0 then clipping is + * disabled. + * * 20:proj_clip. + * A clipping threshold for the output from the projection layer, such + * that values are bound within [-proj_clip, proj_clip]. If set to 0.0 + * then clipping is disabled. + * + * Outputs: + * * 0: scratch_buffer. + * A 3-D tensor of type T, of shape [batch_size, num_cell, 4]. + * * 1: output_state. + * A 2-D tensor of type T, of shape [batch_size, output_size]. + * * 2: cell_state. + * A 2-D tensor of type T, of shape [batch_size, num_units]. + * * 3: output. + * A 2-D tensor of type T, of shape [batch_size, output_size]. This is + * effectively the same as the current “output_state” value. + */ + LSTM = 16, + + /** + * Performs an 2-D max pooling operation. + * + * The output dimensions are functions of the filter dimensions, stride, and padding. + * + * The values in output Tensor is computed as: + * output[batch, row, col, channel] = + * max_{i, j} (input[batch, row + i, col + j, channel]) + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: 4, with "NHWC" data layout. + * + * Inputs: + * 0: A 4-D tensor, of shape [batches, height, width, depth], specifying the input. + * 1: An INT32 value, specifying the padding on the left, in the ‘width’ dimension. + * 2: An INT32 value, specifying the padding on the right,in the ‘width’ dimension. + * 3: An INT32 value, specifying the padding on the top, in the ‘height’ dimension. + * 4: An INT32 value, specifying the padding on the bottom, in the ‘height’ dimension. + * 5: An INT32 value, specifying the output stride in the ‘width’ dimension. + * 6: An INT32 value, specifying the output stride in the ‘height’ dimension. + * 7: An INT32 value, specifying the filter width. + * 8: An INT32 value, specifying the filter height. + * 9: An INT32 value, and has to be one of the {@link FusedActivationFunc} values. + * Specifies the activation to invoke on the result of each addition. + * + * Ouputs: + * 0: The output 4-D tensor, of shape [batches, out_height, out_width, depth]. + */ + MAX_POOL_2D = 17, + + /** + * Multiplies two tensors, elment-wise. + * + * Takes two input tensors of identical type and compatible dimensions. The output + * is the product of both input tensors, optionally modified by an activation function. + * + * Two dimensions are compatible when: + * 1. they are equal, or + * 2. one of them is 1 + * + * The size of the resulting output is the maximum size along each dimension of the + * input operands. It starts with the trailing dimensions, and works its way forward. + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * Supported tensor rank: up to 4 + * + * Inputs: + * 0: A tensor. + * 1: A tensor of the same type, and compatible dimensions as input0. + * 2: An INT32 value, and has to be one of the {@link FusedActivationFunc} values. + * Specifies the activation to invoke on the result of each addition. + * + * Ouputs: + * 0: The product, a tensor of the same type as input0. + */ + MUL = 18, + + /** + * Computes rectified linear activation on the input tensor element-wise. + * + * In details: + * output = max(0, input) + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: up to 4. + * + * Inputs: + * 0: A tensor, specifying the input. + * + * Ouputs: + * 0: The output tensor of same shape as input0. + */ + RELU = 19, + + /** + * Computes rectified linear 1 activation on the input tensor element-wise. + * + * In details: + * output = min(1.f, max(-1.f, input)) + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: up to 4. + * + * Inputs: + * 0: A tensor, specifying the input. + * + * Ouputs: + * 0: The output tensor of same shape as input0. + */ + RELU1 = 20, + + /** + * Computes rectified linear 6 activation on the input tensor element-wise. + * + * In details: + * output = min(6, max(0, input)) + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: up to 4. + * + * Inputs: + * 0: A tensor, specifying the input. + * + * Ouputs: + * 0: The output tensor of same shape as input0. + */ + RELU6 = 21, + + /** + * Reshapes a tensor. + * + * Given tensor, this operation returns a tensor that has the same values as tensor, + * but with a newly specified shape. + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: up to 4. + * + * Inputs: + * 0: A tensor, specifying the tensor to be reshaped. + * 1: A 1-D tensor of type {@link OperandType::TENSOR_INT32}, defining the shape + * of the output tensor. The number of elements implied by shape must be the same + * as the number of elements in the input tensor. + * + * Ouputs: + * 0: The output tensor, of shape specified by the input shape. + */ + RESHAPE = 22, + + /** + * Resizes images to given size using the bilinear interpretation. + * + * Resized images will be distorted if their original aspect ratio is not the same as input. + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * Supported tensor rank: 4, with "NHWC" data layout. + * + * Inputs: + * 0: A 4-D tensor, of shape [batches, height, width, depth], specifying the input. + * 1: An INT32 value, specifying the output width of the output tensor. + * 2: An INT32 value, specifying the output height of the output tensor. + * + * Ouputs: + * 0: The output 4-D tensor, of shape [batches, new_height, new_width, depth]. + */ + RESIZE_BILINEAR = 23, + + /** + * A basic recurrent neural network layer. + * + * This layer implements the operation: + * outputs = state = activation(inputs * input_weights + state * recurrent_weights + bias) + * + * Where: + * * “input_weights” is a weight matrix that multiplies the inputs; + * * “recurrent_weights” is a weight matrix that multiplies the current + * “state” which itself is the output from the previous time step + * computation; + * * “bias” is a bias vector (added to each output vector in the batch); + * * “activation” is the function passed as the “fused_activation_function” + * argument (if not “NONE”). + * + * Supported tensor types: + * * {@link OperandType::TENSOR_FLOAT32} + * + * Inputs: + * * 0: input. + * A 2-D tensor of type T, of shape [batch_size, input_size], where + * “batch_size” corresponds to the batching dimension, and “input_size” is + * the size of the input. + * * 1: weights. + * A 2-D tensor of type T, of shape [num_units, input_size], where + * “num_units” corresponds to the number of units. + * * 2: recurrent_weights. + * A 2-D tensor of type T, of shape [num_units, num_units], with columns + * corresponding to the weights from each unit. + * * 3: bias. + * A 1-D tensor of type T, of shape [num_units]. + * + * For FLOAT32 input tensor, bias must also be FLOAT32. + * For UINT8 input tensor, bias must be INT32. + * + * Parameters + * * 4: fused_activation_function. + * An (optional) ActivationFunctionType indicating the activation + * function. If “NONE” is specified then it results in a linear + * activation. + * + * * 5: Hidden state. + * A 2-D tensor of type T, of shape [batch_size, num_units]. + * + * Outputs: + * * 0: output. + * A 2-D tensor of type T, of shape [batch_size, num_units]. This is + * effectively the same as the current state value. + */ + RNN = 24, + + /** + * Computes the softmax activation on the input tensor element-wise, per batch, by + * normalizing the input vector so the maximum coefficient is zero. + * + * In details: + * output[batch, i] = + * exp((input[batch, i] - max(input[batch, :])) * beta) / + * sum_{k}{exp((input[batch, k] - max(input[batch, :])) * beta)} + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: 2 or 4. + * + * Inputs: + * 0: A 2-D or 4-D tensor, specifying the tensor to be reshaped. + * 1: A FLOAT32 value, specifying the scaling factor for the exponent, beta. + * + * Ouputs: + * 0: The output tensor of same shape as input0. + */ + SOFTMAX = 25, + + /** + * Rearranges blocks of spatial data, into depth. + * + * More specifically, this op outputs a copy of the input tensor where values from + * the height and width dimensions are moved to the depth dimension. + * The value block_size indicates the input block size and how the data is moved. + * + * Chunks of data of size block_size * block_size from depth are rearranged into + * non-overlapping blocks of size block_size x block_size. + * + * The depth of the output tensor is input_depth * block_size * block_size. + * The input tensor's height and width must be divisible by block_size. + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * {@link OperandType::TENSOR_QUANT8_ASYMM} + * Supported tensor rank: 4, with "NHWC" data layout. + * + * Inputs: + * 0: A 4-D tensor, of shape [batches, height, width, depth_in], specifying the input. + * 1: An INT32 value, specifying the block_size. block_size must be >=1 and + * block_size must be a divisor of both the input height and width. + * + * Ouputs: + * 0: The output 4-D tensor, of shape [batch, height/block_size, width/block_size, + * depth*block_size*block_size]. + */ + SPACE_TO_DEPTH = 26, + + /** + * SVDF op is a kind of stateful layer derived from the notion that a + * densely connected layer that's processing a sequence of input frames can + * be approximated by using a singular value decomposition of each of its + * nodes. The implementation is based on: + * + * https://research.google.com/pubs/archive/43813.pdf + * + * P. Nakkiran, R. Alvarez, R. Prabhavalkar, C. Parada. + * “Compressing Deep Neural Networks using a Rank-Constrained Topology”. + * INTERSPEECH, 2015. + * + * It processes the incoming input using a 2-stage filtering mechanism: + * * stage 1 performs filtering on the "features" dimension, whose outputs get + * pushed into a memory of fixed-size memory_size. + * * stage 2 performs filtering on the "time" dimension of the memory_size + * memoized outputs of stage 1. + * + * Specifically, for rank 1, this layer implements the operation: + * + * memory = push(conv1d(inputs, weights_feature, feature_dim, "VALID")); + * outputs = activation(memory * weights_time + bias); + * + * Where: + * * “weights_feature” is a weights matrix that processes the inputs (by + * convolving the input with every “feature filter”), and whose outputs get + * pushed, stacked in order, into the fixed-size “memory” (the oldest entry + * gets dropped); + * * “weights_time” is a weights matrix that processes the “memory” (by a + * batched matrix multiplication on the num_units); + * * “bias” is an optional bias vector (added to each output vector in the + * batch); and + * * “activation” is the function passed as the “fused_activation_function” + * argument (if not “NONE”). + * + * Each rank adds a dimension to the weights matrices by means of stacking + * the filters. + * + * Supported tensor types: + * * {@link OperandType::TENSOR_FLOAT32} + * + * Inputs: + * * 0: input. + * A 2-D tensor of type T, of shape [batch_size, input_size], where + * “batch_size” corresponds to the batching dimension, and “input_size” is + * the size of the input. + * * 1: weights_feature. + * A 2-D tensor of type T, of shape [num_units, input_size], where + * “num_units” corresponds to the number of units. + * * 2: weights_time. + * A 2-D tensor of type T, of shape [num_units, memory_size], where + * “memory_size” corresponds to the fixed-size of the memory. + * * 3: bias. + * A optional 1-D tensor of type T, of shape [num_units]. + * + * For FLOAT32 input tensor, bias must also be FLOAT32. + * For UINT8 input tensor, bias must be INT32. + * + * Parameters: + * * 4: rank. + * The rank of the SVD approximation. + * * 5: fused_activation_function. + * An (optional) ActivationFunctionType indicating the activation function. + * If “NONE” is specified then it results in a linear activation. + * + * Outputs: + * * 0: state. + * A 2-D tensor of type T, of shape [batch_size, (memory_size - 1) * num_units * rank]. + * * 1: output. + * A 2-D tensor of type T, of shape [batch_size, num_units]. + */ + SVDF = 27, + + /** + * Computes hyperbolic tangent of input tensor element-wise. + * + * In details: + * output = tanh(input) + * + * Supported tensor types: {@link OperandType::TENSOR_FLOAT32} + * Supported tensor rank: up to 4. + * + * Inputs: + * 0: A tensor, specifying the input. + * + * Ouputs: + * 0: The output tensor of same shape as input0. + */ + TANH = 28, + + /** + * OEM specific operation. + * + * This operation is OEM specific. It should only be used for OEM applications. + */ + OEM_OPERATION = 10000, }; -// Fused activation functions +/** + * Fused activation function types. + */ enum FusedActivationFunc : int32_t { NONE = 0, RELU = 1, @@ -78,130 +960,309 @@ enum FusedActivationFunc : int32_t { RELU6 = 3, }; -// How an operand is used. +/** + * How an operand is used. + */ enum OperandLifeTime : int32_t { - // The operand is internal to the model. It's created by an operation - // and consumed by other operations. + /** + * The operand is internal to the model. It's created by an operation + * and consumed by other operations. + */ TEMPORARY_VARIABLE, - // The operand is an input of the model. An operand can't be both - // input and output of a model. + + /** + * The operand is an input of the model. An operand can't be both + * input and output of a model. + */ MODEL_INPUT, - // The operand is an output of the model. + + /** + * The operand is an output of the model. + */ MODEL_OUTPUT, - // The operand is a constant found in Model.operandValues. + + /** + * The operand is a constant found in Model.operandValues. + */ CONSTANT_COPY, - // The operand is a constant that was specified via a Memory object. - CONSTANT_REFERENCE + + /** + * The operand is a constant that was specified via a Memory object. + */ + CONSTANT_REFERENCE, }; -// Status of a device. +/** + * Status of a device. + */ enum DeviceStatus : int32_t { AVAILABLE, BUSY, OFFLINE, - UNKNOWN // Do we need this? -}; - -// For the reference workload -// Used by a driver to report its performance characteristics. -// TODO revisit the data types and scales. -struct PerformanceInfo { - float execTime; // in nanoseconds - float powerUsage; // in picoJoules + UNKNOWN, }; +/** + * A typed operation. + */ struct OperationTuple { - // The type of operation. + /** + * The type of operation. + */ OperationType operationType; - // The input data type of operation. + + /** + * The input data type of operation. + */ OperandType operandType; }; -// The capabilities of a driver. +/** + * Performance information for the reference workload. + * + * Used by a driver to report its performance characteristics. + */ +struct PerformanceInfo { + /** + * Execution time in nanoseconds. + */ + float execTime; + + /** + * Power usage in picoJoules. + */ + float powerUsage; +}; + +/** + * The capabilities of a driver. + */ struct Capabilities { + /** + * A collection of typed operations supported by the driver. + */ vec supportedOperationTuples; + + /** + * Indicates whether a driver caches its prepared model for reuse the next + * time the application begins. This is useful because the model may have + * been prepared in a previous run. + * + * True if caching is supported, false otherwise. + */ bool cachesCompilation; - // TODO revisit the data types and scales. + + /** + * Driver performance when operating on float32 data. + */ PerformanceInfo float32Performance; + + /** + * Driver performance when operating on asymmetric 8-bit quantized data. + */ PerformanceInfo quantized8Performance; }; -// Describes the location of a data object. +/** + * Describes the location of a data object. + */ struct DataLocation { - // The index of the memory pool where this location is found. - // Two special values can also be used. See the LOCATION_* constants above. + /** + * The index of the memory pool where this location is found. + */ uint32_t poolIndex; - // Offset in bytes from the start of the pool. + + /** + * Offset in bytes from the start of the pool. + */ uint32_t offset; - // The length of the data, in bytes. + + /** + * The length of the data in bytes. + */ uint32_t length; }; +/** + * Describes one operand of the model's graph. + */ struct Operand { + /** + * Data type of the operand. + */ OperandType type; + + /** + * Dimensions of the operand. + */ vec dimensions; - // The number of operations that uses this operand as input. - // TODO It would be nice to track the actual consumers, e.g. vec consumers; + /** + * The number of operations that use this operand as input. + */ uint32_t numberOfConsumers; + /** + * Quantized scale of the operand. + * + * Only applicable if the operand is of type TENSOR_QUANT8_ASYMM. + */ float scale; + + /** + * Quantized zero-point offset of the operand. + * + * Only applicable if the operand is of type TENSOR_QUANT8_ASYMM. + */ int32_t zeroPoint; - // How the operand is used. + /** + * How the operand is used. + */ OperandLifeTime lifetime; - // Where to find the data for this operand. - // If the lifetime is TEMPORARY_VARIABLE, MODEL_INPUT, or MODEL_OUTPUT: - // - All the fields will be 0. - // If the lifetime is CONSTANT_COPY: - // - location.poolIndex is 0. - // - location.offset is the offset in bytes into Model.operandValues. - // - location.length is set. - // If the lifetime is CONSTANT_REFERENCE: - // - location.poolIndex is set. - // - location.offset is the offset in bytes into the specified pool. - // - location.length is set. + /** + * Where to find the data for this operand. + * If the lifetime is TEMPORARY_VARIABLE, MODEL_INPUT, or MODEL_OUTPUT: + * - All the fields will be 0. + * If the lifetime is CONSTANT_COPY: + * - location.poolIndex is 0. + * - location.offset is the offset in bytes into Model.operandValues. + * - location.length is set. + * If the lifetime is CONSTANT_REFERENCE: + * - location.poolIndex is set. + * - location.offset is the offset in bytes into the specified pool. + * - location.length is set. + */ DataLocation location; }; -// Describes one operation of the graph. +/** + * Describes one operation of the model's graph. + */ struct Operation { - // The tuple describing the operation type and input type. + /** + * The tuple describing the operation type and input type. + */ OperationTuple opTuple; - // Describes the table that contains the indexes of the inputs of the - // operation. The offset is the index in the operandIndexes table. + + /** + * Describes the table that contains the indexes of the inputs of the + * operation. The offset is the index in the operandIndexes table. + */ vec inputs; - // Describes the table that contains the indexes of the outputs of the - // operation. The offset is the index in the operandIndexes table. + + /** + * Describes the table that contains the indexes of the outputs of the + * operation. The offset is the index in the operandIndexes table. + */ vec outputs; }; +/** + * A Neural Network Model. + * + * This includes not only the execution graph, but also constant data such as + * weights or scalars added at construction time. The only information that + * might not be known is the shape of the input tensors. + */ struct Model { + /** + * All operands included in the model. + */ vec operands; + + /** + * All operations included in the model. + * + * The operations are sorted into execution order. + */ vec operations; + + /** + * Input indexes of the model. + * + * Each value corresponds to the index of the operand in "operands". + */ vec inputIndexes; + + /** + * Output indexes of the model. + * + * Each value corresponds to the index of the operand in "operands". + */ vec outputIndexes; + + /** + * A byte buffer containing operand data that were copied into the model. + */ vec operandValues; + + /** + * A collection of shared memory pools containing operand data that were + * registered by the model. + */ vec pools; }; +/** + * Metadata information specifying the location of the input or output data and + * any updates to the input or output operand. + */ struct RequestArgument { - // The location within one of the memory pools + /** + * The location within one of the memory pools passed in the Request. + */ DataLocation location; - // If dimensions.size() > 0, dimension information was provided along with the - // argument. This can be the case for models that accept inputs of varying size. - // This can't change the rank, just the value of the dimensions that were - // unspecified in the model. + + /** + * Updated dimension information. + * + * If dimensions.size() > 0, dimension information was provided along with the + * argument. This can be the case for models that accept inputs of varying size. + * This can't change the rank, just the value of the dimensions that were + * unspecified in the model. + */ vec dimensions; }; +/** + * Inputs to be sent to and outputs to be retrieved from a prepared model. + * + * A Request serves two primary tasks: + * 1) Provides the input and output data to be used when executing the model. + * 2) Specifies any updates to the input operand metadata that were left + * unspecified at model preparation time. + */ struct Request { + /** + * Input data and information to be used in the execution of a prepared + * model. + * + * The index of the input corresponds to the index in Model.inputIndexes. + * E.g., input[i] corresponds to Model.inputIndexes[i]. + */ vec inputs; + + /** + * Output data and information to be used in the execution of a prepared + * model. + * + * The index of the output corresponds to the index in Model.outputIndexes. + * E.g., output[i] corresponds to Model.outputIndexes[i]. + */ vec outputs; + + /** + * A collection of shared memory pools containing operand data for both the + * inputs and the outputs to a model. + */ vec pools; }; +/** + * Return status of a function. + */ enum ErrorStatus : int32_t { NONE, DEVICE_UNAVAILABLE, From 7d765bdd0f747a9897310040f81f670f6ef3e3f3 Mon Sep 17 00:00:00 2001 From: "I-Jui (Ray) Sung" Date: Wed, 13 Sep 2017 18:47:12 -0700 Subject: [PATCH 216/265] Support ignored output in test harness Filtered out outputs that are not needed for correctness verification during result validation. Bug: 63905942 Test: VtsHalNeuralnetworksV1_0TargetTest on Angler Change-Id: Ic967a821c2a60194c9d9f386601a865f5c409a4f --- .../vts/functional/GeneratedTestHarness.cpp | 22 ++++++++++++++----- .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 2 +- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp index 9c85c8c2cc..db90ac2267 100644 --- a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp @@ -33,6 +33,7 @@ hidl_memory allocateSharedMemory(int64_t size, const std::string& type = "ashmem namespace generated_tests { using ::android::hardware::neuralnetworks::V1_0::implementation::Event; +using ::generated_tests::filter; using ::generated_tests::for_all; using ::generated_tests::for_each; using ::generated_tests::resize_accordingly; @@ -44,6 +45,7 @@ using ::generated_tests::Quant8Operands; // Top level driver for models and examples generated by test_generator.py // Test driver for those generated from ml/nn/runtime/test/spec void Execute(const sp& device, std::function create_model, + std::function is_ignored, const std::vector& examples) { Model model = create_model(); sp preparedModel; @@ -166,18 +168,28 @@ void Execute(const sp& device, std::function create_model, COPY_BACK(uint8_t); #undef COPY_BACK outputMemory->commit(); + // Filter out don't cares + MixedTyped filtered_golden; + MixedTyped filtered_test; + filter(golden, &filtered_golden, is_ignored); + filter(test, &filtered_test, is_ignored); + filter(golden, &filtered_golden, is_ignored); + filter(test, &filtered_test, is_ignored); + filter(golden, &filtered_golden, is_ignored); + filter(test, &filtered_test, is_ignored); + // We want "close-enough" results for float - for_each(golden, [&test](int index, auto& golden_float) { - auto& test_float_operands = std::get(test); + for_each(filtered_golden, [&filtered_test](int index, auto& golden_float) { + auto& test_float_operands = std::get(filtered_test); auto& test_float = test_float_operands[index]; for (unsigned int i = 0; i < golden_float.size(); i++) { SCOPED_TRACE(i); EXPECT_NEAR(golden_float[i], test_float[i], 1.e-5); } }); - - EXPECT_EQ(std::get(golden), std::get(test)); - EXPECT_EQ(std::get(golden), std::get(test)); + EXPECT_EQ(std::get(filtered_golden), std::get(filtered_test)); + EXPECT_EQ(std::get(filtered_golden), + std::get(filtered_test)); } } diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp index 0302717767..453e3e57bb 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -34,7 +34,7 @@ namespace functional { using ::android::hardware::neuralnetworks::V1_0::implementation::Event; using ::generated_tests::MixedTypedExampleType; namespace generated_tests { -extern void Execute(const sp&, std::function, +extern void Execute(const sp&, std::function, std::function, const std::vector&); } From ff7dcd7e4d50ce99f57bd0cee90aded7036c5388 Mon Sep 17 00:00:00 2001 From: Kevin Rocard Date: Wed, 13 Sep 2017 18:11:14 -0700 Subject: [PATCH 217/265] Audio VTS: do not test duplicate policy configuration file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch only modifies the VTS tests. O generic policy configuration fallback is incorrect (see I2a39606cd820b5cd27a640248bf692204ec2cd71 for the fix). Nevertheless, has no impact on products because this fallback is only used in aosp builds and GSI. Unfortunatly, this break the VTS test when run agains GSI. Because it is too late to change GSI for Oc and DR, relax the test to support current O GSI. For P, ihis patch will not be part of VTS and the fallback config will be fixed. Bug: 65535343 Merged-In: I2a39606cd820b5cd27a640248bf692204ec2cd71 Test: Following script: setup() { BUILD_ID=$1 TARGET_PRODUCT=$2 TARGET_BUILD_TYPE=${3:-userdebug} TARGET_ARCH=${4:-arm64} set +x echo "The following three variables can be overridden" \ "by setting the corresponding environment variable" set -x TEST_SUITES_TARGET=${VTS_TEST_SUITES_TARGET:-test_suites_${TARGET_ARCH}} BASE_TARGET=${VTS_BASE_TARGET:-${TARGET_PRODUCT}-${TARGET_BUILD_TYPE}} AOSP_TARGET=${VTS_AOSP_TARGET:-aosp_${TARGET_ARCH}_ab-${TARGET_BUILD_TYPE}} set +x download() { local target=$1 local file=$2 test -f $file || /google/data/ro/projects/android/fetch_artifact --bid $BUILD_ID --target $target $file || { local r=$?; rm $file; return $r; } } echo "Downloading" download $TEST_SUITES_TARGET 'android-vts.zip' download $BASE_TARGET "${TARGET_PRODUCT}-img-${BUILD_ID}.zip" download $AOSP_TARGET "aosp_${TARGET_ARCH}_ab-img-${BUILD_ID}.zip" echo "Unzipping" rm -r system.img android-vts unzip aosp_${TARGET_ARCH}_ab-img-$BUILD_ID.zip system.img unzip android-vts.zip echo "Building vbmeta without verity" avbtool make_vbmeta_image --flag 2 --output vbmeta.img set -x adb reboot bootloader fastboot update ${TARGET_PRODUCT}-img-$BUILD_ID.zip --skip-reboot fastboot flash vbmeta vbmeta.img || echo "Warning: Device does not support vbmeta" fastboot erase system fastboot flash system system.img fastboot erase metadata fastboot -w fastboot reboot echo "Board setup" echo "You may now start vts-tradefed with:" echo '$ ANDROID_BUILD_TOP= PATH="$PWD:$PATH" vts-tradefed' } VTS_TEST_SUITES_TARGET=test_suites_arm64_fastbuild3d_linux setup 4327646 sailfish vts-tradefed run commandAndExit vts --skip-all-system-status-check --primary-abi-only --skip-preconditions --module VtsHalAudioV2_0Target -t CheckConfig.audioPolicyConfigurationValidation Change-Id: Ibe1feed41325a3e4fb25e959bd254156348aa584 Signed-off-by: Kevin Rocard --- audio/2.0/vts/functional/ValidateAudioConfiguration.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/audio/2.0/vts/functional/ValidateAudioConfiguration.cpp b/audio/2.0/vts/functional/ValidateAudioConfiguration.cpp index ee490239bf..ec3259a1e3 100644 --- a/audio/2.0/vts/functional/ValidateAudioConfiguration.cpp +++ b/audio/2.0/vts/functional/ValidateAudioConfiguration.cpp @@ -28,6 +28,7 @@ TEST(CheckConfig, audioPolicyConfigurationValidation) { const auto configPath = folder + '/' + configName; if (access(configPath.c_str(), R_OK) == 0) { ASSERT_VALID_XML(configPath.c_str(), configSchemaPath); + return; // The framework does not read past the first config file found } } } From 3d720e671a0691a364bffd25fd2b348ba6d34c3d Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Wed, 13 Sep 2017 00:53:29 +0000 Subject: [PATCH 218/265] Revert "HAL interface libs for testing are now built as test lib" This reverts commit 9a4b17e3e1ecb0dc0cd515d7445b7f200fc4b11b. Reason of revert: this breaks hidl_test / lshal_test Bug: 65603915 Change-Id: I73427657615ab9c7e3c0c7d336f03510d9a53fe6 --- tests/bar/1.0/.hidl_for_test | 0 tests/bar/1.0/Android.bp | 2 +- tests/baz/1.0/.hidl_for_test | 0 tests/baz/1.0/Android.bp | 2 +- tests/expression/1.0/.hidl_for_test | 0 tests/expression/1.0/Android.bp | 2 +- tests/extension/light/2.0/.hidl_for_test | 0 tests/extension/light/2.0/Android.bp | 2 +- tests/foo/1.0/.hidl_for_test | 0 tests/foo/1.0/Android.bp | 2 +- tests/hash/1.0/.hidl_for_test | 0 tests/hash/1.0/Android.bp | 2 +- tests/inheritance/1.0/.hidl_for_test | 0 tests/inheritance/1.0/Android.bp | 2 +- tests/libhwbinder/1.0/.hidl_for_test | 0 tests/libhwbinder/1.0/Android.bp | 2 +- tests/libhwbinder/aidl/.hidl_for_test | 0 tests/memory/1.0/.hidl_for_test | 0 tests/memory/1.0/Android.bp | 2 +- tests/msgq/1.0/.hidl_for_test | 0 tests/msgq/1.0/Android.bp | 2 +- tests/multithread/1.0/.hidl_for_test | 0 tests/multithread/1.0/Android.bp | 2 +- tests/pointer/1.0/.hidl_for_test | 0 tests/pointer/1.0/Android.bp | 2 +- 25 files changed, 12 insertions(+), 12 deletions(-) delete mode 100644 tests/bar/1.0/.hidl_for_test delete mode 100644 tests/baz/1.0/.hidl_for_test delete mode 100644 tests/expression/1.0/.hidl_for_test delete mode 100644 tests/extension/light/2.0/.hidl_for_test delete mode 100644 tests/foo/1.0/.hidl_for_test delete mode 100644 tests/hash/1.0/.hidl_for_test delete mode 100644 tests/inheritance/1.0/.hidl_for_test delete mode 100644 tests/libhwbinder/1.0/.hidl_for_test delete mode 100644 tests/libhwbinder/aidl/.hidl_for_test delete mode 100644 tests/memory/1.0/.hidl_for_test delete mode 100644 tests/msgq/1.0/.hidl_for_test delete mode 100644 tests/multithread/1.0/.hidl_for_test delete mode 100644 tests/pointer/1.0/.hidl_for_test diff --git a/tests/bar/1.0/.hidl_for_test b/tests/bar/1.0/.hidl_for_test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/bar/1.0/Android.bp b/tests/bar/1.0/Android.bp index 44ae7a5282..2dbfb0f980 100644 --- a/tests/bar/1.0/Android.bp +++ b/tests/bar/1.0/Android.bp @@ -67,7 +67,7 @@ genrule { ], } -cc_test_library { +cc_library { name: "android.hardware.tests.bar@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.bar@1.0_genc++"], diff --git a/tests/baz/1.0/.hidl_for_test b/tests/baz/1.0/.hidl_for_test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/baz/1.0/Android.bp b/tests/baz/1.0/Android.bp index 7fa8b272bc..cec3039952 100644 --- a/tests/baz/1.0/Android.bp +++ b/tests/baz/1.0/Android.bp @@ -60,7 +60,7 @@ genrule { ], } -cc_test_library { +cc_library { name: "android.hardware.tests.baz@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.baz@1.0_genc++"], diff --git a/tests/expression/1.0/.hidl_for_test b/tests/expression/1.0/.hidl_for_test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/expression/1.0/Android.bp b/tests/expression/1.0/Android.bp index 0ea0acf6ae..093b6607f9 100644 --- a/tests/expression/1.0/Android.bp +++ b/tests/expression/1.0/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_test_library { +cc_library { name: "android.hardware.tests.expression@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.expression@1.0_genc++"], diff --git a/tests/extension/light/2.0/.hidl_for_test b/tests/extension/light/2.0/.hidl_for_test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/extension/light/2.0/Android.bp b/tests/extension/light/2.0/Android.bp index e8a50174fd..52117b41e0 100644 --- a/tests/extension/light/2.0/Android.bp +++ b/tests/extension/light/2.0/Android.bp @@ -39,7 +39,7 @@ genrule { ], } -cc_test_library { +cc_library { name: "android.hardware.tests.extension.light@2.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.extension.light@2.0_genc++"], diff --git a/tests/foo/1.0/.hidl_for_test b/tests/foo/1.0/.hidl_for_test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/foo/1.0/Android.bp b/tests/foo/1.0/Android.bp index b5de12e541..d0038ab72e 100644 --- a/tests/foo/1.0/Android.bp +++ b/tests/foo/1.0/Android.bp @@ -67,7 +67,7 @@ genrule { ], } -cc_test_library { +cc_library { name: "android.hardware.tests.foo@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.foo@1.0_genc++"], diff --git a/tests/hash/1.0/.hidl_for_test b/tests/hash/1.0/.hidl_for_test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/hash/1.0/Android.bp b/tests/hash/1.0/Android.bp index d4d1d1a9e2..336963e3fc 100644 --- a/tests/hash/1.0/Android.bp +++ b/tests/hash/1.0/Android.bp @@ -35,7 +35,7 @@ genrule { ], } -cc_test_library { +cc_library { name: "android.hardware.tests.hash@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.hash@1.0_genc++"], diff --git a/tests/inheritance/1.0/.hidl_for_test b/tests/inheritance/1.0/.hidl_for_test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/inheritance/1.0/Android.bp b/tests/inheritance/1.0/Android.bp index 93a8ad5182..a8c0e6ce38 100644 --- a/tests/inheritance/1.0/Android.bp +++ b/tests/inheritance/1.0/Android.bp @@ -56,7 +56,7 @@ genrule { ], } -cc_test_library { +cc_library { name: "android.hardware.tests.inheritance@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.inheritance@1.0_genc++"], diff --git a/tests/libhwbinder/1.0/.hidl_for_test b/tests/libhwbinder/1.0/.hidl_for_test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/libhwbinder/1.0/Android.bp b/tests/libhwbinder/1.0/Android.bp index 4f3beb0b32..61326286a7 100644 --- a/tests/libhwbinder/1.0/Android.bp +++ b/tests/libhwbinder/1.0/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_test_library { +cc_library { name: "android.hardware.tests.libhwbinder@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.libhwbinder@1.0_genc++"], diff --git a/tests/libhwbinder/aidl/.hidl_for_test b/tests/libhwbinder/aidl/.hidl_for_test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/memory/1.0/.hidl_for_test b/tests/memory/1.0/.hidl_for_test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/memory/1.0/Android.bp b/tests/memory/1.0/Android.bp index d39ba284bb..c5cc4a0c60 100644 --- a/tests/memory/1.0/Android.bp +++ b/tests/memory/1.0/Android.bp @@ -35,7 +35,7 @@ genrule { ], } -cc_test_library { +cc_library { name: "android.hardware.tests.memory@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.memory@1.0_genc++"], diff --git a/tests/msgq/1.0/.hidl_for_test b/tests/msgq/1.0/.hidl_for_test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/msgq/1.0/Android.bp b/tests/msgq/1.0/Android.bp index 7758ee86ad..017e0d4a9d 100644 --- a/tests/msgq/1.0/Android.bp +++ b/tests/msgq/1.0/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_test_library { +cc_library { name: "android.hardware.tests.msgq@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.msgq@1.0_genc++"], diff --git a/tests/multithread/1.0/.hidl_for_test b/tests/multithread/1.0/.hidl_for_test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/multithread/1.0/Android.bp b/tests/multithread/1.0/Android.bp index 76ad2c1ecb..68c19aa19f 100644 --- a/tests/multithread/1.0/Android.bp +++ b/tests/multithread/1.0/Android.bp @@ -35,7 +35,7 @@ genrule { ], } -cc_test_library { +cc_library { name: "android.hardware.tests.multithread@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.multithread@1.0_genc++"], diff --git a/tests/pointer/1.0/.hidl_for_test b/tests/pointer/1.0/.hidl_for_test deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/pointer/1.0/Android.bp b/tests/pointer/1.0/Android.bp index 178f165e38..55598cacfd 100644 --- a/tests/pointer/1.0/Android.bp +++ b/tests/pointer/1.0/Android.bp @@ -42,7 +42,7 @@ genrule { ], } -cc_test_library { +cc_library { name: "android.hardware.tests.pointer@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.tests.pointer@1.0_genc++"], From f2279b67f3661e73b910458d5f4608a66497c558 Mon Sep 17 00:00:00 2001 From: Peng Xu Date: Tue, 12 Sep 2017 14:52:22 -0700 Subject: [PATCH 219/265] Add capability for sensor hal to use wakelock Bug: 63995095 Test: no more wake lock acquire failures in QCOM and nanohub sensor hal Change-Id: I2a5c2e29ecb66869a408f53998b6074ed07b493a --- sensors/1.0/default/android.hardware.sensors@1.0-service.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sensors/1.0/default/android.hardware.sensors@1.0-service.rc b/sensors/1.0/default/android.hardware.sensors@1.0-service.rc index 059e5db08e..6e78082bb9 100644 --- a/sensors/1.0/default/android.hardware.sensors@1.0-service.rc +++ b/sensors/1.0/default/android.hardware.sensors@1.0-service.rc @@ -1,5 +1,5 @@ service sensors-hal-1-0 /vendor/bin/hw/android.hardware.sensors@1.0-service class hal user system - group system - capabilities SYS_NICE + group system wakelock + capabilities BLOCK_SUSPEND SYS_NICE From 1b60b120ded30eba5d6338bdccba2515ec4d4d42 Mon Sep 17 00:00:00 2001 From: Etan Cohen Date: Wed, 13 Sep 2017 16:40:49 -0700 Subject: [PATCH 220/265] [AWARE] Developer documentation on HAL usage Add documentation specifying which HAL APIs are used by the framework. Bug: 65646388 Test: N/A Change-Id: Id1407a2d206b8eab47f5753a7cc6713b9581aeff --- wifi/1.0/README-NAN.md | 221 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 wifi/1.0/README-NAN.md diff --git a/wifi/1.0/README-NAN.md b/wifi/1.0/README-NAN.md new file mode 100644 index 0000000000..f4b3320e33 --- /dev/null +++ b/wifi/1.0/README-NAN.md @@ -0,0 +1,221 @@ +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. + +# Wi-Fi Aware (NAN) HAL API Usage + +The Wi-Fi Aware (NAN) HAL API is defined in (hardware/interfaces/wifi/\/): + +* IWifiNanIface.hal +* IWifiNanIfaceEventCallback.hal +* types.hal (structure definitions) + +The Wi-Fi Aware (NAN) HAL API surface is very large - only a subset is used from the framework. + +Understanding of the HAL API subset which is actively used by the Android framework can be deduced +by reviewing framework code, specifically (frameworks/opt/net/wif/): + +* WifiAwareNativeApi.java +* WifiAwareNativeCallback.java + +The above framework files determine the API usage - and should be consulted as the authoritative +reference. Please consult the primary HAL file for documentation - they will not be replicated +in this document. APIs which are in the HAL but are not listed in this README file are not used by +the framework. + +Note: the HAL API is translated to the legacy HAL API (wifi_nan.h). This README file covers +the new HAL API only. To understand the mapping between new and legacy HALs please consult +hardware/interfaces/wifi/\/default/hidl_struct_util.cpp. + +## IWifiNanIface + +Format: +* Hard-coded values are in bold, e.g. true or 5 +* Assigned but not fixed value are specified using the variable keyword, possibly with some +details/constraints +* Unassigned values are specified using the N/A keyword. Unassigned usually means initialized +to 0. + +APIs: + +* registerEventCallback(IWifiNanIfaceEventCallback callback) +* getCapabilitiesRequest +* enableRequest + * NanEnableRequest + * bool[2] operateInBand + * Index [NanBandIndex.NAN_BAND_24GHZ] = true + * Index [NanBandIndex.NAN_BAND_5GHZ] = variable + * uint8_t hopCountMax = 2 + * NanConfigRequest configParams + * uint8_t masterPref = variable + * bool disableDiscoveryAddressChangeIndication = variable + * bool disableStartedClusterIndication = variable + * bool disableJoinedClusterIndication = variable + * bool includePublishServiceIdsInBeacon = true + * uint8_t numberOfPublishServiceIdsInBeacon = 0 + * bool includeSubscribeServiceIdsInBeacon = true + * uint8_t numberOfSubscribeServiceIdsInBeacon = 0 + * uint16_t rssiWindowSize = 8 + * uint32_t macAddressRandomizationIntervalSec = variable + * Normal run-time: set to 1800 (30 minutes) + * Tests: set to 120 (2 minutes) + * NanBandSpecificConfig[2] bandSpecificConfig + * Index [NanBandIndex.NAN_BAND_24GHZ] + * uint8_t rssiClose = 60 + * uint8_t rssiMiddle = 70 + * uint8_t rssiCloseProximity = 60 + * uint8_t dwellTimeMs = 200 + * uint16_t scanPeriodSec = 20 + * bool validDiscoveryWindowIntervalVal = variable + * uint8_t discoveryWindowIntervalVal = variable + * Index [NanBandIndex.NAN_BAND_5GHZ] + * uint8_t rssiClose = 60 + * uint8_t rssiMiddle = 75 + * uint8_t rssiCloseProximity = 60 + * uint8_t dwellTimeMs = 200 + * uint16_t scanPeriodSec = 20 + * bool validDiscoveryWindowIntervalVal = variable + * uint8_t discoveryWindowIntervalVal = variable + * NanDebugConfig debugConfigs + * bool validClusterIdVals = true + * uint16_t clusterIdBottomRangeVal = variable + * uint16_t clusterIdTopRangeVal = variable + * bool validIntfAddrVal = false + * MacAddress intfAddrVal = N/A + * bool validOuiVal = false + * uint32_t ouiVal = N/A + * bool validRandomFactorForceVal = false + * uint8_t randomFactorForceVal = N/A + * bool validHopCountForceVal = false + * uint8_t hopCountForceVal = N/A + * bool validDiscoveryChannelVal = false + * WifiChannelInMhz[2] discoveryChannelMhzVal = N/A + * bool validUseBeaconsInBandVal = false + * bool[2] useBeaconsInBandVal = N/A + * bool validUseSdfInBandVal = false + * bool[2] useSdfInBandVal = N/A +* configRequest + * NanConfigRequest: same as for enableRequest +* disableRequest +* startPublishRequest + * NanPublishRequest + * NanDiscoveryCommonConfig baseConfigs + * uint8_t sessionId = variable + * uint16_t ttlSec = variable + * uint16_t discoveryWindowPeriod = 1 + * uint8_t discoveryCount = 0 + * vec serviceName = variable + * NanMatchAlg discoveryMatchIndicator = NanMatchAlg.MATCH_NEVER + * vec serviceSpecificInfo = variable + * vec extendedServiceSpecificInfo = N/A + * vec rxMatchFilter = variable + * vec txMatchFilter = variable + * bool useRssiThreshold = false + * bool disableDiscoveryTerminationIndication = variable + * bool disableMatchExpirationIndication = true + * bool disableFollowupReceivedIndication = false + * NanDataPathSecurityConfig securityConfig = NanDataPathSecurityType.OPEN + * bool rangingRequired = false + * uint32_t rangingIntervalMsec = N/A + * bitfield configRangingIndications = N/A + * uint16_t distanceIngressCm = N/A + * uint16_t distanceEgressCm = N/A + * NanPublishType publishType = variable + * NanTxType txType = NanTxType.BROADCAST + * bool autoAcceptDataPathRequests = false +* stopPublishRequest +* startSubscribeRequest + * NanSubscribeRequest + * NanDiscoveryCommonConfig baseConfigs + * Mostly same as publish above except: + * NanMatchAlg discoveryMatchIndicator = NanMatchAlg.MATCH_ONCE + * NanSubscribeType subscribeType = variable + * NanSrfType srfType = N/A + * bool srfRespondIfInAddressSet = N/A + * bool shouldUseSrf = N/A + * bool isSsiRequiredForMatch = N/A + * vec intfAddr = N/A +* stopSubscribeRequest +* transmitFollowupRequest + * NanTransmitFollowupRequest + * uint8_t discoverySessionId = variable + * uint32_t peerId = variable + * MacAddress addr = variable + * bool isHighPriority = false + * bool shouldUseDiscoveryWindow = true + * vec serviceSpecificInfo = variable + * vec extendedServiceSpecificInfo = N/A + * bool disableFollowupResultIndication = false +* createDataInterfaceRequest +* deleteDataInterfaceRequest +* initiateDataPathRequest + * NanInitiateDataPathRequest + * uint32_t peerId = variable + * MacAddress peerDiscMacAddr = variable + * NanDataPathChannelCfg channelRequestType = + NanDataPathChannelCfg.CHANNEL_NOT_REQUESTED + * WifiChannelInMhz channel = 2437 (note that should be ignored though - + CHANNEL_NOT_REQUESTED!) + * string ifaceName = variable + * NanDataPathSecurityConfig securityConfig = variable + * vec appInfo = N/A + * vec serviceNameOutOfBand = variable +* respondToDataPathIndicationRequest + * NanRespondToDataPathIndicationRequest + * bool acceptRequest = variable + * uint32_t ndpInstanceId = variable + * string ifaceName = variable + * NanDataPathSecurityConfig securityConfig = variable + * vec appInfo = N/A + * vec serviceNameOutOfBand = variable +* terminateDataPathRequest + +## IWifiNanIfaceEventCallback + +Format: +* Parameters whose values are ignored will be flagged, otherwise the parameter value is used +by the framework. + +API: + +* notifyXxxResponse: all callbacks are used by framework +* eventClusterEvent +* eventDisabled +* eventPublishTerminated +* eventSubscribeTerminated +* eventMatch + * NanMatchInd (all parameters are used except those listed below) + * vec extendedServiceSpecificInfo: ignored + * bool matchOccuredInBeaconFlag: ignored + * bool outOfResourceFlag: ignored + * uint8_t rssiValue: ignored + * NanCipherSuiteType peerCipherType: ignored + * bool peerRequiresSecurityEnabledInNdp: ignored + * bool peerRequiresRanging: ignored + * uint32_t rangingMeasurementInCm: ignored + * bitfield rangingIndicationType: ignored +* eventMatchExpired: ignored +* eventFollowupReceived + * NanFollowupReceivedInd (all parameters are used except those listed below) + * bool receivedInFaw: ignored + * vec extendedServiceSpecificInfo: ignored +* eventTransmitFollowup +* eventDataPathRequest + * NanDataPathRequestInd (all parameters are used except those listed below) + * bool securityRequired: ignored + * vec appInfo: ignored +* eventDataPathConfirm + * NanDataPathConfirmInd (all parameters are used except those listed below) + * vec appInfo: ignored +* eventDataPathTerminated + From 526a36ca2415e66a8b1b7b0d596fab26d8e18724 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Tue, 29 Aug 2017 14:20:59 +0900 Subject: [PATCH 221/265] HAL interface libs for testing are built w/o VNDK. The HAL interfaces for testing were copied to /system/lib[64]/vndk directory since they are built as cc_library and thus falsely recognized as members of VNDK, which isn't true. Build them as non-VNDK so that they are filtered out. To do so, .hidl_for_test files are added for the test HALs and update-makefiles.sh were ran. Bug: 64776708 Test: no android.hardware.tests.*.so file in /system/lib[64]/vndk on 2017 pixel devices Change-Id: I6167da8572081adfb53f432b248ac3bbee39dc42 --- tests/bar/1.0/.hidl_for_test | 0 tests/bar/1.0/Android.bp | 3 --- tests/baz/1.0/.hidl_for_test | 0 tests/baz/1.0/Android.bp | 3 --- tests/expression/1.0/.hidl_for_test | 0 tests/expression/1.0/Android.bp | 3 --- tests/extension/light/2.0/.hidl_for_test | 0 tests/extension/light/2.0/Android.bp | 3 --- tests/foo/1.0/.hidl_for_test | 0 tests/foo/1.0/Android.bp | 3 --- tests/hash/1.0/.hidl_for_test | 0 tests/hash/1.0/Android.bp | 3 --- tests/inheritance/1.0/.hidl_for_test | 0 tests/inheritance/1.0/Android.bp | 3 --- tests/libhwbinder/1.0/.hidl_for_test | 0 tests/libhwbinder/1.0/Android.bp | 3 --- tests/libhwbinder/aidl/.hidl_for_test | 0 tests/memory/1.0/.hidl_for_test | 0 tests/memory/1.0/Android.bp | 3 --- tests/msgq/1.0/.hidl_for_test | 0 tests/msgq/1.0/Android.bp | 3 --- tests/multithread/1.0/.hidl_for_test | 0 tests/multithread/1.0/Android.bp | 3 --- tests/pointer/1.0/.hidl_for_test | 0 tests/pointer/1.0/Android.bp | 3 --- 25 files changed, 36 deletions(-) create mode 100644 tests/bar/1.0/.hidl_for_test create mode 100644 tests/baz/1.0/.hidl_for_test create mode 100644 tests/expression/1.0/.hidl_for_test create mode 100644 tests/extension/light/2.0/.hidl_for_test create mode 100644 tests/foo/1.0/.hidl_for_test create mode 100644 tests/hash/1.0/.hidl_for_test create mode 100644 tests/inheritance/1.0/.hidl_for_test create mode 100644 tests/libhwbinder/1.0/.hidl_for_test create mode 100644 tests/libhwbinder/aidl/.hidl_for_test create mode 100644 tests/memory/1.0/.hidl_for_test create mode 100644 tests/msgq/1.0/.hidl_for_test create mode 100644 tests/multithread/1.0/.hidl_for_test create mode 100644 tests/pointer/1.0/.hidl_for_test diff --git a/tests/bar/1.0/.hidl_for_test b/tests/bar/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/bar/1.0/Android.bp b/tests/bar/1.0/Android.bp index 2dbfb0f980..b6ee0423a7 100644 --- a/tests/bar/1.0/Android.bp +++ b/tests/bar/1.0/Android.bp @@ -74,9 +74,6 @@ cc_library { generated_headers: ["android.hardware.tests.bar@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.bar@1.0_genc++_headers"], vendor_available: true, - vndk: { - enabled: true, - }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/baz/1.0/.hidl_for_test b/tests/baz/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/baz/1.0/Android.bp b/tests/baz/1.0/Android.bp index cec3039952..ef68149984 100644 --- a/tests/baz/1.0/Android.bp +++ b/tests/baz/1.0/Android.bp @@ -67,9 +67,6 @@ cc_library { generated_headers: ["android.hardware.tests.baz@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.baz@1.0_genc++_headers"], vendor_available: true, - vndk: { - enabled: true, - }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/expression/1.0/.hidl_for_test b/tests/expression/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/expression/1.0/Android.bp b/tests/expression/1.0/Android.bp index 093b6607f9..bc389b0a65 100644 --- a/tests/expression/1.0/Android.bp +++ b/tests/expression/1.0/Android.bp @@ -49,9 +49,6 @@ cc_library { generated_headers: ["android.hardware.tests.expression@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.expression@1.0_genc++_headers"], vendor_available: true, - vndk: { - enabled: true, - }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/extension/light/2.0/.hidl_for_test b/tests/extension/light/2.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/extension/light/2.0/Android.bp b/tests/extension/light/2.0/Android.bp index 52117b41e0..c5987a77c3 100644 --- a/tests/extension/light/2.0/Android.bp +++ b/tests/extension/light/2.0/Android.bp @@ -46,9 +46,6 @@ cc_library { generated_headers: ["android.hardware.tests.extension.light@2.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.extension.light@2.0_genc++_headers"], vendor_available: true, - vndk: { - enabled: true, - }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/foo/1.0/.hidl_for_test b/tests/foo/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/foo/1.0/Android.bp b/tests/foo/1.0/Android.bp index d0038ab72e..638795046a 100644 --- a/tests/foo/1.0/Android.bp +++ b/tests/foo/1.0/Android.bp @@ -74,9 +74,6 @@ cc_library { generated_headers: ["android.hardware.tests.foo@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.foo@1.0_genc++_headers"], vendor_available: true, - vndk: { - enabled: true, - }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/hash/1.0/.hidl_for_test b/tests/hash/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/hash/1.0/Android.bp b/tests/hash/1.0/Android.bp index 336963e3fc..505a4ad553 100644 --- a/tests/hash/1.0/Android.bp +++ b/tests/hash/1.0/Android.bp @@ -42,9 +42,6 @@ cc_library { generated_headers: ["android.hardware.tests.hash@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.hash@1.0_genc++_headers"], vendor_available: true, - vndk: { - enabled: true, - }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/inheritance/1.0/.hidl_for_test b/tests/inheritance/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/inheritance/1.0/Android.bp b/tests/inheritance/1.0/Android.bp index a8c0e6ce38..5d8d53de20 100644 --- a/tests/inheritance/1.0/Android.bp +++ b/tests/inheritance/1.0/Android.bp @@ -63,9 +63,6 @@ cc_library { generated_headers: ["android.hardware.tests.inheritance@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.inheritance@1.0_genc++_headers"], vendor_available: true, - vndk: { - enabled: true, - }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/libhwbinder/1.0/.hidl_for_test b/tests/libhwbinder/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/libhwbinder/1.0/Android.bp b/tests/libhwbinder/1.0/Android.bp index 61326286a7..338a72b1d7 100644 --- a/tests/libhwbinder/1.0/Android.bp +++ b/tests/libhwbinder/1.0/Android.bp @@ -49,9 +49,6 @@ cc_library { generated_headers: ["android.hardware.tests.libhwbinder@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.libhwbinder@1.0_genc++_headers"], vendor_available: true, - vndk: { - enabled: true, - }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/libhwbinder/aidl/.hidl_for_test b/tests/libhwbinder/aidl/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/memory/1.0/.hidl_for_test b/tests/memory/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/memory/1.0/Android.bp b/tests/memory/1.0/Android.bp index c5cc4a0c60..a7538240b2 100644 --- a/tests/memory/1.0/Android.bp +++ b/tests/memory/1.0/Android.bp @@ -42,9 +42,6 @@ cc_library { generated_headers: ["android.hardware.tests.memory@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.memory@1.0_genc++_headers"], vendor_available: true, - vndk: { - enabled: true, - }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/msgq/1.0/.hidl_for_test b/tests/msgq/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/msgq/1.0/Android.bp b/tests/msgq/1.0/Android.bp index 017e0d4a9d..0937545983 100644 --- a/tests/msgq/1.0/Android.bp +++ b/tests/msgq/1.0/Android.bp @@ -49,9 +49,6 @@ cc_library { generated_headers: ["android.hardware.tests.msgq@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.msgq@1.0_genc++_headers"], vendor_available: true, - vndk: { - enabled: true, - }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/multithread/1.0/.hidl_for_test b/tests/multithread/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/multithread/1.0/Android.bp b/tests/multithread/1.0/Android.bp index 68c19aa19f..5f4c44c980 100644 --- a/tests/multithread/1.0/Android.bp +++ b/tests/multithread/1.0/Android.bp @@ -42,9 +42,6 @@ cc_library { generated_headers: ["android.hardware.tests.multithread@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.multithread@1.0_genc++_headers"], vendor_available: true, - vndk: { - enabled: true, - }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/tests/pointer/1.0/.hidl_for_test b/tests/pointer/1.0/.hidl_for_test new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/pointer/1.0/Android.bp b/tests/pointer/1.0/Android.bp index 55598cacfd..a765ae76d6 100644 --- a/tests/pointer/1.0/Android.bp +++ b/tests/pointer/1.0/Android.bp @@ -49,9 +49,6 @@ cc_library { generated_headers: ["android.hardware.tests.pointer@1.0_genc++_headers"], export_generated_headers: ["android.hardware.tests.pointer@1.0_genc++_headers"], vendor_available: true, - vndk: { - enabled: true, - }, shared_libs: [ "libhidlbase", "libhidltransport", From 50fe43099495dcb388fdd7eb1ff78609aaa0cf88 Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Tue, 22 Aug 2017 16:15:09 -0700 Subject: [PATCH 222/265] Camera: Add default implementation of camera.device@3.3 Inherit as much as possible from camera.device@3.2 - Refactor CameraDeviceSession@3.2 implementation to separate out the HIDL session interface from the main implementation object. This avoids multiple inheritance issues - Create CameraDeviceSession@3.3 with support for the new overrideDataspace field - Add virtual factory method for CameraDevice to create the right version of Session. - Create CameraDevice@3.3, which overrides createSession to return a CameraDeviceSession@3.3. - Add system property to override selection of which minor HIDL version is used for legal HAL version 3.x; set the default to the newest available minor version. Test: Camera CTS passes on device using @3.3. Bug: 62358514 Change-Id: I497e4bc0de798b56ecdb2ea6467b79afccaf89f7 --- camera/Android.bp | 1 + camera/device/3.2/default/CameraDevice.cpp | 25 ++- .../3.2/default/CameraDeviceSession.cpp | 21 ++- .../device/3.2/default/CameraDeviceSession.h | 82 ++++++-- camera/device/3.2/default/CameraDevice_3_2.h | 8 +- camera/device/3.3/default/Android.bp | 30 +++ camera/device/3.3/default/CameraDevice.cpp | 67 +++++++ .../3.3/default/CameraDeviceSession.cpp | 178 ++++++++++++++++++ .../device/3.3/default/CameraDeviceSession.h | 138 ++++++++++++++ camera/device/3.3/default/CameraDevice_3_3.h | 75 ++++++++ camera/device/3.3/default/OWNERS | 6 + camera/device/3.3/default/convert.cpp | 65 +++++++ camera/device/3.3/default/include/convert.h | 49 +++++ camera/provider/2.4/default/Android.bp | 3 + .../provider/2.4/default/CameraProvider.cpp | 83 +++++--- camera/provider/2.4/default/CameraProvider.h | 8 +- 16 files changed, 790 insertions(+), 49 deletions(-) create mode 100644 camera/device/3.3/default/Android.bp create mode 100644 camera/device/3.3/default/CameraDevice.cpp create mode 100644 camera/device/3.3/default/CameraDeviceSession.cpp create mode 100644 camera/device/3.3/default/CameraDeviceSession.h create mode 100644 camera/device/3.3/default/CameraDevice_3_3.h create mode 100644 camera/device/3.3/default/OWNERS create mode 100644 camera/device/3.3/default/convert.cpp create mode 100644 camera/device/3.3/default/include/convert.h diff --git a/camera/Android.bp b/camera/Android.bp index 83a2803580..0240751c5a 100644 --- a/camera/Android.bp +++ b/camera/Android.bp @@ -7,6 +7,7 @@ subdirs = [ "device/3.2", "device/3.2/default", "device/3.3", + "device/3.3/default", "metadata/3.2", "provider/2.4", "provider/2.4/default", diff --git a/camera/device/3.2/default/CameraDevice.cpp b/camera/device/3.2/default/CameraDevice.cpp index 637a1e6616..295ee32865 100644 --- a/camera/device/3.2/default/CameraDevice.cpp +++ b/camera/device/3.2/default/CameraDevice.cpp @@ -177,7 +177,7 @@ Return CameraDevice::open(const sp& callback, open_ if (callback == nullptr) { ALOGE("%s: cannot open camera %s. callback is null!", __FUNCTION__, mCameraId.c_str()); - _hidl_cb(Status::ILLEGAL_ARGUMENT, session); + _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr); return Void(); } @@ -186,7 +186,7 @@ Return CameraDevice::open(const sp& callback, open_ // this must be a disconnected camera ALOGE("%s: cannot open camera %s. camera is disconnected!", __FUNCTION__, mCameraId.c_str()); - _hidl_cb(Status::CAMERA_DISCONNECTED, session); + _hidl_cb(Status::CAMERA_DISCONNECTED, nullptr); return Void(); } else { mLock.lock(); @@ -239,7 +239,7 @@ Return CameraDevice::open(const sp& callback, open_ return Void(); } - session = new CameraDeviceSession( + session = createSession( device, info.static_camera_characteristics, callback); if (session == nullptr) { ALOGE("%s: camera device session allocation failed", __FUNCTION__); @@ -255,9 +255,19 @@ Return CameraDevice::open(const sp& callback, open_ return Void(); } mSession = session; + + IF_ALOGV() { + session->getInterface()->interfaceChain([]( + ::android::hardware::hidl_vec<::android::hardware::hidl_string> interfaceChain) { + ALOGV("Session interface chain:"); + for (auto iface : interfaceChain) { + ALOGV(" %s", iface.c_str()); + } + }); + } mLock.unlock(); } - _hidl_cb(status, session); + _hidl_cb(status, session->getInterface()); return Void(); } @@ -286,6 +296,13 @@ Return CameraDevice::dumpState(const ::android::hardware::hidl_handle& han session->dumpState(handle); return Void(); } + +sp CameraDevice::createSession(camera3_device_t* device, + const camera_metadata_t* deviceInfo, + const sp& callback) { + return new CameraDeviceSession(device, deviceInfo, callback); +} + // End of methods from ::android::hardware::camera::device::V3_2::ICameraDevice. } // namespace implementation diff --git a/camera/device/3.2/default/CameraDeviceSession.cpp b/camera/device/3.2/default/CameraDeviceSession.cpp index fcd134f45e..d6a04bc56b 100644 --- a/camera/device/3.2/default/CameraDeviceSession.cpp +++ b/camera/device/3.2/default/CameraDeviceSession.cpp @@ -49,7 +49,6 @@ CameraDeviceSession::CameraDeviceSession( mDerivePostRawSensKey(false), mNumPartialResults(1), mResultBatcher(callback) { - mDeviceInfo = deviceInfo; camera_metadata_entry partialResultsCount = mDeviceInfo.find(ANDROID_REQUEST_PARTIAL_RESULT_COUNT); @@ -328,7 +327,8 @@ void CameraDeviceSession::ResultBatcher::setBatchedStreams( mStreamsToBatch = streamsToBatch; } -void CameraDeviceSession::ResultBatcher::setResultMetadataQueue(std::shared_ptr q) { +void CameraDeviceSession::ResultBatcher::setResultMetadataQueue( + std::shared_ptr q) { Mutex::Autolock _l(mLock); mResultMetadataQueue = q; } @@ -387,7 +387,8 @@ void CameraDeviceSession::ResultBatcher::checkAndRemoveFirstBatch() { } } -void CameraDeviceSession::ResultBatcher::sendBatchShutterCbsLocked(std::shared_ptr batch) { +void CameraDeviceSession::ResultBatcher::sendBatchShutterCbsLocked( + std::shared_ptr batch) { if (batch->mShutterDelivered) { ALOGW("%s: batch shutter callback already sent!", __FUNCTION__); return; @@ -441,7 +442,8 @@ void CameraDeviceSession::ResultBatcher::pushStreamBuffer( } } -void CameraDeviceSession::ResultBatcher::sendBatchBuffersLocked(std::shared_ptr batch) { +void CameraDeviceSession::ResultBatcher::sendBatchBuffersLocked( + std::shared_ptr batch) { sendBatchBuffersLocked(batch, mStreamsToBatch); } @@ -736,7 +738,7 @@ void CameraDeviceSession::ResultBatcher::processCaptureResult(CaptureResult& res // Methods from ::android::hardware::camera::device::V3_2::ICameraDeviceSession follow. Return CameraDeviceSession::constructDefaultRequestSettings( - RequestTemplate type, constructDefaultRequestSettings_cb _hidl_cb) { + RequestTemplate type, ICameraDeviceSession::constructDefaultRequestSettings_cb _hidl_cb) { Status status = initStatus(); CameraMetadata outMetadata; const camera_metadata_t *rawRequest; @@ -802,7 +804,8 @@ android_dataspace CameraDeviceSession::mapToLegacyDataspace( } Return CameraDeviceSession::configureStreams( - const StreamConfiguration& requestedConfiguration, configureStreams_cb _hidl_cb) { + const StreamConfiguration& requestedConfiguration, + ICameraDeviceSession::configureStreams_cb _hidl_cb) { Status status = initStatus(); HalStreamConfiguration outStreams; @@ -960,13 +963,13 @@ void CameraDeviceSession::updateBufferCaches(const hidl_vec& caches } Return CameraDeviceSession::getCaptureRequestMetadataQueue( - getCaptureRequestMetadataQueue_cb _hidl_cb) { + ICameraDeviceSession::getCaptureRequestMetadataQueue_cb _hidl_cb) { _hidl_cb(*mRequestMetadataQueue->getDesc()); return Void(); } Return CameraDeviceSession::getCaptureResultMetadataQueue( - getCaptureResultMetadataQueue_cb _hidl_cb) { + ICameraDeviceSession::getCaptureResultMetadataQueue_cb _hidl_cb) { _hidl_cb(*mResultMetadataQueue->getDesc()); return Void(); } @@ -974,7 +977,7 @@ Return CameraDeviceSession::getCaptureResultMetadataQueue( Return CameraDeviceSession::processCaptureRequest( const hidl_vec& requests, const hidl_vec& cachesToRemove, - processCaptureRequest_cb _hidl_cb) { + ICameraDeviceSession::processCaptureRequest_cb _hidl_cb) { updateBufferCaches(cachesToRemove); uint32_t numRequestProcessed = 0; diff --git a/camera/device/3.2/default/CameraDeviceSession.h b/camera/device/3.2/default/CameraDeviceSession.h index 2fe189fde1..69e2e2c802 100644 --- a/camera/device/3.2/default/CameraDeviceSession.h +++ b/camera/device/3.2/default/CameraDeviceSession.h @@ -55,6 +55,8 @@ using ::android::hardware::hidl_string; using ::android::sp; using ::android::Mutex; +struct Camera3Stream; + /** * Function pointer types with C calling convention to * use for HAL callback functions. @@ -69,12 +71,12 @@ extern "C" { const camera3_notify_msg_t *); } -struct CameraDeviceSession : public ICameraDeviceSession, private camera3_callback_ops { +struct CameraDeviceSession : public virtual RefBase, protected camera3_callback_ops { CameraDeviceSession(camera3_device_t*, const camera_metadata_t* deviceInfo, const sp&); - ~CameraDeviceSession(); + virtual ~CameraDeviceSession(); // Call by CameraDevice to dump active device states void dumpState(const native_handle_t* fd); // Caller must use this method to check if CameraDeviceSession ctor failed @@ -83,23 +85,35 @@ struct CameraDeviceSession : public ICameraDeviceSession, private camera3_callba void disconnect(); bool isClosed(); - // Methods from ::android::hardware::camera::device::V3_2::ICameraDeviceSession follow. + // Retrieve the HIDL interface, split into its own class to avoid inheritance issues when + // dealing with minor version revs and simultaneous implementation and interface inheritance + virtual sp getInterface() { + return new TrampolineSessionInterface_3_2(this); + } + +protected: + + // Methods from ::android::hardware::camera::device::V3_2::ICameraDeviceSession follow + Return constructDefaultRequestSettings( - RequestTemplate type, constructDefaultRequestSettings_cb _hidl_cb) override; + RequestTemplate type, + ICameraDeviceSession::constructDefaultRequestSettings_cb _hidl_cb); Return configureStreams( - const StreamConfiguration& requestedConfiguration, configureStreams_cb _hidl_cb) override; + const StreamConfiguration& requestedConfiguration, + ICameraDeviceSession::configureStreams_cb _hidl_cb); Return getCaptureRequestMetadataQueue( - getCaptureRequestMetadataQueue_cb _hidl_cb) override; + ICameraDeviceSession::getCaptureRequestMetadataQueue_cb _hidl_cb); Return getCaptureResultMetadataQueue( - getCaptureResultMetadataQueue_cb _hidl_cb) override; + ICameraDeviceSession::getCaptureResultMetadataQueue_cb _hidl_cb); Return processCaptureRequest( const hidl_vec& requests, const hidl_vec& cachesToRemove, - processCaptureRequest_cb _hidl_cb) override; - Return flush() override; - Return close() override; + ICameraDeviceSession::processCaptureRequest_cb _hidl_cb); + Return flush(); + Return close(); + +protected: -private: // protecting mClosed/mDisconnected/mInitFail mutable Mutex mStateLock; // device is closed either @@ -302,6 +316,52 @@ private: */ static callbacks_process_capture_result_t sProcessCaptureResult; static callbacks_notify_t sNotify; + +private: + + struct TrampolineSessionInterface_3_2 : public ICameraDeviceSession { + TrampolineSessionInterface_3_2(sp parent) : + mParent(parent) {} + + virtual Return constructDefaultRequestSettings( + V3_2::RequestTemplate type, + V3_2::ICameraDeviceSession::constructDefaultRequestSettings_cb _hidl_cb) override { + return mParent->constructDefaultRequestSettings(type, _hidl_cb); + } + + virtual Return configureStreams( + const V3_2::StreamConfiguration& requestedConfiguration, + V3_2::ICameraDeviceSession::configureStreams_cb _hidl_cb) override { + return mParent->configureStreams(requestedConfiguration, _hidl_cb); + } + + virtual Return processCaptureRequest(const hidl_vec& requests, + const hidl_vec& cachesToRemove, + V3_2::ICameraDeviceSession::processCaptureRequest_cb _hidl_cb) override { + return mParent->processCaptureRequest(requests, cachesToRemove, _hidl_cb); + } + + virtual Return getCaptureRequestMetadataQueue( + V3_2::ICameraDeviceSession::getCaptureRequestMetadataQueue_cb _hidl_cb) override { + return mParent->getCaptureRequestMetadataQueue(_hidl_cb); + } + + virtual Return getCaptureResultMetadataQueue( + V3_2::ICameraDeviceSession::getCaptureResultMetadataQueue_cb _hidl_cb) override { + return mParent->getCaptureResultMetadataQueue(_hidl_cb); + } + + virtual Return flush() override { + return mParent->flush(); + } + + virtual Return close() override { + return mParent->close(); + } + + private: + sp mParent; + }; }; } // namespace implementation diff --git a/camera/device/3.2/default/CameraDevice_3_2.h b/camera/device/3.2/default/CameraDevice_3_2.h index 4e8606757c..9534707bd0 100644 --- a/camera/device/3.2/default/CameraDevice_3_2.h +++ b/camera/device/3.2/default/CameraDevice_3_2.h @@ -80,7 +80,13 @@ struct CameraDevice : public ICameraDevice { Return dumpState(const ::android::hardware::hidl_handle& fd) override; /* End of Methods from ::android::hardware::camera::device::V3_2::ICameraDevice */ -private: +protected: + + // Overridden by child implementations for returning different versions of CameraDeviceSession + virtual sp createSession(camera3_device_t*, + const camera_metadata_t* deviceInfo, + const sp&); + const sp mModule; const std::string mCameraId; // const after ctor diff --git a/camera/device/3.3/default/Android.bp b/camera/device/3.3/default/Android.bp new file mode 100644 index 0000000000..b1e9b46d8f --- /dev/null +++ b/camera/device/3.3/default/Android.bp @@ -0,0 +1,30 @@ +cc_library_shared { + name: "camera.device@3.3-impl", + defaults: ["hidl_defaults"], + proprietary: true, + srcs: ["CameraDevice.cpp", + "CameraDeviceSession.cpp", + "convert.cpp"], + shared_libs: [ + "libhidlbase", + "libhidltransport", + "libutils", + "libcutils", + "camera.device@3.2-impl", + "android.hardware.camera.device@3.2", + "android.hardware.camera.device@3.3", + "android.hardware.camera.provider@2.4", + "android.hardware.graphics.mapper@2.0", + "liblog", + "libhardware", + "libcamera_metadata", + "libfmq" + ], + static_libs: [ + "android.hardware.camera.common@1.0-helper" + ], + export_include_dirs: ["."], + export_shared_lib_headers: [ + "libfmq", + ] +} diff --git a/camera/device/3.3/default/CameraDevice.cpp b/camera/device/3.3/default/CameraDevice.cpp new file mode 100644 index 0000000000..ce5e1de239 --- /dev/null +++ b/camera/device/3.3/default/CameraDevice.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (C) 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 "CamDev@3.3-impl" +#include + +#include +#include +#include "CameraDevice_3_3.h" +#include + +namespace android { +namespace hardware { +namespace camera { +namespace device { +namespace V3_3 { +namespace implementation { + +using ::android::hardware::camera::common::V1_0::Status; +using namespace ::android::hardware::camera::device; + +CameraDevice::CameraDevice( + sp module, const std::string& cameraId, + const SortedVector>& cameraDeviceNames) : + V3_2::implementation::CameraDevice(module, cameraId, cameraDeviceNames) { +} + +CameraDevice::~CameraDevice() { +} + +sp CameraDevice::createSession(camera3_device_t* device, + const camera_metadata_t* deviceInfo, + const sp& callback) { + sp session = new CameraDeviceSession(device, deviceInfo, callback); + IF_ALOGV() { + session->getInterface()->interfaceChain([]( + ::android::hardware::hidl_vec<::android::hardware::hidl_string> interfaceChain) { + ALOGV("Session interface chain:"); + for (auto iface : interfaceChain) { + ALOGV(" %s", iface.c_str()); + } + }); + } + return session; +} + +// End of methods from ::android::hardware::camera::device::V3_2::ICameraDevice. + +} // namespace implementation +} // namespace V3_3 +} // namespace device +} // namespace camera +} // namespace hardware +} // namespace android diff --git a/camera/device/3.3/default/CameraDeviceSession.cpp b/camera/device/3.3/default/CameraDeviceSession.cpp new file mode 100644 index 0000000000..f877895ebb --- /dev/null +++ b/camera/device/3.3/default/CameraDeviceSession.cpp @@ -0,0 +1,178 @@ +/* + * Copyright (C) 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 "CamDevSession@3.3-impl" +#include + +#include +#include +#include +#include +#include "CameraDeviceSession.h" + +namespace android { +namespace hardware { +namespace camera { +namespace device { +namespace V3_3 { +namespace implementation { + +CameraDeviceSession::CameraDeviceSession( + camera3_device_t* device, + const camera_metadata_t* deviceInfo, + const sp& callback) : + V3_2::implementation::CameraDeviceSession(device, deviceInfo, callback) { +} + +CameraDeviceSession::~CameraDeviceSession() { +} + +Return CameraDeviceSession::configureStreams_3_3( + const StreamConfiguration& requestedConfiguration, + ICameraDeviceSession::configureStreams_3_3_cb _hidl_cb) { + Status status = initStatus(); + HalStreamConfiguration outStreams; + + // hold the inflight lock for entire configureStreams scope since there must not be any + // inflight request/results during stream configuration. + Mutex::Autolock _l(mInflightLock); + if (!mInflightBuffers.empty()) { + ALOGE("%s: trying to configureStreams while there are still %zu inflight buffers!", + __FUNCTION__, mInflightBuffers.size()); + _hidl_cb(Status::INTERNAL_ERROR, outStreams); + return Void(); + } + + if (!mInflightAETriggerOverrides.empty()) { + ALOGE("%s: trying to configureStreams while there are still %zu inflight" + " trigger overrides!", __FUNCTION__, + mInflightAETriggerOverrides.size()); + _hidl_cb(Status::INTERNAL_ERROR, outStreams); + return Void(); + } + + if (!mInflightRawBoostPresent.empty()) { + ALOGE("%s: trying to configureStreams while there are still %zu inflight" + " boost overrides!", __FUNCTION__, + mInflightRawBoostPresent.size()); + _hidl_cb(Status::INTERNAL_ERROR, outStreams); + return Void(); + } + + if (status != Status::OK) { + _hidl_cb(status, outStreams); + return Void(); + } + + camera3_stream_configuration_t stream_list; + hidl_vec streams; + + stream_list.operation_mode = (uint32_t) requestedConfiguration.operationMode; + stream_list.num_streams = requestedConfiguration.streams.size(); + streams.resize(stream_list.num_streams); + stream_list.streams = streams.data(); + + for (uint32_t i = 0; i < stream_list.num_streams; i++) { + int id = requestedConfiguration.streams[i].id; + + if (mStreamMap.count(id) == 0) { + Camera3Stream stream; + V3_2::implementation::convertFromHidl(requestedConfiguration.streams[i], &stream); + mStreamMap[id] = stream; + mStreamMap[id].data_space = mapToLegacyDataspace( + mStreamMap[id].data_space); + mCirculatingBuffers.emplace(stream.mId, CirculatingBuffers{}); + } else { + // width/height/format must not change, but usage/rotation might need to change + if (mStreamMap[id].stream_type != + (int) requestedConfiguration.streams[i].streamType || + mStreamMap[id].width != requestedConfiguration.streams[i].width || + mStreamMap[id].height != requestedConfiguration.streams[i].height || + mStreamMap[id].format != (int) requestedConfiguration.streams[i].format || + mStreamMap[id].data_space != + mapToLegacyDataspace( static_cast ( + requestedConfiguration.streams[i].dataSpace))) { + ALOGE("%s: stream %d configuration changed!", __FUNCTION__, id); + _hidl_cb(Status::INTERNAL_ERROR, outStreams); + return Void(); + } + mStreamMap[id].rotation = (int) requestedConfiguration.streams[i].rotation; + mStreamMap[id].usage = (uint32_t) requestedConfiguration.streams[i].usage; + } + streams[i] = &mStreamMap[id]; + } + + ATRACE_BEGIN("camera3->configure_streams"); + status_t ret = mDevice->ops->configure_streams(mDevice, &stream_list); + ATRACE_END(); + + // In case Hal returns error most likely it was not able to release + // the corresponding resources of the deleted streams. + if (ret == OK) { + // delete unused streams, note we do this after adding new streams to ensure new stream + // will not have the same address as deleted stream, and HAL has a chance to reference + // the to be deleted stream in configure_streams call + for(auto it = mStreamMap.begin(); it != mStreamMap.end();) { + int id = it->first; + bool found = false; + for (const auto& stream : requestedConfiguration.streams) { + if (id == stream.id) { + found = true; + break; + } + } + if (!found) { + // Unmap all buffers of deleted stream + // in case the configuration call succeeds and HAL + // is able to release the corresponding resources too. + cleanupBuffersLocked(id); + it = mStreamMap.erase(it); + } else { + ++it; + } + } + + // Track video streams + mVideoStreamIds.clear(); + for (const auto& stream : requestedConfiguration.streams) { + if (stream.streamType == V3_2::StreamType::OUTPUT && + stream.usage & + graphics::common::V1_0::BufferUsage::VIDEO_ENCODER) { + mVideoStreamIds.push_back(stream.id); + } + } + mResultBatcher.setBatchedStreams(mVideoStreamIds); + } + + if (ret == -EINVAL) { + status = Status::ILLEGAL_ARGUMENT; + } else if (ret != OK) { + status = Status::INTERNAL_ERROR; + } else { + convertToHidl(stream_list, &outStreams); + mFirstRequest = true; + } + + _hidl_cb(status, outStreams); + return Void(); +} + +} // namespace implementation +} // namespace V3_3 +} // namespace device +} // namespace camera +} // namespace hardware +} // namespace android diff --git a/camera/device/3.3/default/CameraDeviceSession.h b/camera/device/3.3/default/CameraDeviceSession.h new file mode 100644 index 0000000000..dd52b35b8e --- /dev/null +++ b/camera/device/3.3/default/CameraDeviceSession.h @@ -0,0 +1,138 @@ +/* + * Copyright (C) 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. + */ + +#ifndef ANDROID_HARDWARE_CAMERA_DEVICE_V3_3_CAMERADEVICE3SESSION_H +#define ANDROID_HARDWARE_CAMERA_DEVICE_V3_3_CAMERADEVICE3SESSION_H + +#include +#include +#include <../../3.2/default/CameraDeviceSession.h> +#include +#include +#include +#include +#include +#include +#include +#include "CameraMetadata.h" +#include "HandleImporter.h" +#include "hardware/camera3.h" +#include "hardware/camera_common.h" +#include "utils/Mutex.h" + +namespace android { +namespace hardware { +namespace camera { +namespace device { +namespace V3_3 { +namespace implementation { + +using namespace ::android::hardware::camera::device; +using ::android::hardware::camera::device::V3_2::CaptureRequest; +using ::android::hardware::camera::device::V3_2::StreamConfiguration; +using ::android::hardware::camera::device::V3_3::HalStreamConfiguration; +using ::android::hardware::camera::device::V3_3::ICameraDeviceSession; +using ::android::hardware::camera::common::V1_0::Status; +using ::android::hardware::camera::common::V1_0::helper::HandleImporter; +using ::android::hardware::kSynchronizedReadWrite; +using ::android::hardware::MessageQueue; +using ::android::hardware::MQDescriptorSync; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::hardware::hidl_vec; +using ::android::hardware::hidl_string; +using ::android::sp; +using ::android::Mutex; + +struct CameraDeviceSession : public V3_2::implementation::CameraDeviceSession { + + CameraDeviceSession(camera3_device_t*, + const camera_metadata_t* deviceInfo, + const sp&); + virtual ~CameraDeviceSession(); + + virtual sp getInterface() override { + return new TrampolineSessionInterface_3_3(this); + } + +protected: + // Methods from v3.2 and earlier will trampoline to inherited implementation + + // New methods for v3.3 + + Return configureStreams_3_3( + const StreamConfiguration& requestedConfiguration, + ICameraDeviceSession::configureStreams_3_3_cb _hidl_cb); +private: + + struct TrampolineSessionInterface_3_3 : public ICameraDeviceSession { + TrampolineSessionInterface_3_3(sp parent) : + mParent(parent) {} + + virtual Return constructDefaultRequestSettings( + V3_2::RequestTemplate type, + V3_3::ICameraDeviceSession::constructDefaultRequestSettings_cb _hidl_cb) override { + return mParent->constructDefaultRequestSettings(type, _hidl_cb); + } + + virtual Return configureStreams( + const V3_2::StreamConfiguration& requestedConfiguration, + V3_3::ICameraDeviceSession::configureStreams_cb _hidl_cb) override { + return mParent->configureStreams(requestedConfiguration, _hidl_cb); + } + + virtual Return processCaptureRequest(const hidl_vec& requests, + const hidl_vec& cachesToRemove, + V3_3::ICameraDeviceSession::processCaptureRequest_cb _hidl_cb) override { + return mParent->processCaptureRequest(requests, cachesToRemove, _hidl_cb); + } + + virtual Return getCaptureRequestMetadataQueue( + V3_3::ICameraDeviceSession::getCaptureRequestMetadataQueue_cb _hidl_cb) override { + return mParent->getCaptureRequestMetadataQueue(_hidl_cb); + } + + virtual Return getCaptureResultMetadataQueue( + V3_3::ICameraDeviceSession::getCaptureResultMetadataQueue_cb _hidl_cb) override { + return mParent->getCaptureResultMetadataQueue(_hidl_cb); + } + + virtual Return flush() override { + return mParent->flush(); + } + + virtual Return close() override { + return mParent->close(); + } + + virtual Return configureStreams_3_3( + const StreamConfiguration& requestedConfiguration, configureStreams_3_3_cb _hidl_cb) override { + return mParent->configureStreams_3_3(requestedConfiguration, _hidl_cb); + } + + private: + sp mParent; + }; +}; + +} // namespace implementation +} // namespace V3_3 +} // namespace device +} // namespace camera +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_CAMERA_DEVICE_V3_3_CAMERADEVICE3SESSION_H diff --git a/camera/device/3.3/default/CameraDevice_3_3.h b/camera/device/3.3/default/CameraDevice_3_3.h new file mode 100644 index 0000000000..18b3fe8e81 --- /dev/null +++ b/camera/device/3.3/default/CameraDevice_3_3.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 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. + */ + +#ifndef ANDROID_HARDWARE_CAMERA_DEVICE_V3_3_CAMERADEVICE_H +#define ANDROID_HARDWARE_CAMERA_DEVICE_V3_3_CAMERADEVICE_H + +#include "utils/Mutex.h" +#include "CameraModule.h" +#include "CameraMetadata.h" +#include "CameraDeviceSession.h" +#include <../../3.2/default/CameraDevice_3_2.h> + +#include +#include +#include + +namespace android { +namespace hardware { +namespace camera { +namespace device { +namespace V3_3 { +namespace implementation { + +using namespace ::android::hardware::camera::device; +using ::android::hardware::camera::common::V1_0::helper::CameraModule; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::hardware::hidl_vec; +using ::android::hardware::hidl_string; +using ::android::sp; + +/* + * The camera device HAL implementation is opened lazily (via the open call) + */ +struct CameraDevice : public V3_2::implementation::CameraDevice { + + // Called by provider HAL. + // Provider HAL must ensure the uniqueness of CameraDevice object per cameraId, or there could + // be multiple CameraDevice trying to access the same physical camera. Also, provider will have + // to keep track of all CameraDevice objects in order to notify CameraDevice when the underlying + // camera is detached. + // Delegates nearly all work to CameraDevice_3_2 + CameraDevice(sp module, + const std::string& cameraId, + const SortedVector>& cameraDeviceNames); + ~CameraDevice(); + +protected: + virtual sp createSession(camera3_device_t*, + const camera_metadata_t* deviceInfo, + const sp&) override; + +}; + +} // namespace implementation +} // namespace V3_3 +} // namespace device +} // namespace camera +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_CAMERA_DEVICE_V3_3_CAMERADEVICE_H diff --git a/camera/device/3.3/default/OWNERS b/camera/device/3.3/default/OWNERS new file mode 100644 index 0000000000..18acfee145 --- /dev/null +++ b/camera/device/3.3/default/OWNERS @@ -0,0 +1,6 @@ +cychen@google.com +epeev@google.com +etalvala@google.com +shuzhenwang@google.com +yinchiayeh@google.com +zhijunhe@google.com diff --git a/camera/device/3.3/default/convert.cpp b/camera/device/3.3/default/convert.cpp new file mode 100644 index 0000000000..dae190b03c --- /dev/null +++ b/camera/device/3.3/default/convert.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (C) 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 "android.hardware.camera.device@3.3-convert-impl" +#include + +#include "include/convert.h" + +namespace android { +namespace hardware { +namespace camera { +namespace device { +namespace V3_3 { +namespace implementation { + +using ::android::hardware::graphics::common::V1_0::Dataspace; +using ::android::hardware::graphics::common::V1_0::PixelFormat; +using ::android::hardware::camera::device::V3_2::BufferUsageFlags; + +void convertToHidl(const Camera3Stream* src, HalStream* dst) { + dst->overrideDataSpace = src->data_space; + dst->v3_2.id = src->mId; + dst->v3_2.overrideFormat = (PixelFormat) src->format; + dst->v3_2.maxBuffers = src->max_buffers; + if (src->stream_type == CAMERA3_STREAM_OUTPUT) { + dst->v3_2.consumerUsage = (BufferUsageFlags)0; + dst->v3_2.producerUsage = (BufferUsageFlags)src->usage; + } else if (src->stream_type == CAMERA3_STREAM_INPUT) { + dst->v3_2.producerUsage = (BufferUsageFlags)0; + dst->v3_2.consumerUsage = (BufferUsageFlags)src->usage; + } else { + //Should not reach here per current HIDL spec, but we might end up adding + // bi-directional stream to HIDL. + ALOGW("%s: Stream type %d is not currently supported!", + __FUNCTION__, src->stream_type); + } +} + +void convertToHidl(const camera3_stream_configuration_t& src, HalStreamConfiguration* dst) { + dst->streams.resize(src.num_streams); + for (uint32_t i = 0; i < src.num_streams; i++) { + convertToHidl(static_cast(src.streams[i]), &dst->streams[i]); + } + return; +} + +} // namespace implementation +} // namespace V3_3 +} // namespace device +} // namespace camera +} // namespace hardware +} // namespace android diff --git a/camera/device/3.3/default/include/convert.h b/camera/device/3.3/default/include/convert.h new file mode 100644 index 0000000000..23bb79796c --- /dev/null +++ b/camera/device/3.3/default/include/convert.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 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. + */ + +#ifndef HARDWARE_INTERFACES_CAMERA_DEVICE_V3_3_DEFAULT_INCLUDE_CONVERT_H_ + +#define HARDWARE_INTERFACES_CAMERA_DEVICE_V3_3_DEFAULT_INCLUDE_CONVERT_H_ + +#include + + +#include +#include +#include "hardware/camera3.h" +#include "../../3.2/default/include/convert.h" + +namespace android { +namespace hardware { +namespace camera { +namespace device { +namespace V3_3 { +namespace implementation { + +using ::android::hardware::camera::device::V3_2::implementation::Camera3Stream; + +void convertToHidl(const Camera3Stream* src, HalStream* dst); + +void convertToHidl(const camera3_stream_configuration_t& src, HalStreamConfiguration* dst); + +} // namespace implementation +} // namespace V3_3 +} // namespace device +} // namespace camera +} // namespace hardware +} // namespace android + +#endif // HARDWARE_INTERFACES_CAMERA_DEVICE_V3_3_DEFAULT_INCLUDE_CONVERT_H_ diff --git a/camera/provider/2.4/default/Android.bp b/camera/provider/2.4/default/Android.bp index f2a2d2e71e..c0b35912f7 100644 --- a/camera/provider/2.4/default/Android.bp +++ b/camera/provider/2.4/default/Android.bp @@ -11,8 +11,10 @@ cc_library_shared { "libcutils", "android.hardware.camera.device@1.0", "android.hardware.camera.device@3.2", + "android.hardware.camera.device@3.3", "camera.device@1.0-impl", "camera.device@3.2-impl", + "camera.device@3.3-impl", "android.hardware.camera.provider@2.4", "android.hardware.camera.common@1.0", "android.hardware.graphics.mapper@2.0", @@ -43,6 +45,7 @@ cc_binary { "libutils", "android.hardware.camera.device@1.0", "android.hardware.camera.device@3.2", + "android.hardware.camera.device@3.3", "android.hardware.camera.provider@2.4", "android.hardware.camera.common@1.0", ], diff --git a/camera/provider/2.4/default/CameraProvider.cpp b/camera/provider/2.4/default/CameraProvider.cpp index 19f7bdd7b2..d50168a20b 100644 --- a/camera/provider/2.4/default/CameraProvider.cpp +++ b/camera/provider/2.4/default/CameraProvider.cpp @@ -15,11 +15,13 @@ */ #define LOG_TAG "CamProvider@2.4-impl" +//#define LOG_NDEBUG 0 #include #include "CameraProvider.h" #include "CameraDevice_1_0.h" -#include "CameraDevice_3_2.h" +#include "CameraDevice_3_3.h" +#include #include #include @@ -36,6 +38,7 @@ const char *kLegacyProviderName = "legacy/0"; // "device@/legacy/" const std::regex kDeviceNameRE("device@([0-9]+\\.[0-9]+)/legacy/(.+)"); const char *kHAL3_2 = "3.2"; +const char *kHAL3_3 = "3.3"; const char *kHAL1_0 = "1.0"; const int kMaxCameraDeviceNameLen = 128; const int kMaxCameraIdLen = 16; @@ -140,8 +143,9 @@ int CameraProvider::getCameraDeviceVersion(const hidl_string& deviceName) { if (!match) { return -1; } - if (deviceVersion == kHAL3_2) { - // maybe switched to 3.4 or define the hidl version enum later + if (deviceVersion == kHAL3_3) { + return CAMERA_DEVICE_API_VERSION_3_3; + } else if (deviceVersion == kHAL3_2) { return CAMERA_DEVICE_API_VERSION_3_2; } else if (deviceVersion == kHAL1_0) { return CAMERA_DEVICE_API_VERSION_1_0; @@ -158,10 +162,12 @@ std::string CameraProvider::getHidlDeviceName( deviceVersion != CAMERA_DEVICE_API_VERSION_3_4 ) { return hidl_string(""); } - const char* versionStr = (deviceVersion == CAMERA_DEVICE_API_VERSION_1_0) ? kHAL1_0 : kHAL3_2; + bool isV1 = deviceVersion == CAMERA_DEVICE_API_VERSION_1_0; + int versionMajor = isV1 ? 1 : 3; + int versionMinor = isV1 ? 0 : mPreferredHal3MinorVersion; char deviceName[kMaxCameraDeviceNameLen]; - snprintf(deviceName, sizeof(deviceName), "device@%s/legacy/%s", - versionStr, cameraId.c_str()); + snprintf(deviceName, sizeof(deviceName), "device@%d.%d/legacy/%s", + versionMajor, versionMinor, cameraId.c_str()); return deviceName; } @@ -205,6 +211,19 @@ bool CameraProvider::initialize() { return true; } + mPreferredHal3MinorVersion = property_get_int32("ro.camera.wrapper.hal3TrebleMinorVersion", 3); + ALOGV("Preferred HAL 3 minor version is %d", mPreferredHal3MinorVersion); + switch(mPreferredHal3MinorVersion) { + case 2: + case 3: + // OK + break; + default: + ALOGW("Unknown minor camera device HAL version %d in property " + "'camera.wrapper.hal3TrebleMinorVersion', defaulting to 3", mPreferredHal3MinorVersion); + mPreferredHal3MinorVersion = 3; + } + mNumberOfLegacyCameras = mModule->getNumberOfCameras(); for (int i = 0; i < mNumberOfLegacyCameras; i++) { struct camera_info info; @@ -461,23 +480,45 @@ Return CameraProvider::getCameraDeviceInterface_V3_x( return Void(); } - sp device = - new android::hardware::camera::device::V3_2::implementation::CameraDevice( + // Since some Treble HAL revisions can map to the same legacy HAL version(s), we default + // to the newest possible Treble HAL revision, but allow for override if needed via + // system property. + sp device; + switch (mPreferredHal3MinorVersion) { + case 2: { // Map legacy camera device v3 HAL to Treble camera device HAL v3.2 + ALOGV("Constructing v3.2 camera device"); + sp deviceImpl = + new android::hardware::camera::device::V3_2::implementation::CameraDevice( mModule, cameraId, mCameraDeviceNames); - - if (device == nullptr) { - ALOGE("%s: cannot allocate camera device for id %s", __FUNCTION__, cameraId.c_str()); - _hidl_cb(Status::INTERNAL_ERROR, nullptr); - return Void(); + if (deviceImpl == nullptr || deviceImpl->isInitFailed()) { + ALOGE("%s: camera device %s init failed!", __FUNCTION__, cameraId.c_str()); + device = nullptr; + _hidl_cb(Status::INTERNAL_ERROR, nullptr); + return Void(); + } + device = deviceImpl; + break; + } + case 3: { // Map legacy camera device v3 HAL to Treble camera device HAL v3.3 + ALOGV("Constructing v3.3 camera device"); + sp deviceImpl = + new android::hardware::camera::device::V3_3::implementation::CameraDevice( + mModule, cameraId, mCameraDeviceNames); + if (deviceImpl == nullptr || deviceImpl->isInitFailed()) { + ALOGE("%s: camera device %s init failed!", __FUNCTION__, cameraId.c_str()); + device = nullptr; + _hidl_cb(Status::INTERNAL_ERROR, nullptr); + return Void(); + } + device = deviceImpl; + break; + } + default: + ALOGE("%s: Unknown HAL minor version %d!", __FUNCTION__, mPreferredHal3MinorVersion); + device = nullptr; + _hidl_cb(Status::INTERNAL_ERROR, nullptr); + return Void(); } - - if (device->isInitFailed()) { - ALOGE("%s: camera device %s init failed!", __FUNCTION__, cameraId.c_str()); - device = nullptr; - _hidl_cb(Status::INTERNAL_ERROR, nullptr); - return Void(); - } - _hidl_cb (Status::OK, device); return Void(); } diff --git a/camera/provider/2.4/default/CameraProvider.h b/camera/provider/2.4/default/CameraProvider.h index 75971fa3a0..4980711bcf 100644 --- a/camera/provider/2.4/default/CameraProvider.h +++ b/camera/provider/2.4/default/CameraProvider.h @@ -82,6 +82,8 @@ private: // (cameraId string, hidl device name) pairs SortedVector> mCameraDeviceNames; + int mPreferredHal3MinorVersion; + // Must be queried before using any APIs. // APIs will only work when this returns true bool mInitFailed; @@ -91,13 +93,13 @@ private: bool setUpVendorTags(); int checkCameraVersion(int id, camera_info info); + // create HIDL device name from camera ID and legacy device version + std::string getHidlDeviceName(std::string cameraId, int deviceVersion); + // extract legacy camera ID/device version from a HIDL device name static std::string getLegacyCameraId(const hidl_string& deviceName); static int getCameraDeviceVersion(const hidl_string& deviceName); - // create HIDL device name from camera ID and device version - static std::string getHidlDeviceName(std::string cameraId, int deviceVersion); - // convert conventional HAL status to HIDL Status static Status getHidlStatus(int); From ed95ab31e1916cb2a7ad51b1a004794490ce9b7a Mon Sep 17 00:00:00 2001 From: Pawin Vongmasa Date: Sat, 16 Sep 2017 06:44:58 -0700 Subject: [PATCH 223/265] Fix typos in IOmxStore.hal Test: make cts -j123 && cts-tradefed run cts-dev -m \ CtsMediaTestCases --compatibility:module-arg \ CtsMediaTestCases:include-annotation:\ android.platform.test.annotations.RequiresDevice Bug: 65719609 Bug: 65769027 Change-Id: I44d62cd5a8aa21d9fa816d5f0bf663e943a21bb5 --- current.txt | 1 + media/omx/1.0/IOmxStore.hal | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/current.txt b/current.txt index 5207c6aa05..52fbfd1527 100644 --- a/current.txt +++ b/current.txt @@ -245,5 +245,6 @@ a432d6d9200248dc2126827bcd6cdea31dd65eff39b939f64585d27d915a5857 android.hardwar 503da837d1a67cbdb7c08a033e927e5430ae1b159d98bf72c6336b4dcc5e76f5 android.hardware.cas.native@1.0::types 619600109232ed64b827c8a11beed8070b1827ae464547d7aa146cf0473b4bca android.hardware.cas.native@1.0::IDescrambler 0a159f81359cd4f71bbe00972ee8403ea79351fb7c0cd48be72ebb3e424dbaef android.hardware.radio@1.0::types +09342041e17c429fce0034b9096d17849122111436a5f0053e7e59500e1cb89c android.hardware.media.omx@1.0::IOmxStore f4945e397b5dea41bb64518dfde59be71245d8a125fd1e0acffeb57ac7b08fed android.hardware.thermal@1.1::IThermal c8bc853546dd55584611def2a9fa1d99f657e3366c976d2f60fe6b8aa6d2cb87 android.hardware.thermal@1.1::IThermalCallback diff --git a/media/omx/1.0/IOmxStore.hal b/media/omx/1.0/IOmxStore.hal index a224b0e16f..3ec053578a 100644 --- a/media/omx/1.0/IOmxStore.hal +++ b/media/omx/1.0/IOmxStore.hal @@ -39,7 +39,7 @@ interface IOmxStore { * string: arbitrary string * size: x * ratio: : - * range: - + * range: | - * list: | ,> */ struct Attribute { @@ -97,7 +97,7 @@ interface IOmxStore { * * Required node attributes for video nodes that are required by Android to * describe measured values for this device: - * key: 'measured-frame-rate---range', + * key: 'measured-frame-rate-x-range', * value-type: range; where width: num, height: num * * Optional node attributes for decoders to describe supported values: @@ -111,7 +111,7 @@ interface IOmxStore { * Optional node attributes for encoders to describe supported values: * key: 'complexity-default', value-type: num * key: 'complexity-range', value-type: range - * key: 'feature-bitrate-control', value-type: list> + * key: 'feature-bitrate-modes', value-type: list> * key: 'feature-intra-refresh', value-type: enum<0,1> * key: 'quality-default', value-type: num * key: 'quality-range', value-type: range From 0cf6b3df5ba7cb5bd56f88377401286f157cc7d9 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Thu, 24 Aug 2017 17:03:56 +0530 Subject: [PATCH 224/265] Signal eof flag for each input buffer As the client sends single frame worth of data for processing all the time, at the time of dispatch, signal eof flag for each buffer. Also code that was repititive and doesnt serve any need is removed. Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Host \ -l INFO Bug: 63796949 Change-Id: I530cbe69c27f5e4b1fae56ab808ef63107586275 --- .../VtsHalMediaOmxV1_0TargetAudioDecTest.cpp | 35 ++++-------- .../VtsHalMediaOmxV1_0TargetAudioEncTest.cpp | 27 ++-------- .../VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 35 ++++-------- .../VtsHalMediaOmxV1_0TargetVideoEncTest.cpp | 53 +++++-------------- 4 files changed, 35 insertions(+), 115 deletions(-) diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp index 8520757703..062bed4c09 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp @@ -628,39 +628,16 @@ void decodeNFrames(sp omxNode, sp observer, AudioDecHidlTest::standardComp comp, bool signalEOS = true) { android::hardware::media::omx::V1_0::Status status; Message msg; - - // dispatch output buffers - for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i); - } - // dispatch input buffers + size_t index; uint32_t flags = 0; int frameID = offset; - for (size_t i = 0; (i < iBuffer->size()) && (frameID < (int)Info->size()) && - (frameID < (offset + range)); - i++) { - char* ipBuffer = static_cast( - static_cast((*iBuffer)[i].mMemory->getPointer())); - ASSERT_LE((*Info)[frameID].bytesCount, - static_cast((*iBuffer)[i].mMemory->getSize())); - eleStream.read(ipBuffer, (*Info)[frameID].bytesCount); - ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount); - flags = (*Info)[frameID].flags; - if (signalEOS && ((frameID == (int)Info->size() - 1) || - (frameID == (offset + range - 1)))) - flags |= OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, i, (*Info)[frameID].bytesCount, - flags, (*Info)[frameID].timestamp); - frameID++; - } - int timeOut = TIMEOUT_COUNTER_Q; bool iQueued, oQueued; + while (1) { iQueued = oQueued = false; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); - // Port Reconfiguration if (status == android::hardware::media::omx::V1_0::Status::OK && msg.type == Message::Type::EVENT) { @@ -673,7 +650,6 @@ void decodeNFrames(sp omxNode, sp observer, if (frameID == (int)Info->size() || frameID == (offset + range)) break; // Dispatch input buffer - size_t index = 0; if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) { char* ipBuffer = static_cast( static_cast((*iBuffer)[index].mMemory->getPointer())); @@ -682,6 +658,11 @@ void decodeNFrames(sp omxNode, sp observer, eleStream.read(ipBuffer, (*Info)[frameID].bytesCount); ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount); flags = (*Info)[frameID].flags; + // Indicate to omx core that the buffer contains a full frame worth + // of data + flags |= OMX_BUFFERFLAG_ENDOFFRAME; + // Indicate the omx core that this is the last buffer it needs to + // process if (signalEOS && ((frameID == (int)Info->size() - 1) || (frameID == (offset + range - 1)))) flags |= OMX_BUFFERFLAG_EOS; @@ -691,10 +672,12 @@ void decodeNFrames(sp omxNode, sp observer, frameID++; iQueued = true; } + // Dispatch output buffer if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); oQueued = true; } + // Reset Counters when either input or output buffer is dispatched if (iQueued || oQueued) timeOut = TIMEOUT_COUNTER_Q; else diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp index 038830dc2e..278e196299 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp @@ -376,44 +376,25 @@ void encodeNFrames(sp omxNode, sp observer, bool signalEOS = true) { android::hardware::media::omx::V1_0::Status status; Message msg; - - // dispatch output buffers - for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i); - } - // dispatch input buffers + size_t index; int bytesCount = samplesPerFrame * nChannels * 2; int32_t timestampIncr = (int)(((float)samplesPerFrame / nSampleRate) * 1000000); uint64_t timestamp = 0; uint32_t flags = 0; - for (size_t i = 0; i < iBuffer->size() && nFrames != 0; i++) { - char* ipBuffer = static_cast( - static_cast((*iBuffer)[i].mMemory->getPointer())); - ASSERT_LE(bytesCount, - static_cast((*iBuffer)[i].mMemory->getSize())); - eleStream.read(ipBuffer, bytesCount); - if (eleStream.gcount() != bytesCount) break; - if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, i, bytesCount, flags, timestamp); - timestamp += timestampIncr; - nFrames--; - } - int timeOut = TIMEOUT_COUNTER_Q; bool iQueued, oQueued; + while (1) { iQueued = oQueued = false; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); - if (status == android::hardware::media::omx::V1_0::Status::OK) ASSERT_TRUE(false); if (nFrames == 0) break; // Dispatch input buffer - size_t index = 0; if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) { char* ipBuffer = static_cast( static_cast((*iBuffer)[index].mMemory->getPointer())); @@ -421,7 +402,8 @@ void encodeNFrames(sp omxNode, sp observer, static_cast((*iBuffer)[index].mMemory->getSize())); eleStream.read(ipBuffer, bytesCount); if (eleStream.gcount() != bytesCount) break; - if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; + flags = OMX_BUFFERFLAG_ENDOFFRAME; + if (signalEOS && (nFrames == 1)) flags |= OMX_BUFFERFLAG_EOS; dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, flags, timestamp); timestamp += timestampIncr; @@ -433,6 +415,7 @@ void encodeNFrames(sp omxNode, sp observer, dispatchOutputBuffer(omxNode, oBuffer, index); oQueued = true; } + // Reset Counters when either input or output buffer is dispatched if (iQueued || oQueued) timeOut = TIMEOUT_COUNTER_Q; else diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index a5b5524b80..6c588dd02f 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -674,39 +674,16 @@ void decodeNFrames(sp omxNode, sp observer, bool signalEOS = true) { android::hardware::media::omx::V1_0::Status status; Message msg; - - // dispatch output buffers - for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i, oPortMode); - } - // dispatch input buffers + size_t index; uint32_t flags = 0; int frameID = offset; - for (size_t i = 0; (i < iBuffer->size()) && (frameID < (int)Info->size()) && - (frameID < (offset + range)); - i++) { - char* ipBuffer = static_cast( - static_cast((*iBuffer)[i].mMemory->getPointer())); - ASSERT_LE((*Info)[frameID].bytesCount, - static_cast((*iBuffer)[i].mMemory->getSize())); - eleStream.read(ipBuffer, (*Info)[frameID].bytesCount); - ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount); - flags = (*Info)[frameID].flags; - if (signalEOS && ((frameID == (int)Info->size() - 1) || - (frameID == (offset + range - 1)))) - flags |= OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, i, (*Info)[frameID].bytesCount, - flags, (*Info)[frameID].timestamp); - frameID++; - } - int timeOut = TIMEOUT_COUNTER_Q; bool iQueued, oQueued; + while (1) { iQueued = oQueued = false; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); - // Port Reconfiguration if (status == android::hardware::media::omx::V1_0::Status::OK && msg.type == Message::Type::EVENT) { @@ -718,7 +695,6 @@ void decodeNFrames(sp omxNode, sp observer, if (frameID == (int)Info->size() || frameID == (offset + range)) break; // Dispatch input buffer - size_t index = 0; if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) { char* ipBuffer = static_cast( static_cast((*iBuffer)[index].mMemory->getPointer())); @@ -727,6 +703,11 @@ void decodeNFrames(sp omxNode, sp observer, eleStream.read(ipBuffer, (*Info)[frameID].bytesCount); ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount); flags = (*Info)[frameID].flags; + // Indicate to omx core that the buffer contains a full frame worth + // of data + flags |= OMX_BUFFERFLAG_ENDOFFRAME; + // Indicate the omx core that this is the last buffer it needs to + // process if (signalEOS && ((frameID == (int)Info->size() - 1) || (frameID == (offset + range - 1)))) flags |= OMX_BUFFERFLAG_EOS; @@ -736,10 +717,12 @@ void decodeNFrames(sp omxNode, sp observer, frameID++; iQueued = true; } + // Dispatch output buffer if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode); oQueued = true; } + // Reset Counters when either input or output buffer is dispatched if (iQueued || oQueued) timeOut = TIMEOUT_COUNTER_Q; else diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp index 23f051d8f0..74b995b9f7 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp @@ -983,58 +983,25 @@ void encodeNFrames(sp omxNode, sp observer, sp listener = nullptr) { android::hardware::media::omx::V1_0::Status status; Message msg; - uint32_t ipCount = 0; + uint64_t timestamp = 0; + uint32_t flags = 0; + int timeOut = TIMEOUT_COUNTER_Q; + bool iQueued, oQueued; + uint32_t ipCount = 0; if (ipCount == 0) { status = changeFrameRate(omxNode, portIndexOutput, (24U << 16)); if (status == ::android::hardware::media::omx::V1_0::Status::OK) xFramerate = (24U << 16); } - - // dispatch output buffers - for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i); - } - // dispatch input buffers int32_t timestampIncr = (int)((float)1000000 / (xFramerate >> 16)); - // timestamp scale = Nano sec - if (inputDataIsMeta) timestampIncr *= 1000; - uint64_t timestamp = 0; - uint32_t flags = 0; - for (size_t i = 0; i < iBuffer->size() && nFrames != 0; i++) { - if (inputDataIsMeta) { - if (listener->freeBuffers > listener->minUnDequeuedCount) { - if (dispatchGraphicBuffer(omxNode, producer, listener, iBuffer, - portIndexInput, eleStream, timestamp)) - break; - timestamp += timestampIncr; - nFrames--; - ipCount++; - } - } else { - char* ipBuffer = static_cast( - static_cast((*iBuffer)[i].mMemory->getPointer())); - ASSERT_LE(bytesCount, - static_cast((*iBuffer)[i].mMemory->getSize())); - if (fillByteBuffer(omxNode, ipBuffer, portIndexInput, eleStream)) - break; - if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, i, bytesCount, flags, - timestamp); - if (timestampUslist) timestampUslist->push_back(timestamp); - timestamp += timestampIncr; - nFrames--; - ipCount++; - } - } + if (inputDataIsMeta) timestampIncr *= 1000; // timestamp scale: Nano sec - int timeOut = TIMEOUT_COUNTER_Q; - bool iQueued, oQueued; while (1) { iQueued = oQueued = false; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); - + // Port Reconfiguration if (status == android::hardware::media::omx::V1_0::Status::OK) { ASSERT_EQ(msg.type, Message::Type::EVENT); if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { @@ -1076,7 +1043,8 @@ void encodeNFrames(sp omxNode, sp observer, if (fillByteBuffer(omxNode, ipBuffer, portIndexInput, eleStream)) break; - if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; + flags = OMX_BUFFERFLAG_ENDOFFRAME; + if (signalEOS && (nFrames == 1)) flags |= OMX_BUFFERFLAG_EOS; dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, flags, timestamp); if (timestampUslist) timestampUslist->push_back(timestamp); @@ -1086,10 +1054,12 @@ void encodeNFrames(sp omxNode, sp observer, iQueued = true; } } + // Dispatch output buffer if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); oQueued = true; } + // Reset Counters when either input or output buffer is dispatched if (iQueued || oQueued) timeOut = TIMEOUT_COUNTER_Q; else @@ -1098,6 +1068,7 @@ void encodeNFrames(sp omxNode, sp observer, EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite"; break; } + // Runtime Param Configuration if (ipCount == 15) { changeBitrate(omxNode, portIndexOutput, 768000); requestIDR(omxNode, portIndexOutput); From 3ca3988e4e2a20418339452cb4417740501d7bd0 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Wed, 23 Aug 2017 18:08:27 +0530 Subject: [PATCH 225/265] Add flush test 1. omx api allows flushing all ports at once by passing the argument OMX_ALL. This fixture tests the flush call with the arg OMX_ALL and expects behavior to be same as when the ports are individually flushed. 2. Flush a port that is not listed and the api call shall return with error code OMX_ErrorBadPortIndex 3. Test the behavior of flush API call when the component is not in Execute State (expects OMX_ErrorIncorrectStateOperation) Note: 2, 3 tests are disabled as of now Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Host \ -l INFO Bug: 63796949 Change-Id: I6f0cccea0c923116f7e41ed0ef7d8d584631256b --- .../VtsHalMediaOmxV1_0TargetComponentTest.cpp | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp index 2ec86b2adc..0dd3a61e9b 100644 --- a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp +++ b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp @@ -583,6 +583,109 @@ TEST_F(ComponentHidlTest, Flush) { kPortIndexInput, kPortIndexOutput); } +// Flush test - monkeying +TEST_F(ComponentHidlTest, Flush_M) { + description("Test Flush monkeying"); + if (disableTest) return; + android::hardware::media::omx::V1_0::Status status; + uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; + Message msg; + + status = setRole(omxNode, gEnv->getRole().c_str()); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + OMX_PORT_PARAM_TYPE params; + if (compClass == audio_decoder || compClass == audio_encoder) { + status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); + } else { + status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); + } + if (status == ::android::hardware::media::omx::V1_0::Status::OK) { + ASSERT_EQ(params.nPorts, 2U); + kPortIndexInput = params.nStartPortNumber; + kPortIndexOutput = kPortIndexInput + 1; + } + + android::Vector iBuffer, oBuffer; + + // set port mode + PortMode portMode[2]; + initPortMode(portMode, isSecure, compClass); + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // // Flush all ports ; receive error OMX_ErrorIncorrectStateOperation + // status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush), + // OMX_ALL); + // ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK); + + // set state to idle + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode); + + // // Flush all ports ; receive error OMX_ErrorIncorrectStateOperation + // status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush), + // OMX_ALL); + // ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK); + + // set state to executing + changeStateIdletoExecute(omxNode, observer); + // dispatch buffers + for (size_t i = 0; i < oBuffer.size(); i++) { + dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1]); + } + + // // flush invalid port, expecting OMX_ErrorBadPortIndex + // status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush), + // RANDOM_INDEX); + // ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK); + + // Flush all ports + status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush), OMX_ALL); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + + for (int j = 0; j < 2; j++) { + status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_PE, &iBuffer, + &oBuffer); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(msg.type, Message::Type::EVENT); + ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete); + ASSERT_EQ(msg.data.eventData.data1, OMX_CommandFlush); + if (msg.data.eventData.data2 == kPortIndexInput) { + // test if client got all its buffers back + for (size_t i = 0; i < iBuffer.size(); ++i) { + EXPECT_EQ(iBuffer[i].owner, client); + } + } else if (msg.data.eventData.data2 == kPortIndexOutput) { + // test if client got all its buffers back + for (size_t i = 0; i < oBuffer.size(); ++i) { + EXPECT_EQ(oBuffer[i].owner, client); + } + } else { + EXPECT_TRUE(false) << "Bad port Index"; + } + } + + // SPECIAL CASE: When OMX_ALL is used as argument, Android OMX Core sends + // an additional flush event with argument OMX_ALL. This we believe is + // not recognized by OMX-IL Spec. So read this event and ignore it + status = + observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_PE, &iBuffer, &oBuffer); + if (status == android::hardware::media::omx::V1_0::Status::OK) { + ASSERT_EQ(msg.type, Message::Type::EVENT); + ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete); + ASSERT_EQ(msg.data.eventData.data1, OMX_CommandFlush); + ASSERT_EQ(msg.data.eventData.data2, OMX_ALL); + } + + // set state to idle + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + // set state to loaded + changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput); +} + // test port mode configuration when the component is in various states TEST_F(ComponentHidlTest, PortModeConfig) { description("Test Port Mode Configuration"); From 05f81e4d07383933cc6803796f2d19ab80dce3b3 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Wed, 28 Jun 2017 18:20:03 +0530 Subject: [PATCH 226/265] Add adaptive playback test Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Host \ -l INFO Bug: 63796949 Change-Id: I96f19946edb9a333776a60fa2c159dad67801b27 --- .../common/media_hidl_test_common.h | 1 + .../VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 198 ++++++++++++++++-- media/res/bbb_avc_176x144_300kbps_60fps.h264 | Bin 0 -> 37899 bytes media/res/bbb_avc_176x144_300kbps_60fps.info | 62 ++++++ media/res/bbb_hevc_176x144_176kbps_60fps.hevc | Bin 0 -> 20503 bytes media/res/bbb_hevc_176x144_176kbps_60fps.info | 61 ++++++ media/res/bbb_mpeg2_352x288_1mbps_60fps.info | 60 ++++++ media/res/bbb_mpeg2_352x288_1mbps_60fps.m2v | Bin 0 -> 123976 bytes media/res/bbb_vp8_176x144_240kbps_60fps.info | 60 ++++++ media/res/bbb_vp8_176x144_240kbps_60fps.vp8 | Bin 0 -> 28992 bytes media/res/bbb_vp9_176x144_285kbps_60fps.info | 60 ++++++ media/res/bbb_vp9_176x144_285kbps_60fps.vp9 | Bin 0 -> 34848 bytes 12 files changed, 480 insertions(+), 22 deletions(-) create mode 100644 media/res/bbb_avc_176x144_300kbps_60fps.h264 create mode 100644 media/res/bbb_avc_176x144_300kbps_60fps.info create mode 100644 media/res/bbb_hevc_176x144_176kbps_60fps.hevc create mode 100644 media/res/bbb_hevc_176x144_176kbps_60fps.info create mode 100644 media/res/bbb_mpeg2_352x288_1mbps_60fps.info create mode 100644 media/res/bbb_mpeg2_352x288_1mbps_60fps.m2v create mode 100644 media/res/bbb_vp8_176x144_240kbps_60fps.info create mode 100644 media/res/bbb_vp8_176x144_240kbps_60fps.vp8 create mode 100644 media/res/bbb_vp9_176x144_285kbps_60fps.info create mode 100644 media/res/bbb_vp9_176x144_285kbps_60fps.vp9 diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h index 94a0194db9..71012b3b21 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h @@ -133,6 +133,7 @@ struct CodecObserver : public IOmxObserver { if (it->type == android::hardware::media::omx::V1_0::Message::Type::EVENT) { *msg = *it; + if (callBack) callBack(*it, nullptr); it = msgQueue.erase(it); // OMX_EventBufferFlag event is sent when the component has // processed a buffer with its EOS flag set. This event is diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index a5b5524b80..fb02cd4615 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -219,6 +219,7 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { timestampUs = 0; timestampDevTest = false; isSecure = false; + portSettingsChange = false; size_t suffixLen = strlen(".secure"); if (strlen(gEnv->getComponent().c_str()) >= suffixLen) { isSecure = @@ -295,6 +296,13 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { } #endif } + } else if (msg.type == Message::Type::EVENT) { + if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { + if ((msg.data.eventData.data2 == OMX_IndexParamPortDefinition || + msg.data.eventData.data2 == 0)) { + portSettingsChange = true; + } + } } } @@ -322,6 +330,7 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { ::android::List timestampUslist; bool timestampDevTest; bool isSecure; + bool portSettingsChange; protected: static void description(const std::string& description) { @@ -369,41 +378,56 @@ void getInputChannelInfo(sp omxNode, OMX_U32 kPortIndexInput, } } +// number of elementary streams per component +#define STREAM_COUNT 2 // LookUpTable of clips and metadata for component testing void GetURLForComponent(VideoDecHidlTest::standardComp comp, char* mURL, - char* info) { + char* info, size_t streamIndex = 1) { struct CompToURL { VideoDecHidlTest::standardComp comp; - const char* mURL; - const char* info; + const char mURL[STREAM_COUNT][512]; + const char info[STREAM_COUNT][512]; }; + ASSERT_TRUE(streamIndex < STREAM_COUNT); + static const CompToURL kCompToURL[] = { {VideoDecHidlTest::standardComp::avc, - "bbb_avc_1920x1080_5000kbps_30fps.h264", - "bbb_avc_1920x1080_5000kbps_30fps.info"}, + {"bbb_avc_176x144_300kbps_60fps.h264", + "bbb_avc_1920x1080_5000kbps_30fps.h264"}, + {"bbb_avc_176x144_300kbps_60fps.info", + "bbb_avc_1920x1080_5000kbps_30fps.info"}}, {VideoDecHidlTest::standardComp::hevc, - "bbb_hevc_640x360_1600kbps_30fps.hevc", - "bbb_hevc_640x360_1600kbps_30fps.info"}, + {"bbb_hevc_176x144_176kbps_60fps.hevc", + "bbb_hevc_640x360_1600kbps_30fps.hevc"}, + {"bbb_hevc_176x144_176kbps_60fps.info", + "bbb_hevc_640x360_1600kbps_30fps.info"}}, {VideoDecHidlTest::standardComp::mpeg2, - "bbb_mpeg2_176x144_105kbps_25fps.m2v", - "bbb_mpeg2_176x144_105kbps_25fps.info"}, + {"bbb_mpeg2_176x144_105kbps_25fps.m2v", + "bbb_mpeg2_352x288_1mbps_60fps.m2v"}, + {"bbb_mpeg2_176x144_105kbps_25fps.info", + "bbb_mpeg2_352x288_1mbps_60fps.info"}}, {VideoDecHidlTest::standardComp::h263, - "bbb_h263_352x288_300kbps_12fps.h263", - "bbb_h263_352x288_300kbps_12fps.info"}, + {"", "bbb_h263_352x288_300kbps_12fps.h263"}, + {"", "bbb_h263_352x288_300kbps_12fps.info"}}, {VideoDecHidlTest::standardComp::mpeg4, - "bbb_mpeg4_1280x720_1000kbps_25fps.m4v", - "bbb_mpeg4_1280x720_1000kbps_25fps.info"}, - {VideoDecHidlTest::standardComp::vp8, "bbb_vp8_640x360_2mbps_30fps.vp8", - "bbb_vp8_640x360_2mbps_30fps.info"}, + {"", "bbb_mpeg4_1280x720_1000kbps_25fps.m4v"}, + {"", "bbb_mpeg4_1280x720_1000kbps_25fps.info"}}, + {VideoDecHidlTest::standardComp::vp8, + {"bbb_vp8_176x144_240kbps_60fps.vp8", + "bbb_vp8_640x360_2mbps_30fps.vp8"}, + {"bbb_vp8_176x144_240kbps_60fps.info", + "bbb_vp8_640x360_2mbps_30fps.info"}}, {VideoDecHidlTest::standardComp::vp9, - "bbb_vp9_640x360_1600kbps_30fps.vp9", - "bbb_vp9_640x360_1600kbps_30fps.info"}, + {"bbb_vp9_176x144_285kbps_60fps.vp9", + "bbb_vp9_640x360_1600kbps_30fps.vp9"}, + {"bbb_vp9_176x144_285kbps_60fps.info", + "bbb_vp9_640x360_1600kbps_30fps.info"}}, }; for (size_t i = 0; i < sizeof(kCompToURL) / sizeof(kCompToURL[0]); ++i) { if (kCompToURL[i].comp == comp) { - strcat(mURL, kCompToURL[i].mURL); - strcat(info, kCompToURL[i].info); + strcat(mURL, kCompToURL[i].mURL[streamIndex]); + strcat(info, kCompToURL[i].info[streamIndex]); return; } } @@ -972,9 +996,6 @@ TEST_F(VideoDecHidlTest, DecodeTest) { setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); - // disabling adaptive playback. - omxNode->prepareForAdaptivePlayback(kPortIndexOutput, false, 1920, 1080); - android::Vector iBuffer, oBuffer; // set state to idle @@ -1015,6 +1036,139 @@ TEST_F(VideoDecHidlTest, DecodeTest) { kPortIndexInput, kPortIndexOutput); } +// Test for adaptive playback support +TEST_F(VideoDecHidlTest, AdaptivePlaybackTest) { + description("Tests for Adaptive Playback support"); + if (disableTest) return; + if (!(compName == avc || compName == hevc || compName == vp8 || + compName == vp9 || compName == mpeg2)) + return; + android::hardware::media::omx::V1_0::Status status; + uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; + status = setRole(omxNode, gEnv->getRole().c_str()); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + OMX_PORT_PARAM_TYPE params; + status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); + if (status == ::android::hardware::media::omx::V1_0::Status::OK) { + ASSERT_EQ(params.nPorts, 2U); + kPortIndexInput = params.nStartPortNumber; + kPortIndexOutput = kPortIndexInput + 1; + } + + // set port mode + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // prepare for adaptive playback + uint32_t adaptiveMaxWidth = 320; + uint32_t adaptiveMaxHeight = 240; + status = omxNode->prepareForAdaptivePlayback( + kPortIndexOutput, true, adaptiveMaxWidth, adaptiveMaxHeight); + if (strncmp(gEnv->getComponent().c_str(), "OMX.google.", 11) == 0) { + // SoftOMX Decoders donot support graphic buffer modes. So for them + // support for adaptive play back is mandatory in Byte Buffer mode + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + } else { + return; + } + + // TODO: Handle this better !!! + // Without the knowledge of the maximum resolution of the frame to be + // decoded it is not possible to choose the size of the input buffer. + // The value below is based on the info. files of clips in res folder. + status = setPortBufferSize(omxNode, kPortIndexInput, 482304); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // set Port Params + uint32_t nFrameWidth, nFrameHeight, xFramerate; + getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, + &xFramerate); + // get default color format + OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; + getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], + &eColorFormat); + ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); + status = + setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, xFramerate); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); + + android::Vector iBuffer, oBuffer; + + // set state to idle + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode); + // set state to executing + changeStateIdletoExecute(omxNode, observer); + + timestampDevTest = true; + uint32_t timestampOffset = 0; + for (uint32_t i = 0; i < STREAM_COUNT * 2; i++) { + std::ifstream eleStream, eleInfo; + char mURL[512], info[512]; + android::Vector Info; + strcpy(mURL, gEnv->getRes().c_str()); + strcpy(info, gEnv->getRes().c_str()); + GetURLForComponent(compName, mURL, info, i % STREAM_COUNT); + eleInfo.open(info); + ASSERT_EQ(eleInfo.is_open(), true); + int bytesCount = 0; + uint32_t flags = 0; + uint32_t timestamp = 0; + uint32_t timestampMax = 0; + while (1) { + if (!(eleInfo >> bytesCount)) break; + eleInfo >> flags; + eleInfo >> timestamp; + timestamp += timestampOffset; + Info.push_back({bytesCount, flags, timestamp}); + if (timestampDevTest && (flags != OMX_BUFFERFLAG_CODECCONFIG)) + timestampUslist.push_back(timestamp); + if (timestampMax < timestamp) timestampMax = timestamp; + } + timestampOffset = timestampMax; + eleInfo.close(); + + // Port Reconfiguration + eleStream.open(mURL, std::ifstream::binary); + ASSERT_EQ(eleStream.is_open(), true); + decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(), + portMode[1], false); + eleStream.close(); + + getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, + &nFrameHeight, &xFramerate); + if ((nFrameWidth > adaptiveMaxWidth) || + (nFrameHeight > adaptiveMaxHeight)) { + if (nFrameWidth > adaptiveMaxWidth) adaptiveMaxWidth = nFrameWidth; + if (nFrameHeight > adaptiveMaxHeight) + adaptiveMaxHeight = nFrameHeight; + EXPECT_TRUE(portSettingsChange); + } else { + // In DynamicANW Buffer mode, its ok to do a complete + // reconfiguration even if a partial reconfiguration is sufficient. + if (portMode[1] != PortMode::DYNAMIC_ANW_BUFFER) + EXPECT_FALSE(portSettingsChange); + } + portSettingsChange = false; + } + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode[1]); + testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); + if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); + // set state to idle + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + // set state to executing + changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput); +} + // end of sequence test TEST_F(VideoDecHidlTest, EOSTest_M) { description("Test End of stream monkeying"); diff --git a/media/res/bbb_avc_176x144_300kbps_60fps.h264 b/media/res/bbb_avc_176x144_300kbps_60fps.h264 new file mode 100644 index 0000000000000000000000000000000000000000..da1e75dcd114610c2c70e613a8b30ac92a484568 GIT binary patch literal 37899 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 Bv_t>^ literal 0 HcmV?d00001 diff --git a/media/res/bbb_avc_176x144_300kbps_60fps.info b/media/res/bbb_avc_176x144_300kbps_60fps.info new file mode 100644 index 0000000000..d88b540ef4 --- /dev/null +++ b/media/res/bbb_avc_176x144_300kbps_60fps.info @@ -0,0 +1,62 @@ +28 128 0 +10 128 0 +4780 32 33333 +960 0 100000 +480 0 66666 +246 0 50000 +264 0 83333 +1160 0 166666 +404 0 133333 +237 0 116666 +193 0 150000 +936 0 233333 +384 0 200000 +199 0 183333 +275 0 216666 +1086 0 300000 +520 0 266666 +301 0 250000 +270 0 283333 +1232 0 366666 +559 0 333333 +287 0 316666 +274 0 350000 +1084 0 433333 +485 0 400000 +307 0 383333 +284 0 416666 +1052 0 500000 +504 0 466666 +298 0 450000 +327 0 483333 +1189 0 566666 +358 0 533333 +172 0 516666 +185 0 550000 +1115 0 633333 +463 0 600000 +218 0 583333 +255 0 616666 +1155 0 700000 +622 0 666666 +356 0 650000 +341 0 683333 +1240 0 766666 +610 0 733333 +341 0 716666 +380 0 750000 +1326 0 833333 +620 0 800000 +396 0 783333 +353 0 816666 +1196 0 900000 +623 0 866666 +375 0 850000 +362 0 883333 +1192 0 966666 +654 0 933333 +359 0 916666 +352 0 950000 +828 0 1016666 +436 0 983333 +401 0 1000000 diff --git a/media/res/bbb_hevc_176x144_176kbps_60fps.hevc b/media/res/bbb_hevc_176x144_176kbps_60fps.hevc new file mode 100644 index 0000000000000000000000000000000000000000..f82236f3a0dad20547f6562a14b225ace05df345 GIT binary patch literal 20503 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

-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 Date: Wed, 13 Sep 2017 15:28:46 +0530 Subject: [PATCH 227/265] Enable EOSTest_M test eostest_m was disabled during the time of o-release. This is enabled now. Also improved logging Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Host \ -l INFO Bug: 63796949 Change-Id: I4797fce4f5911d9f37f5c91f179d9ab9263177f0 --- .../VtsHalMediaOmxV1_0TargetAudioDecTest.cpp | 15 ++-- .../VtsHalMediaOmxV1_0TargetAudioEncTest.cpp | 4 +- .../VtsHalMediaOmxV1_0TargetComponentTest.cpp | 76 ++++++++++--------- .../VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 13 ++-- .../VtsHalMediaOmxV1_0TargetVideoEncTest.cpp | 26 +++---- 5 files changed, 67 insertions(+), 67 deletions(-) diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp index 8520757703..8b9532a7a8 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp @@ -219,7 +219,7 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { framesReceived = 0; timestampUs = 0; timestampDevTest = false; - if (disableTest) std::cerr << "[ ] Warning ! Test Disabled\n"; + if (disableTest) std::cout << "[ WARN ] Test Disabled \n"; } virtual void TearDown() override { @@ -263,9 +263,8 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { EXPECT_EQ(tsHit, true) << "TimeStamp not recognized"; } else { - std::cerr - << "[ ] Warning ! Received non-zero " - "output / TimeStamp not recognized \n"; + std::cout << "[ INFO ] Received non-zero " + "output / TimeStamp not recognized \n"; } } } @@ -716,7 +715,7 @@ TEST_F(AudioDecHidlTest, SetRole) { } // port format enumeration -TEST_F(AudioDecHidlTest, DISABLED_EnumeratePortFormat) { +TEST_F(AudioDecHidlTest, EnumeratePortFormat) { description("Test Component on Mandatory Port Parameters (Port Format)"); if (disableTest) return; android::hardware::media::omx::V1_0::Status status; @@ -822,11 +821,7 @@ TEST_F(AudioDecHidlTest, DecodeTest) { } // end of sequence test -// SPECIAL CASE; Sending Empty input EOS buffer is not supported across all -// components. For instance soft vorbis and soft opus expects CSD buffers at -// the start. Disabling this test for now. We shall revisit this at a later -// stage -TEST_F(AudioDecHidlTest, DISABLED_EOSTest_M) { +TEST_F(AudioDecHidlTest, EOSTest_M) { description("Test end of stream monkeying"); if (disableTest) return; android::hardware::media::omx::V1_0::Status status; diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp index 038830dc2e..272b4ba2d0 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp @@ -206,7 +206,7 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { } if (i == kNumCompToCoding) disableTest = true; eosFlag = false; - if (disableTest) std::cerr << "[ ] Warning ! Test Disabled\n"; + if (disableTest) std::cout << "[ WARN ] Test Disabled \n"; } virtual void TearDown() override { @@ -454,7 +454,7 @@ TEST_F(AudioEncHidlTest, SetRole) { } // port format enumeration -TEST_F(AudioEncHidlTest, DISABLED_EnumeratePortFormat) { +TEST_F(AudioEncHidlTest, EnumeratePortFormat) { description("Test Component on Mandatory Port Parameters (Port Format)"); if (disableTest) return; android::hardware::media::omx::V1_0::Status status; diff --git a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp index 2ec86b2adc..381a1b94f7 100644 --- a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp +++ b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp @@ -181,7 +181,7 @@ class ComponentHidlTest : public ::testing::VtsHalHidlTargetTestBase { strlen(gEnv->getComponent().c_str()) - suffixLen, ".secure"); } - if (disableTest) std::cerr << "[ ] Warning ! Test Disabled\n"; + if (disableTest) std::cout << "[ WARN ] Test Disabled \n"; } virtual void TearDown() override { @@ -290,7 +290,7 @@ TEST_F(ComponentHidlTest, DISABLED_GetPortIndices) { } // port format enumeration -TEST_F(ComponentHidlTest, DISABLED_EnumeratePortFormat) { +TEST_F(ComponentHidlTest, EnumeratePortFormat) { description("Test Component on Mandatory Port Parameters (Port Format)"); if (disableTest) return; android::hardware::media::omx::V1_0::Status status; @@ -397,14 +397,44 @@ TEST_F(ComponentHidlTest, DISABLED_SetDefaultPortParams) { EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK); - // Edit Read-Only fields. + // Port Direction - Read Only portDef = mirror; portDef.eDir = static_cast(RANDOM_INDEX); setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); - EXPECT_EQ(portDef.eDir, mirror.eDir); + if (portDef.eDir != mirror.eDir) { + std::cerr << "[ ERROR ] port direction has to be read only " + "but is changeable \n"; + } setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); + // Port Min BufferCount - Read Only + portDef = mirror; + portDef.nBufferCountMin += 1; + setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); + getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); + if (portDef.nBufferCountMin != mirror.nBufferCountMin) { + std::cerr << "[ ERROR ] port Min BufferCount has to be " + "read only but is changeable \n"; + } + EXPECT_EQ(portDef.nBufferCountMin, mirror.nBufferCountMin); + setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); + + // Port Actual BufferCount + portDef = mirror; + portDef.nBufferCountActual += 1; + status = setPortParam(omxNode, OMX_IndexParamPortDefinition, i, + &portDef); + if (status == ::android::hardware::media::omx::V1_0::Status::OK) { + status = getPortParam(omxNode, OMX_IndexParamPortDefinition, i, + &portDef); + EXPECT_EQ(portDef.nBufferCountActual, + mirror.nBufferCountActual + 1); + } + + // Port BufferSize is although read only as per OMX-IL 1.2, android + // doesnt abide by this. + // Decrease buffer size portDef = mirror; OMX_U32 nBufferSize = portDef.nBufferSize >> 1; if (nBufferSize != 0) { @@ -428,43 +458,21 @@ TEST_F(ComponentHidlTest, DISABLED_SetDefaultPortParams) { (compClass == video_decoder && i == kPortIndexInput)) { double dev = (portDef.nBufferSize / (double)nBufferSize); dev -= 1; - if (dev < 0 || dev > 0.1) EXPECT_TRUE(false); + if (dev < 0 || dev > 0.1) { + std::cerr << "[ ERROR ] port buffer size deviation " + "larger than expected \n"; + } } else { EXPECT_EQ(portDef.nBufferSize, mirror.nBufferSize); } setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); - portDef = mirror; - portDef.nBufferCountMin += 1; - setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); - getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); - EXPECT_EQ(portDef.nBufferCountMin, mirror.nBufferCountMin); - setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); - - portDef = mirror; - portDef.nBufferCountActual += 1; - status = setPortParam(omxNode, OMX_IndexParamPortDefinition, i, - &portDef); - if (status == ::android::hardware::media::omx::V1_0::Status::OK) { - status = getPortParam(omxNode, OMX_IndexParamPortDefinition, i, - &portDef); - EXPECT_EQ(portDef.nBufferCountActual, - mirror.nBufferCountActual + 1); - } - + // Increase buffer size portDef = mirror; portDef.nBufferSize = mirror.nBufferSize << 1; - status = setPortParam(omxNode, OMX_IndexParamPortDefinition, i, - &portDef); - if (status == ::android::hardware::media::omx::V1_0::Status::OK) { - status = getPortParam(omxNode, OMX_IndexParamPortDefinition, i, - &portDef); - if (portDef.nBufferSize != mirror.nBufferSize) { - std::cout - << "[ ] Warning ! Component input port does " - "not preserve Read-Only fields \n"; - } - } + setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); + getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); + EXPECT_EQ(portDef.nBufferSize, (mirror.nBufferSize << 1)); } } } diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index a5b5524b80..a3eccccd3d 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -227,7 +227,7 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { ".secure"); } if (isSecure) disableTest = true; - if (disableTest) std::cout << "[ ] Warning ! Test Disabled\n"; + if (disableTest) std::cout << "[ WARN ] Test Disabled \n"; } virtual void TearDown() override { @@ -271,9 +271,8 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { EXPECT_EQ(tsHit, true) << "TimeStamp not recognized"; } else { - std::cout - << "[ ] Warning ! Received non-zero " - "output / TimeStamp not recognized \n"; + std::cout << "[ INFO ] Received non-zero " + "output / TimeStamp not recognized \n"; } } } @@ -611,14 +610,14 @@ void portReconfiguration(sp omxNode, sp observer, } } else if (msg.data.eventData.data2 == OMX_IndexConfigCommonOutputCrop) { - std::cout << "[ ] Warning ! OMX_EventPortSettingsChanged/ " + std::cout << "[ INFO ] OMX_EventPortSettingsChanged/ " "OMX_IndexConfigCommonOutputCrop not handled \n"; } else if (msg.data.eventData.data2 == OMX_IndexVendorStartUnused + 3) { - std::cout << "[ ] Warning ! OMX_EventPortSettingsChanged/ " + std::cout << "[ INFO ] OMX_EventPortSettingsChanged/ " "kDescribeColorAspectsIndex not handled \n"; } } else if (msg.data.eventData.event == OMX_EventError) { - std::cout << "[ ] Warning ! OMX_EventError/ " + std::cerr << "[ ERROR ] OMX_EventError/ " "Decode Frame Call might be failed \n"; return; } else { diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp index 23f051d8f0..fab5ef8e99 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp @@ -237,7 +237,7 @@ class VideoEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { ".secure"); } if (isSecure) disableTest = true; - if (disableTest) std::cerr << "[ ] Warning ! Test Disabled\n"; + if (disableTest) std::cout << "[ WARN ] Test Disabled \n"; } virtual void TearDown() override { @@ -278,9 +278,8 @@ class VideoEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { EXPECT_EQ(tsHit, true) << "TimeStamp not recognized"; } else { - std::cerr - << "[ ] Warning ! Received non-zero " - "output / TimeStamp not recognized \n"; + std::cout << "[ INFO ] Received non-zero " + "output / TimeStamp not recognized \n"; } } } @@ -442,7 +441,7 @@ void requestIDR(sp omxNode, OMX_U32 portIndex) { status = setPortConfig(omxNode, OMX_IndexConfigVideoIntraVOPRefresh, portIndex, ¶m); if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr << "[ ] Warning ! unable to request IDR \n"; + std::cout << "[ INFO ] unable to request IDR \n"; } // modify bitrate @@ -453,7 +452,7 @@ void changeBitrate(sp omxNode, OMX_U32 portIndex, uint32_t nBitrate) { status = setPortConfig(omxNode, OMX_IndexConfigVideoBitrate, portIndex, ¶m); if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr << "[ ] Warning ! unable to change Bitrate \n"; + std::cout << "[ INFO ] unable to change Bitrate \n"; } // modify framerate @@ -465,7 +464,7 @@ Return changeFrameRate( status = setPortConfig(omxNode, OMX_IndexConfigVideoFramerate, portIndex, ¶m); if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr << "[ ] Warning ! unable to change Framerate \n"; + std::cout << "[ INFO ] unable to change Framerate \n"; return status; } @@ -479,7 +478,7 @@ void changeRefreshPeriod(sp omxNode, OMX_U32 portIndex, (OMX_INDEXTYPE)OMX_IndexConfigAndroidIntraRefresh, portIndex, ¶m); if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr << "[ ] Warning ! unable to change Refresh Period\n"; + std::cout << "[ INFO ] unable to change Refresh Period\n"; } // set intra refresh interval @@ -505,7 +504,7 @@ void setRefreshPeriod(sp omxNode, OMX_U32 portIndex, status = setPortParam(omxNode, OMX_IndexParamVideoIntraRefresh, portIndex, ¶m); if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr << "[ ] Warning ! unable to set Refresh Period \n"; + std::cout << "[ INFO ] unable to set Refresh Period \n"; } void setLatency(sp omxNode, OMX_U32 portIndex, uint32_t latency) { @@ -515,7 +514,7 @@ void setLatency(sp omxNode, OMX_U32 portIndex, uint32_t latency) { status = setPortConfig(omxNode, (OMX_INDEXTYPE)OMX_IndexConfigLatency, portIndex, ¶m); if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr << "[ ] Warning ! unable to set latency\n"; + std::cout << "[ INFO ] unable to set latency\n"; } void getLatency(sp omxNode, OMX_U32 portIndex, uint32_t* latency) { @@ -524,7 +523,7 @@ void getLatency(sp omxNode, OMX_U32 portIndex, uint32_t* latency) { status = getPortConfig(omxNode, (OMX_INDEXTYPE)OMX_IndexConfigLatency, portIndex, ¶m); if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr << "[ ] Warning ! unable to get latency\n"; + std::cout << "[ INFO ] unable to get latency\n"; else *latency = param.nU32; } @@ -1046,7 +1045,7 @@ void encodeNFrames(sp omxNode, sp observer, break; } else if (msg.data.eventData.event == OMX_EventDataSpaceChanged) { // TODO: how am i supposed to respond now? - std::cout << "[ ] Info ! OMX_EventDataSpaceChanged \n"; + std::cout << "[ INFO ] OMX_EventDataSpaceChanged \n"; } else { ASSERT_TRUE(false); } @@ -1266,8 +1265,7 @@ TEST_F(VideoEncHidlTest, EncodeTest) { status = setParam(omxNode, static_cast(index), ¶m); } if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr - << "[ ] Warning ! unable to prependSPSPPSToIDRFrames\n"; + std::cout << "[ INFO ] unable to prependSPSPPSToIDRFrames\n"; else prependSPSPPS = true; From 957367805b587f7e2e6a8c5a06d95dca5da7c6f3 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Thu, 14 Sep 2017 12:04:48 +0530 Subject: [PATCH 228/265] Move graphic buffer allocation to common Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Host \ -l INFO Bug: 63796949 Change-Id: I40b949199856beab73933a083045ed2e4e018c75 --- .../omx/1.0/vts/functional/common/Android.bp | 3 + .../common/media_hidl_test_common.cpp | 88 ++++++++++++- .../common/media_hidl_test_common.h | 6 +- media/omx/1.0/vts/functional/video/Android.bp | 5 - .../VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 124 +----------------- 5 files changed, 98 insertions(+), 128 deletions(-) diff --git a/media/omx/1.0/vts/functional/common/Android.bp b/media/omx/1.0/vts/functional/common/Android.bp index af55e3a456..cdc52fb477 100644 --- a/media/omx/1.0/vts/functional/common/Android.bp +++ b/media/omx/1.0/vts/functional/common/Android.bp @@ -28,6 +28,7 @@ cc_library_static { "android.hidl.allocator@1.0", "android.hidl.memory@1.0", "android.hardware.media.omx@1.0", + "android.hardware.graphics.allocator@2.0", ], } @@ -38,6 +39,8 @@ cc_defaults { // Link to these statically as they are not guaranteed to be on the device. static_libs: [ "VtsHalMediaOmxV1_0CommonUtil", + "android.hardware.graphics.allocator@2.0", + "android.hardware.graphics.mapper@2.0", "android.hardware.graphics.bufferqueue@1.0", "android.hardware.graphics.common@1.0", "android.hardware.media.omx@1.0", diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp index 1ef645c6b3..183fae234d 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp @@ -22,6 +22,9 @@ #include +#include +#include +#include #include #include #include @@ -29,7 +32,10 @@ #include #include #include +#include +using ::android::hardware::graphics::common::V1_0::BufferUsage; +using ::android::hardware::graphics::common::V1_0::PixelFormat; using ::android::hardware::media::omx::V1_0::IOmx; using ::android::hardware::media::omx::V1_0::IOmxObserver; using ::android::hardware::media::omx::V1_0::IOmxNode; @@ -186,6 +192,73 @@ Return setAudioPortFormat( return status; } +void allocateGraphicBuffers(sp omxNode, OMX_U32 portIndex, + BufferInfo* buffer, uint32_t nFrameWidth, + uint32_t nFrameHeight, int32_t* nStride, + int format) { + android::hardware::media::omx::V1_0::Status status; + sp allocator = + android::hardware::graphics::allocator::V2_0::IAllocator::getService(); + ASSERT_NE(nullptr, allocator.get()); + + sp mapper = + android::hardware::graphics::mapper::V2_0::IMapper::getService(); + ASSERT_NE(mapper.get(), nullptr); + + android::hardware::graphics::mapper::V2_0::IMapper::BufferDescriptorInfo + descriptorInfo; + uint32_t usage; + + descriptorInfo.width = nFrameWidth; + descriptorInfo.height = nFrameHeight; + descriptorInfo.layerCount = 1; + descriptorInfo.format = static_cast(format); + descriptorInfo.usage = static_cast(BufferUsage::CPU_READ_OFTEN); + omxNode->getGraphicBufferUsage( + portIndex, + [&status, &usage](android::hardware::media::omx::V1_0::Status _s, + uint32_t _n1) { + status = _s; + usage = _n1; + }); + if (status == android::hardware::media::omx::V1_0::Status::OK) { + descriptorInfo.usage |= usage; + } + + ::android::hardware::hidl_vec descriptor; + android::hardware::graphics::mapper::V2_0::Error error; + mapper->createDescriptor( + descriptorInfo, [&error, &descriptor]( + android::hardware::graphics::mapper::V2_0::Error _s, + ::android::hardware::hidl_vec _n1) { + error = _s; + descriptor = _n1; + }); + EXPECT_EQ(error, android::hardware::graphics::mapper::V2_0::Error::NONE); + + static volatile int32_t nextId = 0; + uint64_t id = static_cast(getpid()) << 32; + allocator->allocate( + descriptor, 1, + [&](android::hardware::graphics::mapper::V2_0::Error _s, uint32_t _n1, + const ::android::hardware::hidl_vec< + ::android::hardware::hidl_handle>& _n2) { + ASSERT_EQ(android::hardware::graphics::mapper::V2_0::Error::NONE, + _s); + *nStride = _n1; + buffer->omxBuffer.nativeHandle = _n2[0]; + buffer->omxBuffer.attr.anwBuffer.width = nFrameWidth; + buffer->omxBuffer.attr.anwBuffer.height = nFrameHeight; + buffer->omxBuffer.attr.anwBuffer.stride = _n1; + buffer->omxBuffer.attr.anwBuffer.format = descriptorInfo.format; + buffer->omxBuffer.attr.anwBuffer.usage = descriptorInfo.usage; + buffer->omxBuffer.attr.anwBuffer.layerCount = + descriptorInfo.layerCount; + buffer->omxBuffer.attr.anwBuffer.id = + id | static_cast(android_atomic_inc(&nextId)); + }); +} + // allocate buffers needed on a component port void allocateBuffer(sp omxNode, BufferInfo* buffer, OMX_U32 portIndex, OMX_U32 nBufferSize, PortMode portMode) { @@ -249,7 +322,7 @@ void allocateBuffer(sp omxNode, BufferInfo* buffer, OMX_U32 portIndex, // allocate buffers needed on a component port void allocatePortBuffers(sp omxNode, android::Vector* buffArray, - OMX_U32 portIndex, PortMode portMode) { + OMX_U32 portIndex, PortMode portMode, bool allocGrap) { android::hardware::media::omx::V1_0::Status status; OMX_PARAM_PORTDEFINITIONTYPE portDef; @@ -263,6 +336,13 @@ void allocatePortBuffers(sp omxNode, BufferInfo buffer; allocateBuffer(omxNode, &buffer, portIndex, portDef.nBufferSize, portMode); + if (allocGrap && portMode == PortMode::DYNAMIC_ANW_BUFFER) { + int32_t nStride; + allocateGraphicBuffers(omxNode, portIndex, &buffer, + portDef.format.video.nFrameWidth, + portDef.format.video.nFrameHeight, &nStride, + portDef.format.video.eColorFormat); + } buffArray->push(buffer); } } @@ -274,7 +354,7 @@ void changeStateLoadedtoIdle(sp omxNode, sp observer, android::Vector* iBuffer, android::Vector* oBuffer, OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, - PortMode* portMode) { + PortMode* portMode, bool allocGrap) { android::hardware::media::omx::V1_0::Status status; Message msg; PortMode defaultPortMode[2], *pm; @@ -293,14 +373,14 @@ void changeStateLoadedtoIdle(sp omxNode, sp observer, ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); // allocate buffers on input port - allocatePortBuffers(omxNode, iBuffer, kPortIndexInput, pm[0]); + allocatePortBuffers(omxNode, iBuffer, kPortIndexInput, pm[0], allocGrap); // Dont switch states until the ports are populated status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); // allocate buffers on output port - allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput, pm[1]); + allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput, pm[1], allocGrap); // As the ports are populated, check if the state transition is complete status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h index 71012b3b21..e23d781baa 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h @@ -303,13 +303,15 @@ void allocateBuffer(sp omxNode, BufferInfo* buffer, OMX_U32 portIndex, void allocatePortBuffers(sp omxNode, android::Vector* buffArray, OMX_U32 portIndex, - PortMode portMode = PortMode::PRESET_BYTE_BUFFER); + PortMode portMode = PortMode::PRESET_BYTE_BUFFER, + bool allocGrap = false); void changeStateLoadedtoIdle(sp omxNode, sp observer, android::Vector* iBuffer, android::Vector* oBuffer, OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, - PortMode* portMode = nullptr); + PortMode* portMode = nullptr, + bool allocGrap = false); void changeStateIdletoLoaded(sp omxNode, sp observer, android::Vector* iBuffer, diff --git a/media/omx/1.0/vts/functional/video/Android.bp b/media/omx/1.0/vts/functional/video/Android.bp index e251a15ba4..f0da2b39d0 100644 --- a/media/omx/1.0/vts/functional/video/Android.bp +++ b/media/omx/1.0/vts/functional/video/Android.bp @@ -21,10 +21,6 @@ cc_test { "VtsHalMediaOmxV1_0TargetVideoDecTest.cpp", "media_video_hidl_test_common.cpp" ], - static_libs: [ - "android.hardware.graphics.allocator@2.0", - "android.hardware.graphics.mapper@2.0", - ], } cc_test { @@ -36,6 +32,5 @@ cc_test { ], static_libs: [ "libnativewindow", - "android.hardware.graphics.mapper@2.0", ], } diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index fb02cd4615..03c9eb99d3 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -17,9 +17,6 @@ #define LOG_TAG "media_omx_hidl_video_dec_test" #include -#include -#include -#include #include #include #include @@ -27,10 +24,7 @@ #include #include #include -#include -using ::android::hardware::graphics::common::V1_0::BufferUsage; -using ::android::hardware::graphics::common::V1_0::PixelFormat; using ::android::hardware::media::omx::V1_0::IOmx; using ::android::hardware::media::omx::V1_0::IOmxObserver; using ::android::hardware::media::omx::V1_0::IOmxNode; @@ -433,82 +427,6 @@ void GetURLForComponent(VideoDecHidlTest::standardComp comp, char* mURL, } } -void allocateGraphicBuffers(sp omxNode, OMX_U32 portIndex, - android::Vector* buffArray, - uint32_t nFrameWidth, uint32_t nFrameHeight, - int32_t* nStride, int format, uint32_t count) { - android::hardware::media::omx::V1_0::Status status; - sp allocator = - android::hardware::graphics::allocator::V2_0::IAllocator::getService(); - ASSERT_NE(nullptr, allocator.get()); - - sp mapper = - android::hardware::graphics::mapper::V2_0::IMapper::getService(); - ASSERT_NE(mapper.get(), nullptr); - - android::hardware::graphics::mapper::V2_0::IMapper::BufferDescriptorInfo - descriptorInfo; - uint32_t usage; - - descriptorInfo.width = nFrameWidth; - descriptorInfo.height = nFrameHeight; - descriptorInfo.layerCount = 1; - descriptorInfo.format = static_cast(format); - descriptorInfo.usage = static_cast(BufferUsage::CPU_READ_OFTEN); - omxNode->getGraphicBufferUsage( - portIndex, - [&status, &usage](android::hardware::media::omx::V1_0::Status _s, - uint32_t _n1) { - status = _s; - usage = _n1; - }); - if (status == android::hardware::media::omx::V1_0::Status::OK) { - descriptorInfo.usage |= usage; - } - - ::android::hardware::hidl_vec descriptor; - android::hardware::graphics::mapper::V2_0::Error error; - mapper->createDescriptor( - descriptorInfo, [&error, &descriptor]( - android::hardware::graphics::mapper::V2_0::Error _s, - ::android::hardware::hidl_vec _n1) { - error = _s; - descriptor = _n1; - }); - EXPECT_EQ(error, android::hardware::graphics::mapper::V2_0::Error::NONE); - - EXPECT_EQ(buffArray->size(), count); - - static volatile int32_t nextId = 0; - uint64_t id = static_cast(getpid()) << 32; - allocator->allocate( - descriptor, count, - [&](android::hardware::graphics::mapper::V2_0::Error _s, uint32_t _n1, - const ::android::hardware::hidl_vec< - ::android::hardware::hidl_handle>& _n2) { - ASSERT_EQ(android::hardware::graphics::mapper::V2_0::Error::NONE, - _s); - *nStride = _n1; - ASSERT_EQ(count, _n2.size()); - for (uint32_t i = 0; i < count; i++) { - buffArray->editItemAt(i).omxBuffer.nativeHandle = _n2[i]; - buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.width = - nFrameWidth; - buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.height = - nFrameHeight; - buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.stride = _n1; - buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.format = - descriptorInfo.format; - buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.usage = - descriptorInfo.usage; - buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.layerCount = - descriptorInfo.layerCount; - buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.id = - id | static_cast(android_atomic_inc(&nextId)); - } - }); -} - // port settings reconfiguration during runtime. reconfigures frame dimensions void portReconfiguration(sp omxNode, sp observer, android::Vector* iBuffer, @@ -592,22 +510,7 @@ void portReconfiguration(sp omxNode, sp observer, android::hardware::media::omx::V1_0::Status::TIMED_OUT); allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput, - oPortMode); - if (oPortMode != PortMode::PRESET_BYTE_BUFFER) { - OMX_PARAM_PORTDEFINITIONTYPE portDef; - - status = getPortParam(omxNode, OMX_IndexParamPortDefinition, - kPortIndexOutput, &portDef); - ASSERT_EQ( - status, - ::android::hardware::media::omx::V1_0::Status::OK); - allocateGraphicBuffers(omxNode, kPortIndexOutput, oBuffer, - portDef.format.video.nFrameWidth, - portDef.format.video.nFrameHeight, - &portDef.format.video.nStride, - portDef.format.video.eColorFormat, - portDef.nBufferCountActual); - } + oPortMode, true); status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); ASSERT_EQ(status, @@ -1000,23 +903,10 @@ TEST_F(VideoDecHidlTest, DecodeTest) { // set state to idle changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + kPortIndexInput, kPortIndexOutput, portMode, true); // set state to executing changeStateIdletoExecute(omxNode, observer); - if (portMode[1] != PortMode::PRESET_BYTE_BUFFER) { - OMX_PARAM_PORTDEFINITIONTYPE portDef; - - status = getPortParam(omxNode, OMX_IndexParamPortDefinition, - kPortIndexOutput, &portDef); - ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); - allocateGraphicBuffers( - omxNode, kPortIndexOutput, &oBuffer, - portDef.format.video.nFrameWidth, portDef.format.video.nFrameHeight, - &portDef.format.video.nStride, portDef.format.video.eColorFormat, - portDef.nBufferCountActual); - } - // Port Reconfiguration eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); @@ -1101,7 +991,7 @@ TEST_F(VideoDecHidlTest, AdaptivePlaybackTest) { // set state to idle changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + kPortIndexInput, kPortIndexOutput, portMode, true); // set state to executing changeStateIdletoExecute(omxNode, observer); @@ -1211,7 +1101,7 @@ TEST_F(VideoDecHidlTest, EOSTest_M) { // set state to idle changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + kPortIndexInput, kPortIndexOutput, portMode, true); // set state to executing changeStateIdletoExecute(omxNode, observer); @@ -1299,7 +1189,7 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) { // set state to idle changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + kPortIndexInput, kPortIndexOutput, portMode, true); // set state to executing changeStateIdletoExecute(omxNode, observer); @@ -1412,7 +1302,7 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) { // set state to idle changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + kPortIndexInput, kPortIndexOutput, portMode, true); // set state to executing changeStateIdletoExecute(omxNode, observer); @@ -1507,7 +1397,7 @@ TEST_F(VideoDecHidlTest, FlushTest) { // set state to idle changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + kPortIndexInput, kPortIndexOutput, portMode, true); // set state to executing changeStateIdletoExecute(omxNode, observer); From 500052d8f0f7e164e9cc727c7797f88c90c15da1 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Thu, 14 Sep 2017 12:27:44 +0530 Subject: [PATCH 229/265] Extend adaptive playback test for graphic buffer modes Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Host \ -l INFO Bug: 63796949 Change-Id: I4a4aad3a0dd4f528c8e855164cbb2998b33be1cd --- .../video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index 03c9eb99d3..90e20fd8b1 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -946,10 +946,16 @@ TEST_F(VideoDecHidlTest, AdaptivePlaybackTest) { } // set port mode + portMode[0] = PortMode::PRESET_BYTE_BUFFER; + portMode[1] = PortMode::DYNAMIC_ANW_BUFFER; status = omxNode->setPortMode(kPortIndexInput, portMode[0]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + if (status != ::android::hardware::media::omx::V1_0::Status::OK) { + portMode[1] = PortMode::PRESET_BYTE_BUFFER; + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + } // prepare for adaptive playback uint32_t adaptiveMaxWidth = 320; @@ -961,7 +967,10 @@ TEST_F(VideoDecHidlTest, AdaptivePlaybackTest) { // support for adaptive play back is mandatory in Byte Buffer mode ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); } else { - return; + // for vendor codecs, support for adaptive play back is optional + // in byte buffer mode. + if (portMode[1] == PortMode::PRESET_BYTE_BUFFER) return; + if (status != ::android::hardware::media::omx::V1_0::Status::OK) return; } // TODO: Handle this better !!! From 17fa59b43161f4e92a8419e518f51a61fdf540ef Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Thu, 14 Sep 2017 13:42:12 +0530 Subject: [PATCH 230/265] Add support for preset ANW buffer mode Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Host \ -l INFO Bug: 63796949 Change-Id: I17452d9f83cf9749cd654eaf55735563f0c5f82f --- .../common/media_hidl_test_common.cpp | 20 +++++++++++++++++++ .../VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 8 +++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp index 183fae234d..9eab10c7b2 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp @@ -316,6 +316,25 @@ void allocateBuffer(sp omxNode, BufferInfo* buffer, OMX_U32 portIndex, buffer->id = id; }); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + } else if (portMode == PortMode::PRESET_ANW_BUFFER) { + OMX_PARAM_PORTDEFINITIONTYPE portDef; + status = getPortParam(omxNode, OMX_IndexParamPortDefinition, portIndex, + &portDef); + int32_t nStride; + buffer->owner = client; + buffer->omxBuffer.type = CodecBuffer::Type::ANW_BUFFER; + allocateGraphicBuffers(omxNode, portIndex, buffer, + portDef.format.video.nFrameWidth, + portDef.format.video.nFrameHeight, &nStride, + portDef.format.video.eColorFormat); + omxNode->useBuffer( + portIndex, buffer->omxBuffer, + [&status, &buffer](android::hardware::media::omx::V1_0::Status _s, + uint32_t id) { + status = _s; + buffer->id = id; + }); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); } } @@ -520,6 +539,7 @@ void dispatchOutputBuffer(sp omxNode, status = omxNode->fillBuffer((*buffArray)[bufferIndex].id, t, fenceNh); break; + case PortMode::PRESET_ANW_BUFFER: case PortMode::PRESET_SECURE_BUFFER: case PortMode::PRESET_BYTE_BUFFER: t.sharedMemory = android::hardware::hidl_memory(); diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index 03c9eb99d3..afb5e933d3 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -1277,10 +1277,16 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) { ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); // set port mode + portMode[0] = PortMode::PRESET_BYTE_BUFFER; + portMode[1] = PortMode::PRESET_ANW_BUFFER; status = omxNode->setPortMode(kPortIndexInput, portMode[0]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + if (status != ::android::hardware::media::omx::V1_0::Status::OK) { + portMode[1] = PortMode::PRESET_BYTE_BUFFER; + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + } // set Port Params uint32_t nFrameWidth, nFrameHeight, xFramerate; From b7de1a6ae34e94a3658df06e84c6b4fc12df2f5b Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Fri, 15 Sep 2017 19:48:17 +0530 Subject: [PATCH 231/265] Add vts audio dec test for flac decoder Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Host \ -l INFO Bug: 63796949 Change-Id: Ie504de96007c1c0ec6dc9c8b7da78f6c1da45631 --- .../VtsHalMediaOmxV1_0TargetAudioDecTest.cpp | 17 +- .../res/bbb_flac_stereo_680kbps_48000hz.flac | Bin 0 -> 840775 bytes .../res/bbb_flac_stereo_680kbps_48000hz.info | 415 ++++++++++++++++++ 3 files changed, 431 insertions(+), 1 deletion(-) create mode 100644 media/res/bbb_flac_stereo_680kbps_48000hz.flac create mode 100644 media/res/bbb_flac_stereo_680kbps_48000hz.info diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp index 8520757703..145d04a78b 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp @@ -171,7 +171,7 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { {"mp3", mp3}, {"amrnb", amrnb}, {"amrwb", amrwb}, {"aac", aac}, {"vorbis", vorbis}, {"opus", opus}, {"pcm", pcm}, {"g711alaw", g711alaw}, {"g711mlaw", g711mlaw}, - {"gsm", gsm}, {"raw", raw}, + {"gsm", gsm}, {"raw", raw}, {"flac", flac}, }; const size_t kNumStringToName = sizeof(kStringToName) / sizeof(kStringToName[0]); @@ -204,6 +204,7 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { {g711mlaw, OMX_AUDIO_CodingG711}, {gsm, OMX_AUDIO_CodingGSMFR}, {raw, OMX_AUDIO_CodingPCM}, + {flac, OMX_AUDIO_CodingFLAC}, }; static const size_t kNumCompToCoding = sizeof(kCompToCoding) / sizeof(kCompToCoding[0]); @@ -301,6 +302,7 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { g711mlaw, gsm, raw, + flac, unknown_comp, }; @@ -431,6 +433,16 @@ void getInputChannelInfo(sp omxNode, OMX_U32 kPortIndexInput, *nSampleRate = param.nSampleRate; break; } + case OMX_AUDIO_CodingFLAC: { + OMX_AUDIO_PARAM_FLACTYPE param; + status = getPortParam(omxNode, OMX_IndexParamAudioFlac, + kPortIndexInput, ¶m); + ASSERT_EQ(status, + ::android::hardware::media::omx::V1_0::Status::OK); + *nChannels = param.nChannels; + *nSampleRate = param.nSampleRate; + break; + } default: ASSERT_TRUE(false); break; @@ -472,6 +484,9 @@ void GetURLForComponent(AudioDecHidlTest::standardComp comp, char* mURL, "bbb_gsm_1ch_8khz_13kbps.info"}, {AudioDecHidlTest::standardComp::raw, "bbb_raw_1ch_8khz_s32le.raw", "bbb_raw_1ch_8khz_s32le.info"}, + {AudioDecHidlTest::standardComp::flac, + "bbb_flac_stereo_680kbps_48000hz.flac", + "bbb_flac_stereo_680kbps_48000hz.info"}, }; for (size_t i = 0; i < sizeof(kCompToURL) / sizeof(kCompToURL[0]); ++i) { diff --git a/media/res/bbb_flac_stereo_680kbps_48000hz.flac b/media/res/bbb_flac_stereo_680kbps_48000hz.flac new file mode 100644 index 0000000000000000000000000000000000000000..db94d8eb04c6e4ae03c8eaa017265fd009dd31d5 GIT binary patch literal 840775 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Ì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�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

MS2W$UzJ?0h928;;$5(xgM3sdT{>G?)S&- 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 xEeLo#H3uo*MnijLlWgNl3J95vL@LOG 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�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

`NQUNs~Yx3@j($66>0yqAp@ppW<5d=ccCQcK* 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%0D%9?bl(jlTt{ToFaDvynf_~mU$n1R%aOkZBn5v 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%0A2$5W+ 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 z zDsDiMJmhHUi1n$!MX_0)$J!LTX!6wd^n4d_OKsZoE^ffD{UxuP0-A@W+jDBbK7zN+Ro)7?Ctj z8VHA01dIehJeVbWeRzH)K9tnCGnZ!l3MG3;}~(*q&1KthA1)o7-l%MMgjp9K$0+|M3lGU=eA2Fu*D z(Es>47{!?r7XG6CmHvSN2yvnggX4S*7-#J@T=%}KX(cq!X*Fzy%Hbr9aJe|3S%zOx z1kZ~2EYd9YhL%;5#HwX-$GS2nf=ntlsIYk=C({%?cp*8WReM`Gy9r7&w!G{5AXwE8 zncT7W?&I22sz-<=R$a<5V3XAdy22KLAGB#M{%L!xlgiFsd}2-S1u)vHDTzKO0*!P` z>jA=2%r`DhHl|9qWw6RCA)dyB1RSy@*J}kz^nt@=(jej=5$R)3b-xn16S3x1t=>8E ztsbVx^@5s{C*Xx|3N531Ey&$6$0}#)(GEctTqK+Pj7n2WGt$=!va?ie6NfgszdS*d za)D=#nWZquo<#~q{vm^PG`C{e9QR3U_E zq@=vDblfFKb>5^?VlJdZ)lQ5hz3Mlwm-&LuhW%&@{ODvVn&$iIJ07?J=n$DSa&Ik}hKTwfNryAO7 zHI8K#)x!}J5ul*7%g}g{akNH)nBPUc&^w zs;2hR8YWzT@(jN+R(2;nOSUhQ2Z@8OhJuL`xkVl62DsT&;iRZ+%?vclX+6a&e>v`z zJEDk-zOb{&)rZU6KqT_Jp%FEUB2V@>hgZ*>+^_K=;-HA_U2Yj}45( zNC166g1^_>?};T>i4iuYh^o|vNSZjemoJVRpkb(#k#LISh$?+9DJES&(;3%0DhP;( z2QWH!0v0>JdCHeK7Q-dM_rroun~C8}zbMP>s5#VLxf#*d*%Nfiw3&W~9#Le1R{nltse;FP_#?u-nyvx!`n{rSdsE47=zFfeB8pd-wObQ!LP#SPp>ok90!z--jJJo%ph`p- zGOV(L+Cfb=`!>4%F`J;xctvprG>5q+^pVlL6zh`wCS9I5NT(9oc*wtmwmO-IDxIqA z+CfNerWpz7A&j)~akg}kg{-RNX35^Zu05VG!%JQ8o^b6w}@iDjJX*%-d5xgZYV`mYwA2g zt=@NF#J@(_{I8abYqw^uJnFVfQlv4a&br`)siuGE73lCMWSjc82pq%tVrrE+ol)YhhB35T8Dv2W)T-{W* z^il@wc@z6!wALZ9*3p4y6T*dEC|MlNEX;z_)eVWPk_sscv7@0>1uVViq&oS-5i`ePwQ&|yK`6_}e?>ATPa5_)30y^U9`S826%Z;n zfb;|KCG_OqhM_hTMSihT^b)}tF_I-|%o1W(b_p&nkYkGHhPX2Qt(&B?(#D3vs|YZv z#=1IPVI;eflqR35td?OHZG>?cu;tcS`THi%qHraBt@TwSu?=9PAB)dODr7;Tz9on{ zeRPzxURgf9ckol)-t7`;!^v4L8zvYQA1Z>9jL1Ap+d5m)LPp>*P(-Mp7;tp1vwl$o z8~T)qiiw}AM7I&F6IgWr_&ONHni>`ak_3GOUI93ggq0DxDu@q!`!G0x*X+SfT;+}H zK$*9M8dP9#|$oeQIO(n2~*?5I*)WjZM^i>fe@g&#dmhaKwDVI^~ErD?r0va0`NaB;;2|9M>gb;VMDnx1HY~6wqRpyDV zvfO8I$#cU4VU(VY;=zfpCK}Z6m@aI1c)6Y)EcM23DRUru?Q6Vt90@)jVK}Rp&!`)3`?jmGH0l@&6PtPS7%UW$# z8nobx`xI~@R3I!|ukdkUltPO#t<(F(K5rzRq^D@Jwh3P=BqnFgDlXX}k7Y>SxbK*2 z1;VHV8VHU5jXmhy$dOQ&D9F!7g$st{7EoNea~dQ~5#=+h9Zrf}f9d5Zy?pDg4r{3} z*B6n-h4` zuepXOXCYz%vEL6Km+(|3Xn0J0=McMa7J~KT$Ujt#jm=^1{flR!Lp-W zE|QiI*|Zv*ErS-`1;N$;#=%!uJaHG?V4qxQ^a`??Ef5Hi3m86MY95npG01)-6F&vd zpm_{tr>IRh*l2-!{C5M8e%*&h*zwd1>Shl+r%0i~VB>l1MpTBuKaj-(SR2plThJ*=;3QxUGC;srx2 z7_?p~Q22?DRHqwaVmK(DT0)K&ZUc1rm-Y1QtRphi)v;jnvs1Q8WvCSW`*Q{es(mxL#@{ z&&%2S3`%XgrU+BBV91>keytXj#oBeLAf6*E6U2|9S8G}fG8yN@ECYg8MG)y<^_ zkcz3yL1))tW=!b@w5qF79n!E%SKqvv`s@v&Vp9Z2Gl9M#j@@ceGqN=8o z467(G@wdw!v~R&A35HMjlrq-{m+2-nmOCOycdE}&O&GX|xDb^iw1g#Hef`OXDK}S) zXT_;_Q3fiyG39Tjte^UnoB2&a<4%v4C?!)dAc0nBc$dzic-OijM;wH+Zz5kt7LsU^ zAkI%@WgR%y7ZXhz7A-h2?e(Rf8Gwb?)w?>c%r^rGMu(^_M8V}vu0i4=eiHL+;IyKZ z%)sKE&X80x*@m>9-Z{3@-P&OaLUCQWtw|xRZ(68`x`G!~#UT{n<%D`rg&`>jk+YGP zrysYYj&{EGZ^lGcIY!@!1d}5~vAKCC5L`#hT~x_6w_uv7L+KROF&0s&P3(aMS51E{ z`EeMWkyYwRg>EI(aEhb~CjD$tLSiY%Xu&tmFu&Q6#F0f61}Ys?f)-WMM~t0IiwHhl z<5Wwe*(>tii3yv6-_?3}!5s{2R79Cz#9gr#Xpc-dn@N1pz}R-r7Fj)*$jk9q^G4NM z1spPWPB{{?=ij{47R$QQ1TGPNUReqfsXtBBk|%`-@N#hV=#{%ig({rv$y6UQ*9^*JbOe(XM z!kFS^WN@O@-+wiREZ+EYZnDhA;g=bLl*rD0(YW{U-v= zS%^a+F%tnyjjE&G-2Lmz+RD;&ZemOX%a$DUTSbN+L~u$ZL`c5ivf_LtIzqBaH)w)e zUdoX}!P4gi8k23Hm9-CPCJBP=o;mf|h9|-0mw)UWnlUu{!25@>Y$MJTJX5SI1J8q}^E z6&4^T_7Gcye6hAjVWH{>kCQM9G7aQeOER84oTN+Nx>ef~7Z+F>NJOrZm+CMjHs#RC zaG-%P)dr@mYwtqqR!L*!@+i=WM}6j6X@ZICfwToQYg2SM7gz=E@dY)hTDOv6;H>BA@<`8E^ew@%N5yY7qqUz zgDj9Fi5}5Jttal6?qKxuGGu(yV?Gpm%cpH3xmcr!-GK zFj=wqw3b`TL>5S>pMnw!iMTX`R~7&v|KI`*eRmMKPCcgYBkk80cweJ*)%vBPHvJ)TCY+7l`*L`{q zd$UQ05g%2@o`W!5-=S2RPU|f6he)_$NZ~6NBW@ssds)cB?xN!uca3+mjI9izHr_0# z{>m-1(0V`mcQ|2fwyQ`9h_pf%g!Lw5hA&46MOV#aRuX#y!6&Pqy+HgA7OK@zJ?n69|-ua-!T-pZ|&cqR1c`*=>oBeD%g zOjXrT_EFVYUXWOXlcl@Ix?W}$Wzxh9o22-Hu^Lmh=}$vBY$IcCDHm2_a_foG!0W_$e^TaAO26o(;TJfK}JV@ za6wXQB-s@9NsULnqK;_GZaq9P(k|nPT|W99NVdtkNVSRC0y}ADE`2jt;Uq@I_;Ky; zm5M05VmsvbtW$2)r1ohM`f~a$bv54{<7d-ZEX=1yYZUO-DT-*ZCCR5n6GaLyb*m{e zm6Bm?yU9nEhZ`5iIEIS($l5NaR224Ji8X1t`yTQaUO#>fieXpFC;c9ARcCjoct@d)nX$zsrp+wExqD;hx)vr|`a~wkS zkrRJ##heHh{viHB{$BwgmXYyFn;RIH9I3!QwEMM}_-CAzF+igjS&MPDPeyhXMQEpN9y zUe9YK8ag-9OgbkLT)LcuqlUdJChEDRHvdF~5-QJm#3G|r{^3coD_#&{2-&>qMxRSQ19^l>g>6;*-Y(h@{OPQp?hJ7BR6 zs+xDPfk~=|AkJY@YIU&dMI=>nTs`9PH#|>xH3`rub`E{rRt~B`jD($$=(8Q8tGRU6U!al-Mv)EsXaP zC%CkfzdfS~(9(+(m_<^NO*z|4va`^wHohlTSj5GDky{7X;fL5Zg7n%}s1~=`O!L9IGP<5oW$6Jvl5j zkqVNRi9fW&IFY(z9ufC-j1blOH2(b(xrIm*&Q_*{vMa;a4h2H$eDr)k>Ih$#Nx%N z-K;o!E{p9=Rr9Tg2wOj=Hn@Q28!GQuW90f%1ZJXN%TIFFxfXKeA2xuoY&K>(o`ev_ z`iPk{gf5y$Yl6TNpc4QP03k&(j8swNMpY0gea1+UH$n|(%tP^eZ}gF>cehQ_HEGEt z=KhD7ZbYn_$1)cqq@z0NgWHLBj| zk+H26n;BJ67=()^qn}lxMMU;sL(IRt^}3QdxG8*+Q2XQySFXXVyYv#=tcCctME3D$ zThe6Ne3*K#S6Cj zHcB`#MgL|zWXZsS>cY~A67Xr_lxe}b1ye#^*t2~I35ME?X8yOxbzI=zY9mu%00jONy1i?E|L>QZ!o(y`y?Di`rbu78U7yf zoi`DQD?N7mGcv@#g}j^=T)74n*{iRgzcLSBD=Avo&&(vv7VZ4Wcsz&Vg(WGkvyW9- zNAsdFOo4 zb0vj+#&-0VtfIC>NSFyCBLY@X$4=C@5ltLT9q)xOikiwu3X^GWN*|OV{^6zQg)U2m z&aislTFviedRYqFjM;}9e2{@Ldk~iP`btftKB~=Bof?5VJgGg#GbER>3R=nj)4dp! zQ%yhc(vg*uL5585(j8Vg(7ylpIvB;B4;BFs0T2NO0U<_^dr%^Ln?{)*DnKlH|Ew#^ z@Y9HjhF20OOuK>*O_qpy+O1S+(G*hiW#CE8#{H@qK$9Ip1;tq~B-mFYN<%rSS4JfV zi4h8}lAAi}!;deyvzMH_94*k8s)HFmzm9r(r{r0*M4VN-zuJ8|9xYR|YZXC`LKtL3 ziw$MFa=A3o74)-)CF~Okr*F+%m=wBjUqT2^+@=Ljr13L7NLga{5=e`5;UWtvHg-Zw zDo#xy^D!aDQaH47Bi?@A>LeJv+1l8W6I766;E8@UQ8dH_w#@0sAc6{|!l68vTdDm< zIR!ksIMf<3QE^+IC}jIW6<6|NopFg4P<(Yt{Vck(mV*0f$9l2hst3Y4S!|bPR+biw zUJ%K&k7T^ju0Qy(=@X%fR}j0Nt=Bu_)Ddk#EI#aNEK!u&VX=2e9E$RdCCn+8(o3;x z&6O)WdUN?fOFEtnILqr6sLA^n$}{I~g&ODLf>%P;o4>@_+Gw;|?Z4q8P(cr5nEED` zq}AP*Wg`o1TX~@_4xiH7>a{GT&D_&Y+`%lOo&S{h)?=vliF(lGvtl0?Cp9r{w>O@; z?F=MeEIpIw+i9scBqW|(CF^>r=gn+Xyi}&s@{D#IrxapH&gz$|$u7=hhp|00i;U@8Y6uxZ^6SrE5sA zIP$R9e`P9l|6y3eDlJ?rtLEm7xzWC5R<${e+Vlnd+HV zd{Ri!2AZ_nyzrcmL6h&`_a!wNwoq89SDtjLx@zZUAX}~2wdyQ^vTR8*>zebk)S7sW zQc_G*jqruYrsWxK>lX7kTF624$rk9zHXfPxY*2+F!`-YAUI!L7eup-9tPs;XBzdio zBa=!l?R^i3z(BKa*<`Gzs!s)?Bk>IvBc3^C;RHNw zD3r$~!9x!LYYI3^oiwD^17LR~Mh!i-bhN?UT^2y|%EHicM3%0!t4~3gN}A46*82!v zzK+r3#y)1^TO%YbSCp8!br?lsUA;-HIQY*sCy-^i_tNSGkf+_UUqz3aIE|Swq z71|(Sps{zyD%3(=;SLfTSp{I<5JFaag9vJG2z%AoIDz0uZ;TQ01sS4RM@tl0Wk9pw zi{dDu1O$bdR>yi|v*f~y(SkkVSP0TzGdPD5E`pT(-N!hRSi<+9!O{tmy4j6x|NRIR zV%``sMZCeu3tcK>si~Awicv3`VHK}k^`s>fSW9pzruOv}M|j^f%O(v}+O}x23BoMS z6`GWNHHcySsK+#!T8U{kQH?7NXN5LjhLqyu{8MeBjhs{FXmbSbtq}H6#;DKjblA~3 zkiS;4jz!gJq*oi=fk6-2VZpjxz6q^-C zn&%skZ@KNxQ-u)Wdys-GSXpNUc={~B#}WL z(vCvftO*G@hS20t`w)~(f(XSZZntrw=5q#!LKHUp4k;eN&gBRzbo}CE+9*fXN@5i?TyyRAuHaAPgPXE3|PAD2y8`HiF0I~02KhtDpAe$EoBt5TU5O$rj}ATr!@L1 z&arYRST$;*hG7Uc3gIw;7 zpuvO2)3GMLP_9?<6y$vr;8-TiM;d;N5U2QIMTsL9VmclcE@y@XVpFo>C92Dom-bqL z%zXOq2JYzPtUiqZ;XQ6p2%!o-;3 zob`}mNllzlt0F}0!nsIlhb$66axo>EZ4AH?NE8k^p!ALru&b4X!4cj(u%Lq)v-x4_1Y!VxqzdZJ14CN4LpA>cdb6-!zLMQA)7Hk5XEH%MWB(!^kijyfD6ytP@dn6*2q9&%=gE@hlR+)rS4SlkvR|Yj#kVlyA)&EOb&tNiq_+ZBK{su5Qwhp6Jt58T``LB zFm__Kr5F+xg)ewfSLyN&t(W-{Y@=2B!Z-IS9ysKL<$sZ6mJ|gbwXJ?fPR24(WzD9H z>y_CE^%YCD*=rDll&15IS{Up#JgvEf?o$J}5=ya#K=XW1LrG;>m^X7_oaOE-wddqe zrCRDb3!*EOE&g@?G=G=^O4^tqgZaa6tSR%PSaD6HgR8JZT(nlnKM+T*Ol4~O9%84B#GK47&wvh~HR-czeM~RoD?S&M|cSyzWC*P|@ z8cc6)Excc_IP`aQK0lIN6WdBpidu7_WDk{LiyJpqqJE+YD8{=h_2X4#6lz6nO}(|U z_!!0GjS6UHELC`=ly>_*XvER##<}UihL+22mj7dav4A(_&rPD5b$P)@#wt)@tbHXcVzLpz@+*RC3-?GBk3WR|S{^L*hZs zKCW!`k(BpjFe*HBtJ)-M{mLGCk@+es*{Bl89n zjycO)v0XS-yB5@)c7hB(P3Jj(s#)etzJY9YKOvm0+_lQG&W}(;ssa$IK465)pGdS@ zNyka!&8WrKQOLu|jk>WlOXH8$7Ypmg;DQQIQ{GzOA3U#Q1F2j7SOc@6dIh8d28US9{{Cw zVpkdI{vG~8{%8Q+`f=P%ITeD=L{si@MKVb?6~`c1t}{to ziX2POguQ+^!rEaP*ygTW%{K=*sUe;&5JO40Q3RyJ3>ZiW2{0?3(v{NFV5dpvuyFY)^vD2dCx)Uj`+X^bso7-fwtTONwP^(n>2Dnn4Kh{-+`vg0%V_&$4936Klp~VdaJh zHRWTRG)oL!ma+va&3MLp?SnMZaOD=%FpW$Yh*{*R31L>WEV3ChIA)tA5RQ0!9SM}6 zK~Ocg&-uq{CVF$MxD`WIg(4e5rR$TB{mWp^OF~I%GM zCoRMfyuxQvVVPzBO4jEvp{unSVq_tZNH;-(2^&ZR7k3!>e52Z; zwe6Nx(FP(@2|Tliq$^Jvg9p5g8}Ec-NNO_%?)|VjBJDmTHb4eF*R$^ItV$ZryMGSOT#f1$3tH~ z)Y1nk%?Xf-4Ph84AXq%yC^65CN=adeH6#c+0?nf=UAR&kZWaJa02P1)Kq3g2--eKU z-i{#Z_d)KBlQ2nyb1WezZgJx0VB?WZ)z~14_IZSsi8Jx%l#K2Fvcp?es7{Pw6=>48 zK%y-E3nAwElGRVILVHy~MV}vcMif;VtU#4ttzuU!F^RtJje0d=7{<=BqE%N!wu-Z9 z?|elwhL(19#aU%zS`l9kS#Fof0~Oq53g)X8ZT5Jw6(YMt7R)n0@4jmkzgbY?#!T$M zq>HbrkyL?aD2Z5Gn;qN~20pW$16*;(VsX6vs7F@}>SS4EmNadbk&h`#(N z~r&SW-i(30;RQncIVg?%@eGE?zEhw_8JUOIOvkxLO315F%|V~_2uC)SF29;3g% zktI8W5+5qz=%2wuQB1BBUJQKM0p`Q~ID%;uTTPj??vh0{ zO7^@hwe!P{bVarad9v`t9QWnwM>u23jFWh4VRT9qwZEcV-v66dQYR8xe=(%1Vd92I z_K<>|BK-y)A0o5LV5yV~E3}$HMcG!`!|Cw0KNO~%SdvLycUi()ZfGcKkI3U+6;-1d z$x|x@CNI1srJ_t z-A5`I)yTW&n?H4)(Oio>xw#liuuSYnk~81Q&K04o*H`U}6igzh^u|*tg4Il+BBTEx zAVOryJ-;(j>E`k>Vv(9&OjMX-N7RaYSVH6|5QfoM*N;R`Jg zM<*(86M;k(lyHRV)~$2BJkejHTO#>^E$$L1$MwMJaSSV|-`T?xyV-RnEpxAyJiDZ3 zFo3K?qtrR*GVviWpPtbXRRy`#y3Y`@9Fhr$;N**l&|@LhM+6}`xV02f@XI)JY{6^6 zC8dulx~K%67k%Olkw-VIkV0C9o=IQr8WN{jGx4D!C;Z}7%2t#cKG5{r-7uTDA@GVwt%{2IwN=A|&yZAH~6vljW{%t%%Qxo0vmsRx-dnuue2XtO2o;?+exG0UB8LX%A;DF4)B8scxZL82mX zc`5OQu*?19%PPw66zMz5dWr{<8!9A1*QeD@E;3$H@(fE5M{wg>k5#cNlW+eNVR#t3 zut|gR_Wk~-_qWOLq&4L)Cn9O;<(J(`8~P6=1Ya9?^zM28ZZiS2Zpm_3?BeK2rRMB@*#PDaL})hNvk?DouM7Q1aQsx4`9z8q2g>MWDHL@`ZHc(QHf z?{`jY{n3KUcMog!qaTwIqbI#+7rkUFjE0h+N=?&bo1j)>i463!A{idRYa`Kt8 zq-CN)RT-g2*;0_T(ID38#7)iR9kbh32-(b+P?obXF5(MIlM<{nb5=th%6I* zM-)iT(uNqGTV3W1#32Ei>B0m?(lI&HvW)~jB7?-$YNQe_Wri5_QAN$XEXw9KkFRo{ z8A<6wFd=iWQw0zaRg2Aym7j+gGRh0}>FFpHjOv#zg!+c6)KC46T1m6LG=^hz+&O%v z%*!?1&zO9wMl$<$G$@lSuZ>o*^!u2o<=3x01<_+xs`Nd<)O<+S&`mcI#LC63Zg=J( zndL&2BeZ-%)j{^s<~jC#4xCt;EY#qK(TY2?lH@Lloe6KS+Jjpe>PT;RJu+#@$2!fv zx#CQttyvOi9*aN92qPaa^F$|I%K6Qj(=EkpLX4ufu*DlAN;Ki5No6w0osk1L)%qjJ zaKV9Kl7ZA7e;H^pZOJZiW?0t(9BikaS^*4u&+~*Y^=dPX2`EL#q8nwukfXE@NEE}@ zD2v0Ar50-lq%_{h`N9&>$QOYLF1onW$QU_b(@rWfQ=VN{F?GInDrv92v&-d(O$ABA zM3ydP;)_shRDsID4JDKF)xA@?60*NfNh1Q2tRt#Ap`tFsFbZ51%g!kbkl?E+AUObZ z$l_Oyd#x;nTkIIpH$7ARAf;}MYh7Y35F&3Y2{7sUtU~|=YXA5;7{#Hx7XN?$kN=ec z7E5M!aF=$^+EAUIl&FenJv*xKqM_GP)~cBz8z)#eVG1fvS4I+=+GeJ?_x9o$q?6Ev z3zO@|rZa}G-%1phF24y~U*&Eu4^?_OO|D2nrD+9OyaYInHH+?XiUgS*xg-(%T=Xtc z&5=)8Pt+?jf)+k@;>}lcbHvTj16IpD#wd^C#6QDVB7>b*_-MBGQl)W)kWYh~6`E6n z-0Cp*+l;V6nR!vw1Pz(P5RL*59qgAlU@m+m9V*kx= zix`46k|@~*oho>0qa$dG9FL1#^zVArDk6bpPr>Uemkuq~W3w?OLws==l<|L%L;4{l zYW`5eHu8=^krdb=2$sXNnUqT!(Q@XBK5agfEj2htc}u0e^Lb#%x<)+V5qAX_Nb*7{@vXCVNT9}? z$^JbA?68I(%yzQ|P125Gva2b1__7K zB#QW}I?)vVpoF`0V%1eBP@R^|1*%wYTNob)hd9K&?@gSj};U1)1+0CS(^+=8p7O?DZ;l(A4O-IWKg#I z%coB5D?`hteaqj#ww)mHvM763e!9{{T}da>8m#1;hpc?==*2z5`86N7f~f00N;iLR zal7^c-W8bDo75|qDFOJJN!Z;9Z8n?_V!7ZO00#aHm5g~r=y$_S$6nedWOiuJAJ#!-eAtADyI5>pUu z7|~+aGRg@{{kAh_trU9=#PUv+xxpnwRrGHzBx-K685&54oB~IeAKj&vg)q9ahG`9b zmWy@T%JAw(4q>rBu!XiOprnlMU7QvWx6t^FmXlTp>_P04H>D?!AW~s?l#i4hE;uFj zO4ViN8pCL8o7he04Xi1irhbMYNkN1U?Bb~yDl$N|es?c#BMNEaAg>9b`x$6QXxR)FEy)BkRTQE?s7+PrF!2CnxATv?9bC zz9!{{RrQc0&V>q*IJE34Hc<35Oxu&`g$R;qc~PEd&D{1nb}{J&lQc-Zd_`jdqvamr zLM)uIln7%8kwa7xz{)C4NOhFoiK7ZJHviKP3XI^POcyK0IRt)jgyOzWU?N1ZgHjjl zimGbf5|LDBP)OJl_*nM~pV3Kw=?!=)UxLELLwgn>&5W~2Azqpg{V*!9Nzhm87-*`b zAkI5u%rj@mj~E{jc-FFvTPNZcYMGy8aZiYd#1c?esb1D!V@^-4w$UksN|Xygs&JI$ zM7*VyUypcXM#U6DkCT!Hm`|I9u#3WWrPYo8L{cZDB|s4_Mn5cSb z%RNMrS3ygrjD)TqWT9muPNflF)FgA_yVJr4!JH2*G=B$MJZiG#QG$aAgQnPV5r54?&V=eP=96vg4RR(mGA04)8cgM9M}c%C(}9 zBZm?DRQ+`G6I~fKK~g0i){B>T!CVYz**H1Pxl*gRly?5mTT5$EP5ZQAL9_UKlufwe zd>|!5tF7h#iK!0aCUVr%aP*e?^`6v$I~1PsMvN~oSa8^{(a^ysMp;P?O&Z!+C>GfI zt47U4RhJOcSs&|?_^^~&RXe;}<>H1})!9j}#Pgk3m%1J@Z6=|JzXIKTVT>}4{;}&D z%1~UL&{CJdLmv^&Ho-}gMzkTZACg1<7GacW+qvY^jIr}@dy47jsoS%%M2L>uv(PH4 z&MWedMi{$4Q3ctulSS0j9)h?e^w&Dd#vqSr9DJNqPh&wPjhDJvu?d^e55M~FUTLM7 z{ViN6k~LBvymd_8p7rRL8%3yPyD^8|^A>`{B?LZ(9CcCQ1;j`^il+&Vpke#K?nelB0$yk3pf;H$U8a~g zCKFJHYH)=e(+{dCLAbG4ia!Y$W$WMCVObV6v zw86m)ot%;TDzs~t_fEc%B&*WU zx;8;5nLiIghXu1wB6UIvmHz3?KAs66ql;1~pSluF86?z1)xebzNvSIfQ^_*>l`F*z zy2jBM9*e2@swZ@ErE+>Vjf-mFx}GA>DMTf9=fHH`d&6CORQOP0l7WO1fA$fJ}cZQCEJu z`^JOm#$U+1cae1bf}A~9CFo1L(Ux+`364yr2o{9 zh74u*>i5GUC^V$97fE>9(k zMCsTVJ&}@nDTI3suIq3pXob~yY9WyogtXgoQjC*`z<7aCd$A|W{bjw!x%S;=Ee#%s zs^W&13X@5XLU+BXTj=2n)KEcisG0)Cvim!QS5HTeP>qRH`|!ftje13x>jeY~T-*;d zY%*O!ShLJ3CT4ytApw@hj~@l!G%$vFCEKbtFerm9@UxAbC&Ef>$)3{;9wp1aQiK}> z#^_N`HIBPkMnXax7s+iECZO?%N2|Brry*eThDfw=uqHm>VdP(#P9Hm_7)ol;(#OKH z6fq3aDw%%I6d?i8b%!nrg0(2pgb>4B6}Z5WDw}Q334)?;0!Nl0Ne-QN9zc~zv?RDH z8R^2<)E7>%a6yG2j*Ce6>HE1dF5JS*$l{C^OkIHULg0yYlET{D(-Buig9HzgEb$Pz z)Et%;LC6S^aN)$A5y|3$V7){h_9H8GIBDY&XZR(s*q;hD0x%0O`sfP>i6(dNEGh-Y z;#kra)H{wy!16}Ibu~e=`H~EKjYOYJ9!gQ{9$>g!?`i5=65F+C!Dp8nx$Oi)GifTq zSmj?=g@|#~+#vXTMPe9@VT@KS7A2<2=hr?PCV^&@_Nh3mc(TiglVG<)=Uf)Sl66Ac zz@T7B>Rt`aapvF(kP8qZX{K zb;;!*knv5wu?7ag*GmdWsT9-dvLrAxL33yn$aF5LB9hFnSjB;1;+GYD#f^r|pr>Ej z%Qh-Sz>qK$NxGIuYzm9v4_$h-i>O%f<`wxO&V%Eq5UF~Q!7(1527`zqy$1vggC@u% zWKDYI6=Em^0S7O%6f!7u|M)tn#iL&o{?h)l0R#m!yYe7HiS=UMy0@|-;xaf=WY?y$ zN2dcvtg3e5aM`qpQ@@%{V!R~c(JD^~J|lJ(L5prkMl1>(OKzi5;n5caEcvxm5@B~# z5-`ORuLy@okaDlTfuCUlO}a)|a4sx|XZG1c^PCi;>9hd_A02u(lRCB%BMLI^^}4LUkr zY`A0CMv82!a!F4j`mx%0Akk+heQe7-A?S7Tb*JvLj5Q^A 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 z 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 literal 0 HcmV?d00001 diff --git a/media/res/bbb_flac_stereo_680kbps_48000hz.info b/media/res/bbb_flac_stereo_680kbps_48000hz.info new file mode 100644 index 0000000000..c57243079d --- /dev/null +++ b/media/res/bbb_flac_stereo_680kbps_48000hz.info @@ -0,0 +1,415 @@ +42 128 0 +1386 32 0 +2401 32 24000 +2321 32 48000 +2367 32 72000 +2370 32 96000 +2334 32 120000 +2396 32 144000 +2375 32 168000 +2431 32 192000 +2428 32 216000 +2334 32 240000 +2261 32 264000 +2124 32 288000 +2152 32 312000 +2295 32 336000 +2183 32 360000 +2393 32 384000 +2400 32 408000 +2246 32 432000 +2289 32 456000 +2400 32 480000 +2335 32 504000 +2294 32 528000 +2260 32 552000 +2206 32 576000 +2185 32 600000 +2155 32 624000 +2118 32 648000 +2094 32 672000 +2050 32 696000 +2059 32 720000 +2030 32 744000 +2022 32 768000 +2078 32 792000 +2082 32 816000 +2094 32 840000 +2111 32 864000 +2043 32 888000 +2023 32 912000 +2024 32 936000 +2056 32 960000 +2108 32 984000 +2138 32 1008000 +2140 32 1032000 +2111 32 1056000 +2110 32 1080000 +2137 32 1104000 +2157 32 1128000 +2174 32 1152000 +2200 32 1176000 +2203 32 1200000 +2237 32 1224000 +2261 32 1248000 +2215 32 1272000 +2133 32 1296000 +2091 32 1320000 +2088 32 1344000 +2122 32 1368000 +2139 32 1392000 +2146 32 1416000 +2231 32 1440000 +2282 32 1464000 +2273 32 1488000 +2304 32 1512000 +2292 32 1536000 +2255 32 1560000 +2181 32 1584000 +2081 32 1608000 +2012 32 1632000 +2011 32 1656000 +2066 32 1680000 +2069 32 1704000 +2120 32 1728000 +2141 32 1752000 +2148 32 1776000 +2181 32 1800000 +2176 32 1824000 +2240 32 1848000 +2297 32 1872000 +2325 32 1896000 +2336 32 1920000 +2329 32 1944000 +2299 32 1968000 +2322 32 1992000 +2347 32 2016000 +2287 32 2040000 +2286 32 2064000 +2269 32 2088000 +2320 32 2112000 +2305 32 2136000 +2384 32 2160000 +2429 32 2184000 +2370 32 2208000 +2365 32 2232000 +2361 32 2256000 +2370 32 2280000 +2393 32 2304000 +2342 32 2328000 +2325 32 2352000 +2334 32 2376000 +2316 32 2400000 +2317 32 2424000 +2305 32 2448000 +2360 32 2472000 +2331 32 2496000 +2332 32 2520000 +2361 32 2544000 +2417 32 2568000 +2438 32 2592000 +2403 32 2616000 +2386 32 2640000 +2382 32 2664000 +2350 32 2688000 +2355 32 2712000 +2383 32 2736000 +2384 32 2760000 +2383 32 2784000 +2373 32 2808000 +2374 32 2832000 +2347 32 2856000 +2353 32 2880000 +2381 32 2904000 +2401 32 2928000 +2401 32 2952000 +2385 32 2976000 +2382 32 3000000 +2328 32 3024000 +2303 32 3048000 +2272 32 3072000 +2270 32 3096000 +2312 32 3120000 +2273 32 3144000 +2330 32 3168000 +2339 32 3192000 +2296 32 3216000 +2317 32 3240000 +2440 32 3264000 +2353 32 3288000 +2346 32 3312000 +2303 32 3336000 +2308 32 3360000 +2287 32 3384000 +2316 32 3408000 +2367 32 3432000 +2335 32 3456000 +2350 32 3480000 +2395 32 3504000 +2408 32 3528000 +2413 32 3552000 +2415 32 3576000 +2468 32 3600000 +2437 32 3624000 +2372 32 3648000 +2371 32 3672000 +2341 32 3696000 +2328 32 3720000 +2273 32 3744000 +2244 32 3768000 +2233 32 3792000 +2229 32 3816000 +2252 32 3840000 +2236 32 3864000 +2217 32 3888000 +2179 32 3912000 +2251 32 3936000 +2192 32 3960000 +2199 32 3984000 +2212 32 4008000 +2190 32 4032000 +2102 32 4056000 +2120 32 4080000 +2167 32 4104000 +2024 32 4128000 +2010 32 4152000 +2067 32 4176000 +2035 32 4200000 +2051 32 4224000 +2012 32 4248000 +2066 32 4272000 +2025 32 4296000 +1987 32 4320000 +1972 32 4344000 +1966 32 4368000 +1999 32 4392000 +1987 32 4416000 +1922 32 4440000 +2020 32 4464000 +2072 32 4488000 +2021 32 4512000 +2017 32 4536000 +2099 32 4560000 +2064 32 4584000 +2109 32 4608000 +2093 32 4632000 +2090 32 4656000 +2148 32 4680000 +2184 32 4704000 +2179 32 4728000 +2152 32 4752000 +2143 32 4776000 +2159 32 4800000 +2123 32 4824000 +2129 32 4848000 +2147 32 4872000 +2192 32 4896000 +2051 32 4920000 +2116 32 4944000 +2124 32 4968000 +2088 32 4992000 +2073 32 5016000 +2146 32 5040000 +2133 32 5064000 +2073 32 5088000 +2059 32 5112000 +2044 32 5136000 +2012 32 5160000 +2034 32 5184000 +2053 32 5208000 +2013 32 5232000 +1981 32 5256000 +2094 32 5280000 +2076 32 5304000 +1968 32 5328000 +2028 32 5352000 +2031 32 5376000 +2020 32 5400000 +2019 32 5424000 +2030 32 5448000 +2015 32 5472000 +1962 32 5496000 +2070 32 5520000 +2087 32 5544000 +1964 32 5568000 +2069 32 5592000 +2034 32 5616000 +1994 32 5640000 +1985 32 5664000 +2030 32 5688000 +2066 32 5712000 +1954 32 5736000 +1733 32 5760000 +1649 32 5784000 +1652 32 5808000 +1631 32 5832000 +1656 32 5856000 +1672 32 5880000 +1667 32 5904000 +1696 32 5928000 +1672 32 5952000 +1701 32 5976000 +1651 32 6000000 +1674 32 6024000 +1695 32 6048000 +1702 32 6072000 +1707 32 6096000 +1694 32 6120000 +1727 32 6144000 +1730 32 6168000 +1708 32 6192000 +1704 32 6216000 +1735 32 6240000 +1758 32 6264000 +1753 32 6288000 +1748 32 6312000 +1763 32 6336000 +1737 32 6360000 +1783 32 6384000 +1839 32 6408000 +1861 32 6432000 +1832 32 6456000 +1947 32 6480000 +1939 32 6504000 +1926 32 6528000 +1896 32 6552000 +1909 32 6576000 +1869 32 6600000 +1900 32 6624000 +1896 32 6648000 +1883 32 6672000 +1903 32 6696000 +1895 32 6720000 +1865 32 6744000 +1878 32 6768000 +1881 32 6792000 +1861 32 6816000 +1791 32 6840000 +1787 32 6864000 +1798 32 6888000 +1811 32 6912000 +1824 32 6936000 +1895 32 6960000 +2079 32 6984000 +2034 32 7008000 +2038 32 7032000 +2018 32 7056000 +2030 32 7080000 +2067 32 7104000 +1982 32 7128000 +1911 32 7152000 +1904 32 7176000 +1874 32 7200000 +1876 32 7224000 +1944 32 7248000 +1977 32 7272000 +1977 32 7296000 +1979 32 7320000 +2012 32 7344000 +1961 32 7368000 +1773 32 7392000 +1780 32 7416000 +1801 32 7440000 +1892 32 7464000 +1869 32 7488000 +1936 32 7512000 +2154 32 7536000 +2226 32 7560000 +2159 32 7584000 +2253 32 7608000 +2286 32 7632000 +2214 32 7656000 +2111 32 7680000 +2027 32 7704000 +1994 32 7728000 +1882 32 7752000 +1887 32 7776000 +1993 32 7800000 +1962 32 7824000 +1982 32 7848000 +1966 32 7872000 +1962 32 7896000 +1928 32 7920000 +1878 32 7944000 +1857 32 7968000 +1885 32 7992000 +1919 32 8016000 +1904 32 8040000 +1909 32 8064000 +1909 32 8088000 +1933 32 8112000 +1824 32 8136000 +1756 32 8160000 +1733 32 8184000 +1705 32 8208000 +1755 32 8232000 +1756 32 8256000 +1725 32 8280000 +1761 32 8304000 +1736 32 8328000 +1706 32 8352000 +1662 32 8376000 +1604 32 8400000 +1613 32 8424000 +1692 32 8448000 +1736 32 8472000 +1779 32 8496000 +1768 32 8520000 +1758 32 8544000 +1708 32 8568000 +1642 32 8592000 +1645 32 8616000 +1581 32 8640000 +1651 32 8664000 +1731 32 8688000 +1743 32 8712000 +1717 32 8736000 +1715 32 8760000 +1646 32 8784000 +1551 32 8808000 +1563 32 8832000 +1649 32 8856000 +1742 32 8880000 +1724 32 8904000 +1676 32 8928000 +1664 32 8952000 +1587 32 8976000 +1497 32 9000000 +1503 32 9024000 +1644 32 9048000 +1658 32 9072000 +1680 32 9096000 +1611 32 9120000 +1694 32 9144000 +1668 32 9168000 +1677 32 9192000 +1604 32 9216000 +1567 32 9240000 +1639 32 9264000 +1552 32 9288000 +1486 32 9312000 +1494 32 9336000 +1480 32 9360000 +1509 32 9384000 +1457 32 9408000 +1423 32 9432000 +1459 32 9456000 +1444 32 9480000 +1424 32 9504000 +1413 32 9528000 +1498 32 9552000 +1455 32 9576000 +1393 32 9600000 +1638 32 9624000 +1919 32 9648000 +1979 32 9672000 +1894 32 9696000 +2002 32 9720000 +2062 32 9744000 +2098 32 9768000 +1919 32 9792000 +1738 32 9816000 +1890 32 9840000 +1971 32 9864000 +2429 32 9888000 +1861 32 9912000 From 2f499a9ba8c18361a87152e0ba7ebc07f9dbeb60 Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Tue, 19 Sep 2017 19:59:45 -0700 Subject: [PATCH 232/265] Add negative tests to the Neuralnetworks HAL This CL adds negative tests to: * IDevice::getSupportedOperations * IDevice::prepareModel * IPreparedModel::execute It does not make sense to have negative tests for the remaining HAL entries: * IDevice::getStatus (all returned values are valid) * IDevice::getCapabilities (no input or state) * IEvent::notify (synchronization callback primitive) Bug: 63905942 Test: mm, running on sample driver has expected output Change-Id: Ia3cf5ce05dd07ff3f688395b8d0e581851909028 --- neuralnetworks/1.0/vts/functional/Android.bp | 1 + neuralnetworks/1.0/vts/functional/Models.cpp | 210 +++++++++++++ neuralnetworks/1.0/vts/functional/Models.h | 43 +++ .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 275 ++++++++---------- .../VtsHalNeuralnetworksV1_0TargetTest.h | 2 + 5 files changed, 383 insertions(+), 148 deletions(-) create mode 100644 neuralnetworks/1.0/vts/functional/Models.cpp create mode 100644 neuralnetworks/1.0/vts/functional/Models.h diff --git a/neuralnetworks/1.0/vts/functional/Android.bp b/neuralnetworks/1.0/vts/functional/Android.bp index 2318430020..89e1021153 100644 --- a/neuralnetworks/1.0/vts/functional/Android.bp +++ b/neuralnetworks/1.0/vts/functional/Android.bp @@ -19,6 +19,7 @@ cc_test { srcs: [ "Event.cpp", "GeneratedTestHarness.cpp", + "Models.cpp", "VtsHalNeuralnetworksV1_0TargetTest.cpp", ], defaults: ["VtsHalTargetTestDefaults"], diff --git a/neuralnetworks/1.0/vts/functional/Models.cpp b/neuralnetworks/1.0/vts/functional/Models.cpp new file mode 100644 index 0000000000..9802f62131 --- /dev/null +++ b/neuralnetworks/1.0/vts/functional/Models.cpp @@ -0,0 +1,210 @@ +/* + * Copyright (C) 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 "neuralnetworks_hidl_hal_test" + +#include "Models.h" +#include +#include +#include + +namespace android { +namespace hardware { +namespace neuralnetworks { +namespace V1_0 { +namespace vts { +namespace functional { + +// create a valid model +Model createValidTestModel() { + const std::vector operand2Data = {5.0f, 6.0f, 7.0f, 8.0f}; + const uint32_t size = operand2Data.size() * sizeof(float); + + const uint32_t operand1 = 0; + const uint32_t operand2 = 1; + const uint32_t operand3 = 2; + const uint32_t operand4 = 3; + + const std::vector operands = { + { + .type = OperandType::TENSOR_FLOAT32, + .dimensions = {1, 2, 2, 1}, + .numberOfConsumers = 1, + .scale = 0.0f, + .zeroPoint = 0, + .lifetime = OperandLifeTime::MODEL_INPUT, + .location = {.poolIndex = 0, .offset = 0, .length = 0}, + }, + { + .type = OperandType::TENSOR_FLOAT32, + .dimensions = {1, 2, 2, 1}, + .numberOfConsumers = 1, + .scale = 0.0f, + .zeroPoint = 0, + .lifetime = OperandLifeTime::CONSTANT_COPY, + .location = {.poolIndex = 0, .offset = 0, .length = size}, + }, + { + .type = OperandType::INT32, + .dimensions = {}, + .numberOfConsumers = 1, + .scale = 0.0f, + .zeroPoint = 0, + .lifetime = OperandLifeTime::CONSTANT_COPY, + .location = {.poolIndex = 0, .offset = size, .length = sizeof(int32_t)}, + }, + { + .type = OperandType::TENSOR_FLOAT32, + .dimensions = {1, 2, 2, 1}, + .numberOfConsumers = 0, + .scale = 0.0f, + .zeroPoint = 0, + .lifetime = OperandLifeTime::MODEL_OUTPUT, + .location = {.poolIndex = 0, .offset = 0, .length = 0}, + }, + }; + + const std::vector operations = {{ + .opTuple = {OperationType::ADD, OperandType::TENSOR_FLOAT32}, + .inputs = {operand1, operand2, operand3}, + .outputs = {operand4}, + }}; + + const std::vector inputIndexes = {operand1}; + const std::vector outputIndexes = {operand4}; + std::vector operandValues( + reinterpret_cast(operand2Data.data()), + reinterpret_cast(operand2Data.data()) + size); + int32_t activation[1] = {static_cast(FusedActivationFunc::NONE)}; + operandValues.insert(operandValues.end(), reinterpret_cast(&activation[0]), + reinterpret_cast(&activation[1])); + + const std::vector pools = {}; + + return { + .operands = operands, + .operations = operations, + .inputIndexes = inputIndexes, + .outputIndexes = outputIndexes, + .operandValues = operandValues, + .pools = pools, + }; +} + +// create first invalid model +Model createInvalidTestModel1() { + Model model = createValidTestModel(); + model.operations[0].opTuple = {static_cast(0xDEADBEEF) /* INVALID */, + OperandType::TENSOR_FLOAT32}; + return model; +} + +// create second invalid model +Model createInvalidTestModel2() { + Model model = createValidTestModel(); + const uint32_t operand1 = 0; + const uint32_t operand5 = 4; // INVALID OPERAND + model.inputIndexes = std::vector({operand1, operand5 /* INVALID OPERAND */}); + return model; +} + +// allocator helper +hidl_memory allocateSharedMemory(int64_t size, const std::string& type = "ashmem") { + hidl_memory memory; + + sp allocator = IAllocator::getService(type); + if (!allocator.get()) { + return {}; + } + + Return ret = allocator->allocate(size, [&](bool success, const hidl_memory& mem) { + ASSERT_TRUE(success); + memory = mem; + }); + if (!ret.isOk()) { + return {}; + } + + return memory; +} + +// create a valid request +Request createValidTestRequest() { + std::vector inputData = {1.0f, 2.0f, 3.0f, 4.0f}; + std::vector outputData = {-1.0f, -1.0f, -1.0f, -1.0f}; + const uint32_t INPUT = 0; + const uint32_t OUTPUT = 1; + + // prepare inputs + uint32_t inputSize = static_cast(inputData.size() * sizeof(float)); + uint32_t outputSize = static_cast(outputData.size() * sizeof(float)); + std::vector inputs = {{ + .location = {.poolIndex = INPUT, .offset = 0, .length = inputSize}, .dimensions = {}, + }}; + std::vector outputs = {{ + .location = {.poolIndex = OUTPUT, .offset = 0, .length = outputSize}, .dimensions = {}, + }}; + std::vector pools = {allocateSharedMemory(inputSize), + allocateSharedMemory(outputSize)}; + if (pools[INPUT].size() == 0 || pools[OUTPUT].size() == 0) { + return {}; + } + + // load data + sp inputMemory = mapMemory(pools[INPUT]); + sp outputMemory = mapMemory(pools[OUTPUT]); + if (inputMemory.get() == nullptr || outputMemory.get() == nullptr) { + return {}; + } + float* inputPtr = reinterpret_cast(static_cast(inputMemory->getPointer())); + float* outputPtr = reinterpret_cast(static_cast(outputMemory->getPointer())); + if (inputPtr == nullptr || outputPtr == nullptr) { + return {}; + } + inputMemory->update(); + outputMemory->update(); + std::copy(inputData.begin(), inputData.end(), inputPtr); + std::copy(outputData.begin(), outputData.end(), outputPtr); + inputMemory->commit(); + outputMemory->commit(); + + return {.inputs = inputs, .outputs = outputs, .pools = pools}; +} + +// create first invalid request +Request createInvalidTestRequest1() { + Request request = createValidTestRequest(); + const uint32_t INVALID = 2; + std::vector inputData = {1.0f, 2.0f, 3.0f, 4.0f}; + uint32_t inputSize = static_cast(inputData.size() * sizeof(float)); + request.inputs[0].location = { + .poolIndex = INVALID /* INVALID */, .offset = 0, .length = inputSize}; + return request; +} + +// create second invalid request +Request createInvalidTestRequest2() { + Request request = createValidTestRequest(); + request.inputs[0].dimensions = std::vector({1, 2, 3, 4, 5, 6, 7, 8} /* INVALID */); + return request; +} + +} // namespace functional +} // namespace vts +} // namespace V1_0 +} // namespace neuralnetworks +} // namespace hardware +} // namespace android diff --git a/neuralnetworks/1.0/vts/functional/Models.h b/neuralnetworks/1.0/vts/functional/Models.h new file mode 100644 index 0000000000..e0d57d533b --- /dev/null +++ b/neuralnetworks/1.0/vts/functional/Models.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 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 "neuralnetworks_hidl_hal_test" + +#include "VtsHalNeuralnetworksV1_0TargetTest.h" + +namespace android { +namespace hardware { +namespace neuralnetworks { +namespace V1_0 { +namespace vts { +namespace functional { + +// create the model +Model createValidTestModel(); +Model createInvalidTestModel1(); +Model createInvalidTestModel2(); + +// create the request +Request createValidTestRequest(); +Request createInvalidTestRequest1(); +Request createInvalidTestRequest2(); + +} // namespace functional +} // namespace vts +} // namespace V1_0 +} // namespace neuralnetworks +} // namespace hardware +} // namespace android diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp index 453e3e57bb..59d66bab2b 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -18,6 +18,7 @@ #include "VtsHalNeuralnetworksV1_0TargetTest.h" #include "Event.h" +#include "Models.h" #include "TestHarness.h" #include @@ -65,6 +66,32 @@ void NeuralnetworksHidlTest::SetUp() { void NeuralnetworksHidlTest::TearDown() {} +sp NeuralnetworksHidlTest::doPrepareModelShortcut(const Model& model) { + sp preparedModel; + ErrorStatus prepareStatus; + sp preparationEvent = new Event(); + if (preparationEvent.get() == nullptr) { + return nullptr; + } + + Return prepareRet = device->prepareModel( + model, preparationEvent, [&](ErrorStatus status, const sp& prepared) { + prepareStatus = status; + preparedModel = prepared; + }); + + if (!prepareRet.isOk() || prepareStatus != ErrorStatus::NONE || + preparedModel.get() == nullptr) { + return nullptr; + } + Event::Status eventStatus = preparationEvent->wait(); + if (eventStatus != Event::Status::SUCCESS) { + return nullptr; + } + + return preparedModel; +} + // create device test TEST_F(NeuralnetworksHidlTest, CreateDevice) {} @@ -91,107 +118,9 @@ TEST_F(NeuralnetworksHidlTest, GetCapabilitiesTest) { EXPECT_TRUE(ret.isOk()); } -namespace { -// create the model -Model createTestModel() { - const std::vector operand2Data = {5.0f, 6.0f, 7.0f, 8.0f}; - const uint32_t size = operand2Data.size() * sizeof(float); - - const uint32_t operand1 = 0; - const uint32_t operand2 = 1; - const uint32_t operand3 = 2; - const uint32_t operand4 = 3; - - const std::vector operands = { - { - .type = OperandType::TENSOR_FLOAT32, - .dimensions = {1, 2, 2, 1}, - .numberOfConsumers = 1, - .scale = 0.0f, - .zeroPoint = 0, - .lifetime = OperandLifeTime::MODEL_INPUT, - .location = {.poolIndex = 0, .offset = 0, .length = 0}, - }, - { - .type = OperandType::TENSOR_FLOAT32, - .dimensions = {1, 2, 2, 1}, - .numberOfConsumers = 1, - .scale = 0.0f, - .zeroPoint = 0, - .lifetime = OperandLifeTime::CONSTANT_COPY, - .location = {.poolIndex = 0, .offset = 0, .length = size}, - }, - { - .type = OperandType::INT32, - .dimensions = {}, - .numberOfConsumers = 1, - .scale = 0.0f, - .zeroPoint = 0, - .lifetime = OperandLifeTime::CONSTANT_COPY, - .location = {.poolIndex = 0, .offset = size, .length = sizeof(int32_t)}, - }, - { - .type = OperandType::TENSOR_FLOAT32, - .dimensions = {1, 2, 2, 1}, - .numberOfConsumers = 0, - .scale = 0.0f, - .zeroPoint = 0, - .lifetime = OperandLifeTime::MODEL_OUTPUT, - .location = {.poolIndex = 0, .offset = 0, .length = 0}, - }, - }; - - const std::vector operations = {{ - .opTuple = {OperationType::ADD, OperandType::TENSOR_FLOAT32}, - .inputs = {operand1, operand2, operand3}, - .outputs = {operand4}, - }}; - - const std::vector inputIndexes = {operand1}; - const std::vector outputIndexes = {operand4}; - std::vector operandValues( - reinterpret_cast(operand2Data.data()), - reinterpret_cast(operand2Data.data()) + size); - int32_t activation[1] = {static_cast(FusedActivationFunc::NONE)}; - operandValues.insert(operandValues.end(), reinterpret_cast(&activation[0]), - reinterpret_cast(&activation[1])); - - const std::vector pools = {}; - - return { - .operands = operands, - .operations = operations, - .inputIndexes = inputIndexes, - .outputIndexes = outputIndexes, - .operandValues = operandValues, - .pools = pools, - }; -} -} // anonymous namespace - -// allocator helper -hidl_memory allocateSharedMemory(int64_t size, const std::string& type = "ashmem") { - hidl_memory memory; - - sp allocator = IAllocator::getService(type); - if (!allocator.get()) { - return {}; - } - - Return ret = allocator->allocate(size, [&](bool success, const hidl_memory& mem) { - ASSERT_TRUE(success); - memory = mem; - }); - if (!ret.isOk()) { - return {}; - } - - return memory; -} - -// supported subgraph test -TEST_F(NeuralnetworksHidlTest, SupportedOperationsTest) { - Model model = createTestModel(); +// supported operations positive test +TEST_F(NeuralnetworksHidlTest, SupportedOperationsPositiveTest) { + Model model = createValidTestModel(); Return ret = device->getSupportedOperations( model, [&](ErrorStatus status, const hidl_vec& supported) { EXPECT_EQ(ErrorStatus::NONE, status); @@ -200,76 +129,126 @@ TEST_F(NeuralnetworksHidlTest, SupportedOperationsTest) { EXPECT_TRUE(ret.isOk()); } -// execute simple graph -TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphTest) { - std::vector inputData = {1.0f, 2.0f, 3.0f, 4.0f}; - std::vector outputData = {-1.0f, -1.0f, -1.0f, -1.0f}; - std::vector expectedData = {6.0f, 8.0f, 10.0f, 12.0f}; - const uint32_t INPUT = 0; - const uint32_t OUTPUT = 1; +// supported operations negative test 1 +TEST_F(NeuralnetworksHidlTest, SupportedOperationsNegativeTest1) { + Model model = createInvalidTestModel1(); + Return ret = device->getSupportedOperations( + model, [&](ErrorStatus status, const hidl_vec& supported) { + EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, status); + (void)supported; + }); + EXPECT_TRUE(ret.isOk()); +} - // prepare request - Model model = createTestModel(); - sp preparedModel; +// supported operations negative test 2 +TEST_F(NeuralnetworksHidlTest, SupportedOperationsNegativeTest2) { + Model model = createInvalidTestModel2(); + Return ret = device->getSupportedOperations( + model, [&](ErrorStatus status, const hidl_vec& supported) { + EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, status); + (void)supported; + }); + EXPECT_TRUE(ret.isOk()); +} + +// prepare simple model positive test +TEST_F(NeuralnetworksHidlTest, SimplePrepareModelPositiveTest) { + Model model = createValidTestModel(); sp preparationEvent = new Event(); ASSERT_NE(nullptr, preparationEvent.get()); Return prepareRet = device->prepareModel( model, preparationEvent, [&](ErrorStatus status, const sp& prepared) { EXPECT_EQ(ErrorStatus::NONE, status); - preparedModel = prepared; + (void)prepared; }); ASSERT_TRUE(prepareRet.isOk()); +} + +// prepare simple model negative test 1 +TEST_F(NeuralnetworksHidlTest, SimplePrepareModelNegativeTest1) { + Model model = createInvalidTestModel1(); + sp preparationEvent = new Event(); + ASSERT_NE(nullptr, preparationEvent.get()); + Return prepareRet = device->prepareModel( + model, preparationEvent, [&](ErrorStatus status, const sp& prepared) { + EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, status); + (void)prepared; + }); + ASSERT_TRUE(prepareRet.isOk()); +} + +// prepare simple model negative test 2 +TEST_F(NeuralnetworksHidlTest, SimplePrepareModelNegativeTest2) { + Model model = createInvalidTestModel2(); + sp preparationEvent = new Event(); + ASSERT_NE(nullptr, preparationEvent.get()); + Return prepareRet = device->prepareModel( + model, preparationEvent, [&](ErrorStatus status, const sp& prepared) { + EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, status); + (void)prepared; + }); + ASSERT_TRUE(prepareRet.isOk()); +} + +// execute simple graph positive test +TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphPositiveTest) { + Model model = createValidTestModel(); + sp preparedModel = doPrepareModelShortcut(model); ASSERT_NE(nullptr, preparedModel.get()); - Event::Status preparationStatus = preparationEvent->wait(); - EXPECT_EQ(Event::Status::SUCCESS, preparationStatus); + Request request = createValidTestRequest(); - // prepare inputs - uint32_t inputSize = static_cast(inputData.size() * sizeof(float)); - uint32_t outputSize = static_cast(outputData.size() * sizeof(float)); - std::vector inputs = {{ - .location = {.poolIndex = INPUT, .offset = 0, .length = inputSize}, .dimensions = {}, - }}; - std::vector outputs = {{ - .location = {.poolIndex = OUTPUT, .offset = 0, .length = outputSize}, .dimensions = {}, - }}; - std::vector pools = {allocateSharedMemory(inputSize), - allocateSharedMemory(outputSize)}; - ASSERT_NE(0ull, pools[INPUT].size()); - ASSERT_NE(0ull, pools[OUTPUT].size()); - - // load data - sp inputMemory = mapMemory(pools[INPUT]); - sp outputMemory = mapMemory(pools[OUTPUT]); - ASSERT_NE(nullptr, inputMemory.get()); - ASSERT_NE(nullptr, outputMemory.get()); - float* inputPtr = reinterpret_cast(static_cast(inputMemory->getPointer())); - float* outputPtr = reinterpret_cast(static_cast(outputMemory->getPointer())); - ASSERT_NE(nullptr, inputPtr); - ASSERT_NE(nullptr, outputPtr); - inputMemory->update(); - outputMemory->update(); - std::copy(inputData.begin(), inputData.end(), inputPtr); - std::copy(outputData.begin(), outputData.end(), outputPtr); - inputMemory->commit(); - outputMemory->commit(); - - // execute request sp executionEvent = new Event(); ASSERT_NE(nullptr, executionEvent.get()); - Return executeStatus = preparedModel->execute( - {.inputs = inputs, .outputs = outputs, .pools = pools}, executionEvent); + Return executeStatus = preparedModel->execute(request, executionEvent); ASSERT_TRUE(executeStatus.isOk()); EXPECT_EQ(ErrorStatus::NONE, static_cast(executeStatus)); Event::Status eventStatus = executionEvent->wait(); EXPECT_EQ(Event::Status::SUCCESS, eventStatus); - // validate results { 1+5, 2+6, 3+7, 4+8 } + std::vector outputData = {-1.0f, -1.0f, -1.0f, -1.0f}; + std::vector expectedData = {6.0f, 8.0f, 10.0f, 12.0f}; + const uint32_t OUTPUT = 1; + + sp outputMemory = mapMemory(request.pools[OUTPUT]); + ASSERT_NE(nullptr, outputMemory.get()); + float* outputPtr = reinterpret_cast(static_cast(outputMemory->getPointer())); + ASSERT_NE(nullptr, outputPtr); outputMemory->read(); std::copy(outputPtr, outputPtr + outputData.size(), outputData.begin()); outputMemory->commit(); EXPECT_EQ(expectedData, outputData); } +// execute simple graph negative test 1 +TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphNegativeTest1) { + Model model = createValidTestModel(); + sp preparedModel = doPrepareModelShortcut(model); + ASSERT_NE(nullptr, preparedModel.get()); + Request request = createInvalidTestRequest1(); + + sp executionEvent = new Event(); + ASSERT_NE(nullptr, executionEvent.get()); + Return executeStatus = preparedModel->execute(request, executionEvent); + ASSERT_TRUE(executeStatus.isOk()); + EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, static_cast(executeStatus)); + executionEvent->wait(); +} + +// execute simple graph negative test 2 +TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphNegativeTest2) { + Model model = createValidTestModel(); + sp preparedModel = doPrepareModelShortcut(model); + ASSERT_NE(nullptr, preparedModel.get()); + Request request = createInvalidTestRequest2(); + + sp executionEvent = new Event(); + ASSERT_NE(nullptr, executionEvent.get()); + Return executeStatus = preparedModel->execute(request, executionEvent); + ASSERT_TRUE(executeStatus.isOk()); + EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, static_cast(executeStatus)); + executionEvent->wait(); +} + // Mixed-typed examples typedef MixedTypedExampleType MixedTypedExample; diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h index 9c56e6a118..1b3b3342d1 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h @@ -72,6 +72,8 @@ class NeuralnetworksHidlTest : public ::testing::VtsHalHidlTargetTestBase { void SetUp() override; void TearDown() override; + sp doPrepareModelShortcut(const Model& model); + sp device; }; From f1fbb442dcddafefc06e507812f243b0b7a7f3f8 Mon Sep 17 00:00:00 2001 From: Suresh Sivaraman Date: Fri, 15 Sep 2017 11:51:15 +0530 Subject: [PATCH 233/265] Added VTS tests for MediaCas Bug: 63914034 Bug: 65593293 Change-Id: I1064ac14513508d2f821a1a27dafcc7389b1a691 --- cas/1.0/vts/functional/Android.bp | 23 +++ .../functional/VtsHalCasV1_0TargetTest.cpp | 147 ++++++++++++++++++ cas/Android.bp | 1 + 3 files changed, 171 insertions(+) create mode 100644 cas/1.0/vts/functional/Android.bp create mode 100644 cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp diff --git a/cas/1.0/vts/functional/Android.bp b/cas/1.0/vts/functional/Android.bp new file mode 100644 index 0000000000..d601235d80 --- /dev/null +++ b/cas/1.0/vts/functional/Android.bp @@ -0,0 +1,23 @@ +// +// Copyright (C) 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. +// + +cc_test { + name: "VtsHalCasV1_0TargetTest", + defaults: ["VtsHalTargetTestDefaults"], + srcs: ["VtsHalCasV1_0TargetTest.cpp"], + static_libs: ["android.hardware.cas@1.0"], +} + diff --git a/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp b/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp new file mode 100644 index 0000000000..f346bae982 --- /dev/null +++ b/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp @@ -0,0 +1,147 @@ +/* + * Copyright (C) 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 "mediacas_hidl_hal_test" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +// CA System Ids used for testing +#define CLEAR_KEY_SYSTEM_ID 0xF6D8 +#define INVALID_SYSTEM_ID 0 + +using android::Condition; +using android::hardware::cas::V1_0::ICas; +using android::hardware::cas::V1_0::ICasListener; +using android::hardware::cas::V1_0::IDescramblerBase; +using android::hardware::cas::V1_0::IMediaCasService; +using android::hardware::cas::V1_0::HidlCasPluginDescriptor; +using android::hardware::Void; +using android::hardware::hidl_vec; +using android::hardware::Return; +using android::Mutex; +using android::sp; + +namespace { + +class MediaCasHidlTest : public ::testing::VtsHalHidlTargetTestBase { + public: + virtual void SetUp() override { + mService = ::testing::VtsHalHidlTargetTestBase::getService(); + ASSERT_NE(mService, nullptr); + } + + sp mService; + + protected: + static void description(const std::string& description) { + RecordProperty("description", description); + } +}; + +class MediaCasListener : public ICasListener { + public: + virtual ::android::hardware::Return onEvent( + int32_t event, int32_t arg, const ::android::hardware::hidl_vec& data) override { + ALOGI("Info: received event: %d, arg: %d, size: %zu", event, arg, data.size()); + + return Void(); + } +}; + +TEST_F(MediaCasHidlTest, EnumeratePlugins) { + description("Test enumerate plugins"); + hidl_vec descriptors; + EXPECT_TRUE(mService + ->enumeratePlugins([&descriptors]( + hidl_vec const& desc) { descriptors = desc; }) + .isOk()); + + if (descriptors.size() == 0) { + ALOGW("[ WARN ] enumeratePlugins list empty"); + return; + } + + sp casListener = new MediaCasListener(); + for (size_t i = 0; i < descriptors.size(); i++) { + int32_t caSystemId = descriptors[i].caSystemId; + bool status = mService->isSystemIdSupported(caSystemId); + ASSERT_EQ(status, true); + + status = mService->isDescramblerSupported(caSystemId); + ASSERT_EQ(status, true); + + sp mediaCas = mService->createPlugin(caSystemId, casListener); + ASSERT_NE(mediaCas, nullptr); + + sp descramblerBase = mService->createDescrambler(caSystemId); + ASSERT_NE(descramblerBase, nullptr); + } +} + +TEST_F(MediaCasHidlTest, TestInvalidSystemIdFails) { + description("Test failure for invalid system ID"); + sp casListener = new MediaCasListener(); + + ASSERT_FALSE(mService->isSystemIdSupported(INVALID_SYSTEM_ID)); + ASSERT_FALSE(mService->isDescramblerSupported(INVALID_SYSTEM_ID)); + + sp mediaCas = mService->createPlugin(INVALID_SYSTEM_ID, casListener); + EXPECT_EQ(mediaCas, nullptr); + + sp descramblerBase = mService->createDescrambler(INVALID_SYSTEM_ID); + EXPECT_EQ(descramblerBase, nullptr); +} + +TEST_F(MediaCasHidlTest, TestClearKeyPluginInstalled) { + description("Test if ClearKey plugin is installed"); + hidl_vec descriptors; + EXPECT_TRUE(mService + ->enumeratePlugins([&descriptors]( + hidl_vec const& _desc) { descriptors = _desc; }) + .isOk()); + + if (descriptors.size() == 0) { + ALOGW("[ WARN ] enumeratePlugins list empty"); + } + + for (size_t i = 0; i < descriptors.size(); i++) { + int32_t caSystemId = descriptors[i].caSystemId; + if (CLEAR_KEY_SYSTEM_ID == caSystemId) { + return; + } + } + + ASSERT_TRUE(false) << "ClearKey plugin not installed"; +} + +} // anonymous namespace + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + int status = RUN_ALL_TESTS(); + LOG(INFO) << "Test result = " << status; + return status; +} diff --git a/cas/Android.bp b/cas/Android.bp index 57532a0841..8208d3d51e 100644 --- a/cas/Android.bp +++ b/cas/Android.bp @@ -1,6 +1,7 @@ // This is an autogenerated file, do not edit. subdirs = [ "1.0", + "1.0/vts/functional", "1.0/default", "native/1.0", ] From f6b85506fecb7ff2b66e47f451443d8f557c8cb0 Mon Sep 17 00:00:00 2001 From: "I-Jui (Ray) Sung" Date: Wed, 20 Sep 2017 13:45:50 -0700 Subject: [PATCH 234/265] Downgrade generated test harness for NDK libc++ NDK libc++ does not yet support full C++14. This CL replaced use of std::get with type as well as auto lambda arguments with equivalent C++11 constructs in the VTS test harness for NNAPI. Test: VtsHalNeuralnetworksV1_0TargetTest Bug: 63905942 Change-Id: If75e7c088e9221a70bcc47bc647e0dd7b045bfa1 --- .../vts/functional/GeneratedTestHarness.cpp | 54 ++++++++----------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp index db90ac2267..4b8daec432 100644 --- a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp @@ -42,6 +42,24 @@ using ::generated_tests::MixedTypedExampleType; using ::generated_tests::Float32Operands; using ::generated_tests::Int32Operands; using ::generated_tests::Quant8Operands; +using ::generated_tests::compare; + +template +void copy_back_(MixedTyped* dst, const std::vector& ra, char* src) { + MixedTyped& test = *dst; + for_each(test, [&ra, src](int index, std::vector& m) { + ASSERT_EQ(m.size(), ra[index].location.length / sizeof(ty)); + char* begin = src + ra[index].location.offset; + memcpy(m.data(), begin, ra[index].location.length); + }); +} + +void copy_back(MixedTyped* dst, const std::vector& ra, char* src) { + copy_back_(dst, ra, src); + copy_back_(dst, ra, src); + copy_back_(dst, ra, src); +} + // Top level driver for models and examples generated by test_generator.py // Test driver for those generated from ml/nn/runtime/test/spec void Execute(const sp& device, std::function create_model, @@ -97,9 +115,7 @@ void Execute(const sp& device, std::function create_model, MixedTyped test; // holding test results // Go through all outputs, initialize RequestArgument descriptors - resize_accordingly(golden, test); - resize_accordingly(golden, test); - resize_accordingly(golden, test); + resize_accordingly(golden, test); for_all(golden, [&outputs_info, &outputSize](int index, auto, auto s) { if (outputs_info.size() <= static_cast(index)) outputs_info.resize(index + 1); RequestArgument arg = { @@ -156,40 +172,16 @@ void Execute(const sp& device, std::function create_model, // validate results outputMemory->read(); -#define COPY_BACK(ty) \ - for_each(test, [&outputs_info, outputPtr](int index, std::vector& m) { \ - RequestArgument& i = outputs_info[index]; \ - ASSERT_EQ(m.size(), i.location.length / sizeof(ty)); \ - char* begin = outputPtr + i.location.offset; \ - memcpy(m.data(), begin, i.location.length); \ - }); - COPY_BACK(float); - COPY_BACK(int32_t); - COPY_BACK(uint8_t); -#undef COPY_BACK + copy_back(&test, outputs_info, outputPtr); outputMemory->commit(); // Filter out don't cares MixedTyped filtered_golden; MixedTyped filtered_test; - filter(golden, &filtered_golden, is_ignored); - filter(test, &filtered_test, is_ignored); - filter(golden, &filtered_golden, is_ignored); - filter(test, &filtered_test, is_ignored); - filter(golden, &filtered_golden, is_ignored); - filter(test, &filtered_test, is_ignored); + filter(golden, &filtered_golden, is_ignored); + filter(test, &filtered_test, is_ignored); // We want "close-enough" results for float - for_each(filtered_golden, [&filtered_test](int index, auto& golden_float) { - auto& test_float_operands = std::get(filtered_test); - auto& test_float = test_float_operands[index]; - for (unsigned int i = 0; i < golden_float.size(); i++) { - SCOPED_TRACE(i); - EXPECT_NEAR(golden_float[i], test_float[i], 1.e-5); - } - }); - EXPECT_EQ(std::get(filtered_golden), std::get(filtered_test)); - EXPECT_EQ(std::get(filtered_golden), - std::get(filtered_test)); + compare(filtered_golden, filtered_test); } } From 926df1e1823e633090a2248be0f1ac66933750ed Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Tue, 19 Sep 2017 16:26:47 -0700 Subject: [PATCH 235/265] Removed WIP tag from Neuralnetworks HAL Additionally cleaned up some comments and formatting. Bug: 63905942 Test: not needed Change-Id: I0306f6d37f3c9ce9b365b5f838c27e81fa001ccd --- neuralnetworks/1.0/IDevice.hal | 32 +++++++++++++++++++-------- neuralnetworks/1.0/IEvent.hal | 8 ++++--- neuralnetworks/1.0/IPreparedModel.hal | 11 ++++++--- neuralnetworks/1.0/types.hal | 14 +++++++++--- 4 files changed, 47 insertions(+), 18 deletions(-) diff --git a/neuralnetworks/1.0/IDevice.hal b/neuralnetworks/1.0/IDevice.hal index b6f94330a2..91a9555b6d 100644 --- a/neuralnetworks/1.0/IDevice.hal +++ b/neuralnetworks/1.0/IDevice.hal @@ -14,8 +14,6 @@ * limitations under the License. */ -/* This HAL is a work in progress */ - package android.hardware.neuralnetworks@1.0; import IEvent; @@ -28,7 +26,10 @@ interface IDevice { /** * Gets the capabilities of a driver. * - * @return status ErrorStatus::NONE if successful. + * @return status Error status of the call, must be: + * - NONE if successful + * - DEVICE_UNAVAILABLE if driver is offline or busy + * - GENERAL_FAILURE if there is an unspecified error * @return capabilities Capabilities of the driver. */ getCapabilities() generates (ErrorStatus status, Capabilities capabilities); @@ -43,7 +44,11 @@ interface IDevice { * * @param model A model whose operations--and their corresponding * operands--are to be verified by the driver. - * @return status ErrorStatus::NONE if successful. + * @return status Error status of the call, must be: + * - NONE if successful + * - DEVICE_UNAVAILABLE if driver is offline or busy + * - GENERAL_FAILURE if there is an unspecified error + * - INVALID_ARGUMENT when provided model is invalid * @return supportedOperations A list of supported operations, where true * indicates the operation is supported and * false indicates the operation is not @@ -52,7 +57,7 @@ interface IDevice { * it is describing. */ getSupportedOperations(Model model) - generates (ErrorStatus status, vec supportedOperations); + generates (ErrorStatus status, vec supportedOperations); /** * Prepares a model for execution. @@ -60,7 +65,7 @@ interface IDevice { * prepareModel is used to make any necessary transformations or alternative * representations to a model for execution, possible including * transformations on the constant data, optimization on the model's graph, - * or compilation into the device's native binary. + * or compilation into the device's native binary format. * * The only information that may be unknown to the model at this stage is * the shape of the tensors, which may only be known at execution time. @@ -68,16 +73,25 @@ interface IDevice { * @param model The model to be prepared for execution. * @param event A synchronization callback that must be signaled once the * execution has finished. - * @return status ErrorStatus::NONE if successful. + * @return status Error status of the call, must be: + * - NONE if preparation task is successfully launched + * - DEVICE_UNAVAILABLE if driver is offline or busy + * - GENERAL_FAILURE if there is an unspecified error + * - INVALID_ARGUMENT when one of the input arguments is + * invalid * @return preparedModel A handle to the resultant prepared model. */ prepareModel(Model model, IEvent event) - generates (ErrorStatus status, IPreparedModel preparedModel); + generates (ErrorStatus status, IPreparedModel preparedModel); /** * Returns the current status of a driver. * - * @return status Status of the driver. + * @return status Status of the driver, one of: + * - DeviceStatus::AVAILABLE + * - DeviceStatus::BUSY + * - DeviceStatus::OFFLINE + * - DeviceStatus::UNKNOWN */ getStatus() generates (DeviceStatus status); }; diff --git a/neuralnetworks/1.0/IEvent.hal b/neuralnetworks/1.0/IEvent.hal index 2ebda58948..2fe454c1cd 100644 --- a/neuralnetworks/1.0/IEvent.hal +++ b/neuralnetworks/1.0/IEvent.hal @@ -14,8 +14,6 @@ * limitations under the License. */ -/* This HAL is a work in progress */ - package android.hardware.neuralnetworks@1.0; /** @@ -37,7 +35,11 @@ interface IEvent { * the work) to mark the event as completed so that any threads requiring * the corresponding output can continue executing. * - * @param status ErrorStatus::NONE if successful. + * @param status Error status returned from the asynchronous task, must be: + * - NONE if asynchronous task was successful + * - DEVICE_UNAVAILABLE if driver is offline or busy + * - GENERAL_FAILURE if the asynchronous task resulted in an + * unspecified error */ oneway notify(ErrorStatus status); }; diff --git a/neuralnetworks/1.0/IPreparedModel.hal b/neuralnetworks/1.0/IPreparedModel.hal index a7c3342093..5df883e1d2 100644 --- a/neuralnetworks/1.0/IPreparedModel.hal +++ b/neuralnetworks/1.0/IPreparedModel.hal @@ -36,11 +36,16 @@ interface IPreparedModel { * * @param request The input and output information on which the prepared * model is to be executed. - * prepared model. * @param event A callback used for synchronization that must be signaled * once the execution has finished. - * @return status ErrorStatus::NONE if the asynchronous task was - * successfully launched. + * @return status Error status of the call, must be: + * - NONE if task is successfully launched + * - DEVICE_UNAVAILABLE if driver is offline or busy + * - GENERAL_FAILURE if there is an unspecified error + * - OUTPUT_INSUFFICIENT_SIZE if provided output buffer is + * not large enough to store the resultant values + * - INVALID_ARGUMENT when one of the input arguments is + * invalid */ execute(Request request, IEvent event) generates (ErrorStatus status); }; diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index 39e3d345c0..537331bb88 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -218,7 +218,7 @@ enum OperationType : int32_t { * * Inputs: * 0: A 4-D tensor, of shape [batches, height, width, depth_in], specifying the input. - * 1: A 4-D tensor, of shape [depth_out, filter_height, filter_width, depth_in], + * 1: A 4-D tensor, of shape [1, filter_height, filter_width, depth_out], * specifying the filter. * 2: A 1-D tensor, of shape [depth_out], specifying the bias. * For input tensor of {@link OperandType::TENSOR_FLOAT32} type, the bias should @@ -1105,14 +1105,16 @@ struct Operand { /** * Quantized scale of the operand. * - * Only applicable if the operand is of type TENSOR_QUANT8_ASYMM. + * Only applicable if the operand is of type TENSOR_QUANT8_ASYMM or + * TENSOR_INT32. */ float scale; /** * Quantized zero-point offset of the operand. * - * Only applicable if the operand is of type TENSOR_QUANT8_ASYMM. + * Only applicable if the operand is of type TENSOR_QUANT8_ASYMM or + * TENSOR_INT32. */ int32_t zeroPoint; @@ -1195,12 +1197,18 @@ struct Model { /** * A byte buffer containing operand data that were copied into the model. + * + * An operand's value must be located here if and only if Operand::lifetime + * equals OperandLifeTime::CONSTANT_COPY. */ vec operandValues; /** * A collection of shared memory pools containing operand data that were * registered by the model. + * + * An operand's value must be located here if and only if Operand::lifetime + * equals OperandLifeTime::CONSTANT_REFERENCE. */ vec pools; }; From 39ac22e90857eb980e81d9dbbae6d41b3cfdf055 Mon Sep 17 00:00:00 2001 From: Jean-Luc Brouillet Date: Sat, 23 Sep 2017 15:15:58 -0700 Subject: [PATCH 236/265] Remove operationTuple. Removed operationTuple from Model in the HAL, as the data type was redundant information. Removed supportedOperationTuples from Capabilities, as real drivers need more complex restrictions than this provided. For the OC-MR1, we'll just rely on getSupportedNodes. Also removed the unused cachesCompilation. Bug: 63905942 Test: Compiled and ran tests. Change-Id: I15f33d14634f2e1c8d726b1bd01d5b9e123b47ea --- neuralnetworks/1.0/types.hal | 33 ++----------------- neuralnetworks/1.0/vts/functional/Models.cpp | 7 ++-- .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 3 -- 3 files changed, 4 insertions(+), 39 deletions(-) diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index 537331bb88..54ed4020ad 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -1002,21 +1002,6 @@ enum DeviceStatus : int32_t { UNKNOWN, }; -/** - * A typed operation. - */ -struct OperationTuple { - /** - * The type of operation. - */ - OperationType operationType; - - /** - * The input data type of operation. - */ - OperandType operandType; -}; - /** * Performance information for the reference workload. * @@ -1038,20 +1023,6 @@ struct PerformanceInfo { * The capabilities of a driver. */ struct Capabilities { - /** - * A collection of typed operations supported by the driver. - */ - vec supportedOperationTuples; - - /** - * Indicates whether a driver caches its prepared model for reuse the next - * time the application begins. This is useful because the model may have - * been prepared in a previous run. - * - * True if caching is supported, false otherwise. - */ - bool cachesCompilation; - /** * Driver performance when operating on float32 data. */ @@ -1144,9 +1115,9 @@ struct Operand { */ struct Operation { /** - * The tuple describing the operation type and input type. + * The operation type. */ - OperationTuple opTuple; + OperationType type; /** * Describes the table that contains the indexes of the inputs of the diff --git a/neuralnetworks/1.0/vts/functional/Models.cpp b/neuralnetworks/1.0/vts/functional/Models.cpp index 9802f62131..8ce4f25938 100644 --- a/neuralnetworks/1.0/vts/functional/Models.cpp +++ b/neuralnetworks/1.0/vts/functional/Models.cpp @@ -78,9 +78,7 @@ Model createValidTestModel() { }; const std::vector operations = {{ - .opTuple = {OperationType::ADD, OperandType::TENSOR_FLOAT32}, - .inputs = {operand1, operand2, operand3}, - .outputs = {operand4}, + .type = OperationType::ADD, .inputs = {operand1, operand2, operand3}, .outputs = {operand4}, }}; const std::vector inputIndexes = {operand1}; @@ -107,8 +105,7 @@ Model createValidTestModel() { // create first invalid model Model createInvalidTestModel1() { Model model = createValidTestModel(); - model.operations[0].opTuple = {static_cast(0xDEADBEEF) /* INVALID */, - OperandType::TENSOR_FLOAT32}; + model.operations[0].type = static_cast(0xDEADBEEF); /* INVALID */ return model; } diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp index 59d66bab2b..0f354d1b73 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -107,9 +107,6 @@ TEST_F(NeuralnetworksHidlTest, GetCapabilitiesTest) { Return ret = device->getCapabilities([](ErrorStatus status, const Capabilities& capabilities) { EXPECT_EQ(ErrorStatus::NONE, status); - EXPECT_NE(nullptr, capabilities.supportedOperationTuples.data()); - EXPECT_NE(0ull, capabilities.supportedOperationTuples.size()); - EXPECT_EQ(0u, static_cast(capabilities.cachesCompilation) & ~0x1); EXPECT_LT(0.0f, capabilities.float32Performance.execTime); EXPECT_LT(0.0f, capabilities.float32Performance.powerUsage); EXPECT_LT(0.0f, capabilities.quantized8Performance.execTime); From 62e3e4bd1ac6dafcf88b43c9d1febee1a061e49d Mon Sep 17 00:00:00 2001 From: Erik Kline Date: Tue, 12 Sep 2017 16:21:55 +0900 Subject: [PATCH 237/265] Tweaks to tetheroffload VTS: fixes and fd leaks Specifically: - always use hidl_handle::setTo(..., true) to force fd ownership (and thereby cleanup in hidl_handle destructor) - initialize config HAL multiple times to try to trigger fd leaking bugs Test: as follows - make vts -j30 BUILD_GOOGLE_VTS=true && \ vts-tradefed run commandAndExit vts \ --skip-all-system-status-check \ --primary-abi-only \ --skip-preconditions \ --module VtsHalTetherOffloadConfigV1_0Target -l INFO I/ResultReporter: Invocation finished in 48s. PASSED: 4, FAILED: 0, MODULES: 1 of 1 - make vts -j30 BUILD_GOOGLE_VTS=true && \ vts-tradefed run commandAndExit vts \ --skip-all-system-status-check \ --primary-abi-only \ --skip-preconditions \ --module VtsHalTetherOffloadControlV1_0Target -l INFO Bug: 29337859 Bug: 32163131 Bug: 64976634 Bug: 65270149 Bug: 65529504 Change-Id: Ib47b35a01092bb2052d241f7bba951bbf7691b66 --- ...tsHalTetheroffloadConfigV1_0TargetTest.cpp | 59 +++++++++++-------- ...sHalTetheroffloadControlV1_0TargetTest.cpp | 6 +- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/tetheroffload/config/1.0/vts/functional/VtsHalTetheroffloadConfigV1_0TargetTest.cpp b/tetheroffload/config/1.0/vts/functional/VtsHalTetheroffloadConfigV1_0TargetTest.cpp index fc61e1c1c0..2cbe479dc9 100644 --- a/tetheroffload/config/1.0/vts/functional/VtsHalTetheroffloadConfigV1_0TargetTest.cpp +++ b/tetheroffload/config/1.0/vts/functional/VtsHalTetheroffloadConfigV1_0TargetTest.cpp @@ -91,35 +91,42 @@ class OffloadConfigHidlTest : public testing::VtsHalHidlTargetTestBase { // Ensure handles can be set with correct socket options. TEST_F(OffloadConfigHidlTest, TestSetHandles) { - unique_fd fd1(netlinkSocket(kFd1Groups)); - if (fd1.get() < 0) { - ALOGE("Unable to create conntrack handles: %d/%s", errno, strerror(errno)); - FAIL(); - } - native_handle_t* const nativeHandle1 = native_handle_create(1, 0); - nativeHandle1->data[0] = fd1.release(); - const hidl_handle h1 = hidl_handle(nativeHandle1); + // Try multiple times in a row to see if it provokes file descriptor leaks. + for (int i = 0; i < 1024; i++) { + unique_fd fd1(netlinkSocket(kFd1Groups)); + if (fd1.get() < 0) { + ALOGE("Unable to create conntrack handles: %d/%s", errno, strerror(errno)); + FAIL(); + } + native_handle_t* const nativeHandle1 = native_handle_create(1, 0); + nativeHandle1->data[0] = fd1.release(); + hidl_handle h1; + h1.setTo(nativeHandle1, true); - unique_fd fd2(netlinkSocket(kFd2Groups)); - if (fd2.get() < 0) { - ALOGE("Unable to create conntrack handles: %d/%s", errno, strerror(errno)); - FAIL(); - } - native_handle_t* const nativeHandle2 = native_handle_create(1, 0); - nativeHandle2->data[0] = fd2.release(); - const hidl_handle h2 = hidl_handle(nativeHandle2); + unique_fd fd2(netlinkSocket(kFd2Groups)); + if (fd2.get() < 0) { + ALOGE("Unable to create conntrack handles: %d/%s", errno, strerror(errno)); + FAIL(); + } + native_handle_t* const nativeHandle2 = native_handle_create(1, 0); + nativeHandle2->data[0] = fd2.release(); + hidl_handle h2; + h2.setTo(nativeHandle2, true); - const Return ret = config->setHandles(h1, h2, ASSERT_TRUE_CALLBACK); - ASSERT_TRUE(ret.isOk()); + const Return ret = config->setHandles(h1, h2, ASSERT_TRUE_CALLBACK); + ASSERT_TRUE(ret.isOk()); + } } // Passing a handle without an associated file descriptor should return an error // (e.g. "Failed Input Checks"). Check that this occurs when both FDs are empty. TEST_F(OffloadConfigHidlTest, TestSetHandleNone) { native_handle_t* const nativeHandle1 = native_handle_create(0, 0); - const hidl_handle h1 = hidl_handle(nativeHandle1); + hidl_handle h1; + h1.setTo(nativeHandle1, true); native_handle_t* const nativeHandle2 = native_handle_create(0, 0); - const hidl_handle h2 = hidl_handle(nativeHandle2); + hidl_handle h2; + h2.setTo(nativeHandle2, true); const Return ret = config->setHandles(h1, h2, ASSERT_FALSE_CALLBACK); ASSERT_TRUE(ret.isOk()); @@ -135,10 +142,12 @@ TEST_F(OffloadConfigHidlTest, TestSetHandle1Only) { } native_handle_t* const nativeHandle1 = native_handle_create(1, 0); nativeHandle1->data[0] = fd1.release(); - const hidl_handle h1 = hidl_handle(nativeHandle1); + hidl_handle h1; + h1.setTo(nativeHandle1, true); native_handle_t* const nativeHandle2 = native_handle_create(0, 0); - const hidl_handle h2 = hidl_handle(nativeHandle2); + hidl_handle h2; + h2.setTo(nativeHandle2, true); const Return ret = config->setHandles(h1, h2, ASSERT_FALSE_CALLBACK); ASSERT_TRUE(ret.isOk()); @@ -148,7 +157,8 @@ TEST_F(OffloadConfigHidlTest, TestSetHandle1Only) { // (e.g. "Failed Input Checks"). Check that this occurs when FD1 is empty. TEST_F(OffloadConfigHidlTest, TestSetHandle2OnlyNotOk) { native_handle_t* const nativeHandle1 = native_handle_create(0, 0); - const hidl_handle h1 = hidl_handle(nativeHandle1); + hidl_handle h1; + h1.setTo(nativeHandle1, true); unique_fd fd2(netlinkSocket(kFd2Groups)); if (fd2.get() < 0) { @@ -157,7 +167,8 @@ TEST_F(OffloadConfigHidlTest, TestSetHandle2OnlyNotOk) { } native_handle_t* const nativeHandle2 = native_handle_create(1, 0); nativeHandle2->data[0] = fd2.release(); - const hidl_handle h2 = hidl_handle(nativeHandle2); + hidl_handle h2; + h2.setTo(nativeHandle2, true); const Return ret = config->setHandles(h1, h2, ASSERT_FALSE_CALLBACK); ASSERT_TRUE(ret.isOk()); diff --git a/tetheroffload/control/1.0/vts/functional/VtsHalTetheroffloadControlV1_0TargetTest.cpp b/tetheroffload/control/1.0/vts/functional/VtsHalTetheroffloadControlV1_0TargetTest.cpp index 3059eac0c2..a9424bc5aa 100644 --- a/tetheroffload/control/1.0/vts/functional/VtsHalTetheroffloadControlV1_0TargetTest.cpp +++ b/tetheroffload/control/1.0/vts/functional/VtsHalTetheroffloadControlV1_0TargetTest.cpp @@ -127,7 +127,8 @@ class OffloadControlHidlTestBase : public testing::VtsHalHidlTargetTestBase { } native_handle_t* const nativeHandle1 = native_handle_create(1, 0); nativeHandle1->data[0] = fd1.release(); - hidl_handle h1 = hidl_handle(nativeHandle1); + hidl_handle h1; + h1.setTo(nativeHandle1, true); unique_fd fd2(conntrackSocket(NFNLGRP_CONNTRACK_UPDATE | NFNLGRP_CONNTRACK_DESTROY)); if (fd2.get() < 0) { @@ -136,7 +137,8 @@ class OffloadControlHidlTestBase : public testing::VtsHalHidlTargetTestBase { } native_handle_t* const nativeHandle2 = native_handle_create(1, 0); nativeHandle2->data[0] = fd2.release(); - hidl_handle h2 = hidl_handle(nativeHandle2); + hidl_handle h2; + h2.setTo(nativeHandle2, true); const Return ret = config->setHandles(h1, h2, ASSERT_TRUE_CALLBACK); ASSERT_TRUE(ret.isOk()); From fe46a352433342d2217a97e315166097a6f806c1 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Tue, 26 Sep 2017 17:59:10 -0700 Subject: [PATCH 238/265] Update makefiles for transitive interfaces. Transitive includes accidentally added by hidl-gen were getting added to import lists. This import isn't actually required and is now properly excluded from hidl-gen update makefiles. Bug: 65055216 Test: none Change-Id: I4fb4de8ef5547a3081cd55b3c75f6288cc518ba6 --- camera/provider/2.4/Android.bp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/camera/provider/2.4/Android.bp b/camera/provider/2.4/Android.bp index 40f759438a..71057ce52f 100644 --- a/camera/provider/2.4/Android.bp +++ b/camera/provider/2.4/Android.bp @@ -62,7 +62,6 @@ cc_library { "android.hardware.camera.common@1.0", "android.hardware.camera.device@1.0", "android.hardware.camera.device@3.2", - "android.hardware.graphics.common@1.0", ], export_shared_lib_headers: [ "libhidlbase", @@ -72,7 +71,6 @@ cc_library { "android.hardware.camera.common@1.0", "android.hardware.camera.device@1.0", "android.hardware.camera.device@3.2", - "android.hardware.graphics.common@1.0", ], } @@ -122,7 +120,6 @@ cc_library { "android.hardware.camera.device@1.0", "android.hardware.camera.device@3.2", "android.hardware.camera.provider@2.4", - "android.hardware.graphics.common@1.0", "android.hardware.camera.device@1.0-adapter-helper", "android.hardware.camera.device@3.2-adapter-helper", "android.hidl.base@1.0-adapter-helper", @@ -137,7 +134,6 @@ cc_library { "android.hardware.camera.device@1.0", "android.hardware.camera.device@3.2", "android.hardware.camera.provider@2.4", - "android.hardware.graphics.common@1.0", "android.hardware.camera.device@1.0-adapter-helper", "android.hardware.camera.device@3.2-adapter-helper", "android.hidl.base@1.0-adapter-helper", @@ -162,7 +158,6 @@ cc_test { "android.hardware.camera.device@1.0", "android.hardware.camera.device@3.2", "android.hardware.camera.provider@2.4", - "android.hardware.graphics.common@1.0", "android.hardware.camera.provider@2.4-adapter-helper", ], generated_sources: ["android.hardware.camera.provider@2.4-adapter_genc++"], From b451490514160a40962663cce17775aa18a19e06 Mon Sep 17 00:00:00 2001 From: Erik Kline Date: Tue, 26 Sep 2017 18:56:35 +0900 Subject: [PATCH 239/265] More tetheroffload VTS fixes for over-specified tests. [1] Call addDownstream before removeDownstream in affirmative tests In order to properly test removeDownstream() where the HAL might reasonably reject downstreams not previously added we now call addDownstream() first (for affirmative tests). [2] Clarify when stopOffload() return values can be safely ignored. Test: as follows - make vts -j30 BUILD_GOOGLE_VTS=true && \ vts-tradefed run commandAndExit vts \ --skip-all-system-status-check \ --primary-abi-only \ --skip-preconditions \ --module VtsHalTetherOffloadControlV1_0Target \ -l DEBUG still doesn't pass but it's better than before :) Bug: 65270149 Change-Id: I27a574bd2110e3a1626de343f6b57b9efb8cdf83 --- ...sHalTetheroffloadControlV1_0TargetTest.cpp | 63 ++++++++++++++----- 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/tetheroffload/control/1.0/vts/functional/VtsHalTetheroffloadControlV1_0TargetTest.cpp b/tetheroffload/control/1.0/vts/functional/VtsHalTetheroffloadControlV1_0TargetTest.cpp index a9424bc5aa..52dd026a87 100644 --- a/tetheroffload/control/1.0/vts/functional/VtsHalTetheroffloadControlV1_0TargetTest.cpp +++ b/tetheroffload/control/1.0/vts/functional/VtsHalTetheroffloadControlV1_0TargetTest.cpp @@ -46,6 +46,12 @@ using android::hardware::tetheroffload::control::V1_0::NetworkProtocol; using android::hardware::Void; using android::sp; +enum class ExpectBoolean { + Ignored = -1, + False = 0, + True = 1, +}; + // We use #defines here so as to get local lamba captures and error message line numbers #define ASSERT_TRUE_CALLBACK \ [&](bool success, std::string errMsg) { \ @@ -112,7 +118,12 @@ class OffloadControlHidlTestBase : public testing::VtsHalHidlTargetTestBase { prepareControlHal(); } - virtual void TearDown() override { stopOffload(false); } + virtual void TearDown() override { + // For good measure, we should try stopOffload() once more. Since we + // don't know where we are in HAL call test cycle we don't know what + // return code to actually expect, so we just ignore it. + stopOffload(ExpectBoolean::Ignored); + } // The IOffloadConfig HAL is tested more thoroughly elsewhere. He we just // setup everything correctly and verify basic readiness. @@ -168,12 +179,21 @@ class OffloadControlHidlTestBase : public testing::VtsHalHidlTargetTestBase { initOffload(true); } - void stopOffload(const bool expected_result) { + void stopOffload(const ExpectBoolean value) { auto cb = [&](bool success, const hidl_string& errMsg) { if (!success) { ALOGI("Error message: %s", errMsg.c_str()); } - ASSERT_EQ(expected_result, success); + switch (value) { + case ExpectBoolean::False: + ASSERT_EQ(false, success); + break; + case ExpectBoolean::True: + ASSERT_EQ(true, success); + break; + case ExpectBoolean::Ignored: + break; + } }; const Return ret = control->stopOffload(cb); ASSERT_TRUE(ret.isOk()); @@ -211,22 +231,22 @@ TEST_F(OffloadControlHidlTestBase, AdditionalInitsWithoutStopReturnFalse) { initOffload(false); initOffload(false); initOffload(false); - stopOffload(true); // balance out initOffload(true) + stopOffload(ExpectBoolean::True); // balance out initOffload(true) } // Check that calling stopOffload() without first having called initOffload() returns false. TEST_F(OffloadControlHidlTestBase, MultipleStopsWithoutInitReturnFalse) { - stopOffload(false); - stopOffload(false); - stopOffload(false); + stopOffload(ExpectBoolean::False); + stopOffload(ExpectBoolean::False); + stopOffload(ExpectBoolean::False); } // Check that calling stopOffload() after a complete init/stop cycle returns false. TEST_F(OffloadControlHidlTestBase, AdditionalStopsWithInitReturnFalse) { initOffload(true); - stopOffload(true); // balance out initOffload(true) - stopOffload(false); - stopOffload(false); + stopOffload(ExpectBoolean::True); // balance out initOffload(true) + stopOffload(ExpectBoolean::False); + stopOffload(ExpectBoolean::False); } // Check that calling setLocalPrefixes() without first having called initOffload() returns false. @@ -307,7 +327,12 @@ class OffloadControlHidlTest : public OffloadControlHidlTestBase { setupControlHal(); } - virtual void TearDown() override { stopOffload(true); } + virtual void TearDown() override { + // For good measure, we should try stopOffload() once more. Since we + // don't know where we are in HAL call test cycle we don't know what + // return code to actually expect, so we just ignore it. + stopOffload(ExpectBoolean::Ignored); + } }; /* @@ -577,16 +602,24 @@ TEST_F(OffloadControlHidlTest, AddDownstreamBogusPrefixFails) { TEST_F(OffloadControlHidlTest, RemoveDownstreamIPv4) { const hidl_string iface("dummy0"); const hidl_string prefix("192.0.2.0/24"); - const Return ret = control->removeDownstream(iface, prefix, ASSERT_TRUE_CALLBACK); - EXPECT_TRUE(ret.isOk()); + // First add the downstream, otherwise removeDownstream logic can reasonably + // return false for downstreams not previously added. + const Return add = control->addDownstream(iface, prefix, ASSERT_TRUE_CALLBACK); + EXPECT_TRUE(add.isOk()); + const Return del = control->removeDownstream(iface, prefix, ASSERT_TRUE_CALLBACK); + EXPECT_TRUE(del.isOk()); } // Test removeDownstream() works given an IPv6 prefix. TEST_F(OffloadControlHidlTest, RemoveDownstreamIPv6) { const hidl_string iface("dummy0"); const hidl_string prefix("2001:db8::/64"); - const Return ret = control->removeDownstream(iface, prefix, ASSERT_TRUE_CALLBACK); - EXPECT_TRUE(ret.isOk()); + // First add the downstream, otherwise removeDownstream logic can reasonably + // return false for downstreams not previously added. + const Return add = control->addDownstream(iface, prefix, ASSERT_TRUE_CALLBACK); + EXPECT_TRUE(add.isOk()); + const Return del = control->removeDownstream(iface, prefix, ASSERT_TRUE_CALLBACK); + EXPECT_TRUE(del.isOk()); } // Test removeDownstream() fails given all empty parameters. From 028540b3a16421a5dcf5a0277820464423e0d675 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Tue, 26 Sep 2017 15:36:16 +0530 Subject: [PATCH 240/265] omxvts: misplaced lock can cause race condition upon unsuccessful return during timed wait, relock the mutex before accessing message list. Bug: 63796949 Change-Id: I84a43e148a6415e629cb39a6b9dfe27259f8f2fd --- media/omx/1.0/vts/functional/common/media_hidl_test_common.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h index e23d781baa..de043b2c66 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h @@ -126,8 +126,8 @@ struct CodecObserver : public IOmxObserver { android::Vector* iBuffers = nullptr, android::Vector* oBuffers = nullptr) { int64_t finishBy = android::ALooper::GetNowUs() + timeoutUs; - android::Mutex::Autolock autoLock(msgLock); for (;;) { + android::Mutex::Autolock autoLock(msgLock); android::List::iterator it = msgQueue.begin(); while (it != msgQueue.end()) { if (it->type == From 9502b237f735d85341b20f7421ad196b14b476a9 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Wed, 27 Sep 2017 20:53:22 +0530 Subject: [PATCH 241/265] omxvts: fix binary for 64bit platforms Bug: 63796949 Change-Id: Ieddae0bd9fc45a88c6e1579bdd588b77b4174a1f --- .../functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp | 4 ++++ .../functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp | 4 ++++ .../1.0/vts/functional/audio/media_audio_hidl_test_common.cpp | 4 ++++ .../omx/1.0/vts/functional/common/media_hidl_test_common.cpp | 1 - .../component/VtsHalMediaOmxV1_0TargetComponentTest.cpp | 4 ++++ .../functional/master/VtsHalMediaOmxV1_0TargetMasterTest.cpp | 4 ++++ .../functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 4 ++++ .../1.0/vts/functional/video/media_video_hidl_test_common.cpp | 1 - 8 files changed, 24 insertions(+), 2 deletions(-) diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp index b8a1634414..116144491b 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp @@ -15,6 +15,10 @@ */ #define LOG_TAG "media_omx_hidl_audio_dec_test" +#ifdef __LP64__ +#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS +#endif + #include #include diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp index dd5f16afad..66c46371fc 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp @@ -15,6 +15,10 @@ */ #define LOG_TAG "media_omx_hidl_audio_enc_test" +#ifdef __LP64__ +#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS +#endif + #include #include diff --git a/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp b/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp index 4c68219b47..9500094d6f 100644 --- a/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp @@ -15,6 +15,10 @@ */ #define LOG_TAG "media_omx_hidl_audio_test_common" +#ifdef __LP64__ +#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS +#endif + #include #include diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp index 9eab10c7b2..28616e2197 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp @@ -15,7 +15,6 @@ */ #define LOG_TAG "media_omx_hidl_video_test_common" - #ifdef __LP64__ #define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS #endif diff --git a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp index d7c731fa4e..5d0ac35ed3 100644 --- a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp +++ b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp @@ -15,6 +15,10 @@ */ #define LOG_TAG "media_omx_hidl_component_test" +#ifdef __LP64__ +#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS +#endif + #include #include diff --git a/media/omx/1.0/vts/functional/master/VtsHalMediaOmxV1_0TargetMasterTest.cpp b/media/omx/1.0/vts/functional/master/VtsHalMediaOmxV1_0TargetMasterTest.cpp index e8f5f77dfd..7cffea8c55 100644 --- a/media/omx/1.0/vts/functional/master/VtsHalMediaOmxV1_0TargetMasterTest.cpp +++ b/media/omx/1.0/vts/functional/master/VtsHalMediaOmxV1_0TargetMasterTest.cpp @@ -15,6 +15,10 @@ */ #define LOG_TAG "media_omx_hidl_master_test" +#ifdef __LP64__ +#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS +#endif + #include #include diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index 6b012858fd..a2547e897a 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -15,6 +15,10 @@ */ #define LOG_TAG "media_omx_hidl_video_dec_test" +#ifdef __LP64__ +#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS +#endif + #include #include diff --git a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp index 91aecf22e6..e1b6022f9d 100644 --- a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp @@ -15,7 +15,6 @@ */ #define LOG_TAG "media_omx_hidl_video_test_common" - #ifdef __LP64__ #define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS #endif From 9bd4e6bfc7701f0e1a1feb822f896540fd663979 Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Fri, 29 Sep 2017 15:04:33 -0700 Subject: [PATCH 242/265] wifi(implementation): Increase stop timeout The current timeout of 50ms seems to be insufficient on some devices. So, changing it to a higher value. Bug: 66334487 Test: Ran the VTS tests continously in a loop for 30 minutes without failure. Previously, failure occurence was about once every 5-10 minutes. `while adb shell /data/VtsHalWifiSupplicantV1_0TargetTest; do :; done; adb bugreport` Change-Id: I884de64d748b46b9710a702f3c72cc30dd51627e --- wifi/1.1/default/wifi_legacy_hal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wifi/1.1/default/wifi_legacy_hal.cpp b/wifi/1.1/default/wifi_legacy_hal.cpp index a6f6971f38..36da6e5351 100644 --- a/wifi/1.1/default/wifi_legacy_hal.cpp +++ b/wifi/1.1/default/wifi_legacy_hal.cpp @@ -35,7 +35,7 @@ static constexpr uint32_t kMaxGscanFrequenciesForBand = 64; static constexpr uint32_t kLinkLayerStatsDataMpduSizeThreshold = 128; static constexpr uint32_t kMaxWakeReasonStatsArraySize = 32; static constexpr uint32_t kMaxRingBuffers = 10; -static constexpr uint32_t kMaxStopCompleteWaitMs = 50; +static constexpr uint32_t kMaxStopCompleteWaitMs = 100; // Helper function to create a non-const char* for legacy Hal API's. std::vector makeCharVec(const std::string& str) { From 5eb1aa3f2bbb5478328d10b3b8e47b9f23172007 Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Thu, 28 Sep 2017 11:10:08 +0100 Subject: [PATCH 243/265] Camera: Enable VTS tests for 3.3 camera devices A new 3.3 Camera device API is available and devices supporting it need to be tested as well. Bug: 67028051 Test: run commandAndExit vts --skip-all-system-status-check --skip-preconditions --primary-abi-only --module VtsHalCameraProviderV2_4Target -l INFO For passthrough devices: run commandAndExit vts --skip-all-system-status-check --skip-preconditions --abi armeabi-v7a --module VtsHalCameraProviderV2_4Target -l INFO Change-Id: I91adb3c1867cdd8f8f810a2bd5b0a8ba2b0c1fcf --- .../VtsHalCameraProviderV2_4TargetTest.cpp | 2189 ++++++++++------- 1 file changed, 1237 insertions(+), 952 deletions(-) diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index 1392896533..34c583549a 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -125,8 +125,10 @@ struct AvailableZSLInputOutput { namespace { // "device@/legacy/" const char *kDeviceNameRE = "device@([0-9]+\\.[0-9]+)/%s/(.+)"; + const int CAMERA_DEVICE_API_VERSION_3_3 = 0x303; const int CAMERA_DEVICE_API_VERSION_3_2 = 0x302; const int CAMERA_DEVICE_API_VERSION_1_0 = 0x100; + const char *kHAL3_3 = "3.3"; const char *kHAL3_2 = "3.2"; const char *kHAL1_0 = "1.0"; @@ -159,8 +161,9 @@ namespace { return -1; } - if (version.compare(kHAL3_2) == 0) { - // maybe switched to 3.4 or define the hidl version enumlater + if (version.compare(kHAL3_3) == 0) { + return CAMERA_DEVICE_API_VERSION_3_3; + } else if (version.compare(kHAL3_2) == 0) { return CAMERA_DEVICE_API_VERSION_3_2; } else if (version.compare(kHAL1_0) == 0) { return CAMERA_DEVICE_API_VERSION_1_0; @@ -1091,24 +1094,36 @@ TEST_F(CameraHidlTest, getCameraDeviceInterface) { hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - Return ret; - ret = mProvider->getCameraDeviceInterface_V3_x( - name, [&](auto status, const auto& device3_2) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device3_2, nullptr); - }); - ASSERT_TRUE(ret.isOk()); - } else if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { - Return ret; - ret = mProvider->getCameraDeviceInterface_V1_x( - name, [&](auto status, const auto& device1) { - ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device1, nullptr); - }); - ASSERT_TRUE(ret.isOk()); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + Return ret; + ret = mProvider->getCameraDeviceInterface_V3_x( + name, [&](auto status, const auto& device3_x) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device3_x, nullptr); + }); + ASSERT_TRUE(ret.isOk()); + } + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + Return ret; + ret = mProvider->getCameraDeviceInterface_V1_x( + name, [&](auto status, const auto& device1) { + ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device1, nullptr); + }); + ASSERT_TRUE(ret.isOk()); + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -1119,52 +1134,64 @@ TEST_F(CameraHidlTest, getResourceCost) { hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; - ALOGI("getResourceCost: Testing camera device %s", name.c_str()); - Return ret; - ret = mProvider->getCameraDeviceInterface_V3_x( - name, [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device3_2 = device; - }); - ASSERT_TRUE(ret.isOk()); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_x; + ALOGI("getResourceCost: Testing camera device %s", name.c_str()); + Return ret; + ret = mProvider->getCameraDeviceInterface_V3_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device3_x = device; + }); + ASSERT_TRUE(ret.isOk()); - ret = device3_2->getResourceCost([&](auto status, const auto& resourceCost) { - ALOGI("getResourceCost returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ALOGI(" Resource cost is %d", resourceCost.resourceCost); - ASSERT_LE(resourceCost.resourceCost, 100u); - for (const auto& name : resourceCost.conflictingDevices) { - ALOGI(" Conflicting device: %s", name.c_str()); - } - }); - ASSERT_TRUE(ret.isOk()); - } else { - ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - ALOGI("getResourceCost: Testing camera device %s", name.c_str()); - Return ret; - ret = mProvider->getCameraDeviceInterface_V1_x( - name, [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); + ret = device3_x->getResourceCost([&](auto status, const auto& resourceCost) { + ALOGI("getResourceCost returns status:%d", (int)status); ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device1 = device; + ALOGI(" Resource cost is %d", resourceCost.resourceCost); + ASSERT_LE(resourceCost.resourceCost, 100u); + for (const auto& name : resourceCost.conflictingDevices) { + ALOGI(" Conflicting device: %s", name.c_str()); + } }); - ASSERT_TRUE(ret.isOk()); + ASSERT_TRUE(ret.isOk()); + } + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + ALOGI("getResourceCost: Testing camera device %s", name.c_str()); + Return ret; + ret = mProvider->getCameraDeviceInterface_V1_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device1 = device; + }); + ASSERT_TRUE(ret.isOk()); - ret = device1->getResourceCost([&](auto status, const auto& resourceCost) { - ALOGI("getResourceCost returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ALOGI(" Resource cost is %d", resourceCost.resourceCost); - ASSERT_LE(resourceCost.resourceCost, 100u); - for (const auto& name : resourceCost.conflictingDevices) { - ALOGI(" Conflicting device: %s", name.c_str()); - } - }); - ASSERT_TRUE(ret.isOk()); + ret = device1->getResourceCost([&](auto status, const auto& resourceCost) { + ALOGI("getResourceCost returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ALOGI(" Resource cost is %d", resourceCost.resourceCost); + ASSERT_LE(resourceCost.resourceCost, 100u); + for (const auto& name : resourceCost.conflictingDevices) { + ALOGI(" Conflicting device: %s", name.c_str()); + } + }); + ASSERT_TRUE(ret.isOk()); + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -1846,33 +1873,47 @@ TEST_F(CameraHidlTest, getCameraCharacteristics) { hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; - ALOGI("getCameraCharacteristics: Testing camera device %s", name.c_str()); - Return ret; - ret = mProvider->getCameraDeviceInterface_V3_x( - name, [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device3_2 = device; - }); - ASSERT_TRUE(ret.isOk()); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_x; + ALOGI("getCameraCharacteristics: Testing camera device %s", name.c_str()); + Return ret; + ret = mProvider->getCameraDeviceInterface_V3_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device3_x = device; + }); + ASSERT_TRUE(ret.isOk()); - ret = device3_2->getCameraCharacteristics([&](auto status, const auto& chars) { - ALOGI("getCameraCharacteristics returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - const camera_metadata_t* metadata = (camera_metadata_t*)chars.data(); - size_t expectedSize = chars.size(); - int result = validate_camera_metadata_structure(metadata, &expectedSize); - ASSERT_TRUE((result == 0) || (result == CAMERA_METADATA_VALIDATION_SHIFTED)); - size_t entryCount = get_camera_metadata_entry_count(metadata); - // TODO: we can do better than 0 here. Need to check how many required - // characteristics keys we've defined. - ASSERT_GT(entryCount, 0u); - ALOGI("getCameraCharacteristics metadata entry count is %zu", entryCount); - }); - ASSERT_TRUE(ret.isOk()); + ret = device3_x->getCameraCharacteristics([&](auto status, const auto& chars) { + ALOGI("getCameraCharacteristics returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + const camera_metadata_t* metadata = (camera_metadata_t*)chars.data(); + size_t expectedSize = chars.size(); + int result = validate_camera_metadata_structure(metadata, &expectedSize); + ASSERT_TRUE((result == 0) || (result == CAMERA_METADATA_VALIDATION_SHIFTED)); + size_t entryCount = get_camera_metadata_entry_count(metadata); + // TODO: we can do better than 0 here. Need to check how many required + // characteristics keys we've defined. + ASSERT_GT(entryCount, 0u); + ALOGI("getCameraCharacteristics metadata entry count is %zu", entryCount); + }); + ASSERT_TRUE(ret.isOk()); + } + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + //Not applicable + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -1896,102 +1937,116 @@ TEST_F(CameraHidlTest, setTorchMode) { ASSERT_EQ(Status::OK, returnStatus); for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; - ALOGI("setTorchMode: Testing camera device %s", name.c_str()); - ret = mProvider->getCameraDeviceInterface_V3_x( - name, [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device3_2 = device; - }); - ASSERT_TRUE(ret.isOk()); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_x; + ALOGI("setTorchMode: Testing camera device %s", name.c_str()); + ret = mProvider->getCameraDeviceInterface_V3_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device3_x = device; + }); + ASSERT_TRUE(ret.isOk()); - mTorchStatus = TorchModeStatus::NOT_AVAILABLE; - returnStatus = device3_2->setTorchMode(TorchMode::ON); - ASSERT_TRUE(returnStatus.isOk()); - if (!torchControlSupported) { - ASSERT_EQ(Status::METHOD_NOT_SUPPORTED, returnStatus); - } else { - ASSERT_TRUE(returnStatus == Status::OK || - returnStatus == Status::OPERATION_NOT_SUPPORTED); - if (returnStatus == Status::OK) { - { - std::unique_lock l(mTorchLock); - while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kTorchTimeoutSec); - ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, timeout)); + mTorchStatus = TorchModeStatus::NOT_AVAILABLE; + returnStatus = device3_x->setTorchMode(TorchMode::ON); + ASSERT_TRUE(returnStatus.isOk()); + if (!torchControlSupported) { + ASSERT_EQ(Status::METHOD_NOT_SUPPORTED, returnStatus); + } else { + ASSERT_TRUE(returnStatus == Status::OK || + returnStatus == Status::OPERATION_NOT_SUPPORTED); + if (returnStatus == Status::OK) { + { + std::unique_lock l(mTorchLock); + while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kTorchTimeoutSec); + ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, timeout)); + } + ASSERT_EQ(TorchModeStatus::AVAILABLE_ON, mTorchStatus); + mTorchStatus = TorchModeStatus::NOT_AVAILABLE; } - ASSERT_EQ(TorchModeStatus::AVAILABLE_ON, mTorchStatus); - mTorchStatus = TorchModeStatus::NOT_AVAILABLE; - } - returnStatus = device3_2->setTorchMode(TorchMode::OFF); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); + returnStatus = device3_x->setTorchMode(TorchMode::OFF); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); - { - std::unique_lock l(mTorchLock); - while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kTorchTimeoutSec); - ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, timeout)); + { + std::unique_lock l(mTorchLock); + while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kTorchTimeoutSec); + ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, timeout)); + } + ASSERT_EQ(TorchModeStatus::AVAILABLE_OFF, mTorchStatus); } - ASSERT_EQ(TorchModeStatus::AVAILABLE_OFF, mTorchStatus); } } } - } else if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { - ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - ALOGI("dumpState: Testing camera device %s", name.c_str()); - ret = mProvider->getCameraDeviceInterface_V1_x( - name, [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device1 = device; - }); - ASSERT_TRUE(ret.isOk()); + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + ALOGI("dumpState: Testing camera device %s", name.c_str()); + ret = mProvider->getCameraDeviceInterface_V1_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device1 = device; + }); + ASSERT_TRUE(ret.isOk()); - mTorchStatus = TorchModeStatus::NOT_AVAILABLE; - returnStatus = device1->setTorchMode(TorchMode::ON); - ASSERT_TRUE(returnStatus.isOk()); - if (!torchControlSupported) { - ASSERT_EQ(Status::METHOD_NOT_SUPPORTED, returnStatus); - } else { - ASSERT_TRUE(returnStatus == Status::OK || - returnStatus == Status::OPERATION_NOT_SUPPORTED); - if (returnStatus == Status::OK) { - { - std::unique_lock l(mTorchLock); - while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kTorchTimeoutSec); - ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, timeout)); + mTorchStatus = TorchModeStatus::NOT_AVAILABLE; + returnStatus = device1->setTorchMode(TorchMode::ON); + ASSERT_TRUE(returnStatus.isOk()); + if (!torchControlSupported) { + ASSERT_EQ(Status::METHOD_NOT_SUPPORTED, returnStatus); + } else { + ASSERT_TRUE(returnStatus == Status::OK || + returnStatus == Status::OPERATION_NOT_SUPPORTED); + if (returnStatus == Status::OK) { + { + std::unique_lock l(mTorchLock); + while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kTorchTimeoutSec); + ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, + timeout)); + } + ASSERT_EQ(TorchModeStatus::AVAILABLE_ON, mTorchStatus); + mTorchStatus = TorchModeStatus::NOT_AVAILABLE; } - ASSERT_EQ(TorchModeStatus::AVAILABLE_ON, mTorchStatus); - mTorchStatus = TorchModeStatus::NOT_AVAILABLE; - } - returnStatus = device1->setTorchMode(TorchMode::OFF); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); + returnStatus = device1->setTorchMode(TorchMode::OFF); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); - { - std::unique_lock l(mTorchLock); - while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kTorchTimeoutSec); - ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, timeout)); + { + std::unique_lock l(mTorchLock); + while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kTorchTimeoutSec); + ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, + timeout)); + } + ASSERT_EQ(TorchModeStatus::AVAILABLE_OFF, mTorchStatus); } - ASSERT_EQ(TorchModeStatus::AVAILABLE_OFF, mTorchStatus); } } + ret = device1->close(); + ASSERT_TRUE(ret.isOk()); } - ret = device1->close(); - ASSERT_TRUE(ret.isOk()); + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } @@ -2006,47 +2061,59 @@ TEST_F(CameraHidlTest, dumpState) { Return ret; for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - ::android::sp device3_2; - ALOGI("dumpState: Testing camera device %s", name.c_str()); - ret = mProvider->getCameraDeviceInterface_V3_x( - name, [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device3_2 = device; - }); - ASSERT_TRUE(ret.isOk()); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + ::android::sp device3_x; + ALOGI("dumpState: Testing camera device %s", name.c_str()); + ret = mProvider->getCameraDeviceInterface_V3_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device3_x = device; + }); + ASSERT_TRUE(ret.isOk()); - native_handle_t* raw_handle = native_handle_create(1, 0); - raw_handle->data[0] = open(kDumpOutput, O_RDWR); - ASSERT_GE(raw_handle->data[0], 0); - hidl_handle handle = raw_handle; - ret = device3_2->dumpState(handle); - ASSERT_TRUE(ret.isOk()); - close(raw_handle->data[0]); - native_handle_delete(raw_handle); - } else if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { - ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - ALOGI("dumpState: Testing camera device %s", name.c_str()); - ret = mProvider->getCameraDeviceInterface_V1_x( - name, [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device1 = device; - }); - ASSERT_TRUE(ret.isOk()); + native_handle_t* raw_handle = native_handle_create(1, 0); + raw_handle->data[0] = open(kDumpOutput, O_RDWR); + ASSERT_GE(raw_handle->data[0], 0); + hidl_handle handle = raw_handle; + ret = device3_x->dumpState(handle); + ASSERT_TRUE(ret.isOk()); + close(raw_handle->data[0]); + native_handle_delete(raw_handle); + } + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + ALOGI("dumpState: Testing camera device %s", name.c_str()); + ret = mProvider->getCameraDeviceInterface_V1_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device1 = device; + }); + ASSERT_TRUE(ret.isOk()); - native_handle_t* raw_handle = native_handle_create(1, 0); - raw_handle->data[0] = open(kDumpOutput, O_RDWR); - ASSERT_GE(raw_handle->data[0], 0); - hidl_handle handle = raw_handle; - Return returnStatus = device1->dumpState(handle); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - close(raw_handle->data[0]); - native_handle_delete(raw_handle); + native_handle_t* raw_handle = native_handle_create(1, 0); + raw_handle->data[0] = open(kDumpOutput, O_RDWR); + ASSERT_GE(raw_handle->data[0], 0); + hidl_handle handle = raw_handle; + Return returnStatus = device1->dumpState(handle); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + close(raw_handle->data[0]); + native_handle_delete(raw_handle); + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -2057,58 +2124,70 @@ TEST_F(CameraHidlTest, openClose) { Return ret; for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; - ALOGI("openClose: Testing camera device %s", name.c_str()); - ret = mProvider->getCameraDeviceInterface_V3_x( - name, [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_x; + ALOGI("openClose: Testing camera device %s", name.c_str()); + ret = mProvider->getCameraDeviceInterface_V3_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device3_x = device; + }); + ASSERT_TRUE(ret.isOk()); + + sp cb = new EmptyDeviceCb; + sp session; + ret = device3_x->open(cb, [&](auto status, const auto& newSession) { + ALOGI("device::open returns status:%d", (int)status); ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device3_2 = device; + ASSERT_NE(newSession, nullptr); + session = newSession; }); - ASSERT_TRUE(ret.isOk()); + ASSERT_TRUE(ret.isOk()); - sp cb = new EmptyDeviceCb; - sp session; - ret = device3_2->open(cb, [&](auto status, const auto& newSession) { - ALOGI("device::open returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(newSession, nullptr); - session = newSession; - }); - ASSERT_TRUE(ret.isOk()); + native_handle_t* raw_handle = native_handle_create(1, 0); + raw_handle->data[0] = open(kDumpOutput, O_RDWR); + ASSERT_GE(raw_handle->data[0], 0); + hidl_handle handle = raw_handle; + ret = device3_x->dumpState(handle); + ASSERT_TRUE(ret.isOk()); + close(raw_handle->data[0]); + native_handle_delete(raw_handle); - native_handle_t* raw_handle = native_handle_create(1, 0); - raw_handle->data[0] = open(kDumpOutput, O_RDWR); - ASSERT_GE(raw_handle->data[0], 0); - hidl_handle handle = raw_handle; - ret = device3_2->dumpState(handle); - ASSERT_TRUE(ret.isOk()); - close(raw_handle->data[0]); - native_handle_delete(raw_handle); + ret = session->close(); + ASSERT_TRUE(ret.isOk()); + // TODO: test all session API calls return INTERNAL_ERROR after close + // TODO: keep a wp copy here and verify session cannot be promoted out of this scope + } + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; + openCameraDevice(name, mProvider, &device1 /*out*/); + ASSERT_NE(nullptr, device1.get()); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); - // TODO: test all session API calls return INTERNAL_ERROR after close - // TODO: keep a wp copy here and verify session cannot be promoted out of this scope - } else if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { - sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; - openCameraDevice(name, mProvider, &device1 /*out*/); - ASSERT_NE(nullptr, device1.get()); + native_handle_t* raw_handle = native_handle_create(1, 0); + raw_handle->data[0] = open(kDumpOutput, O_RDWR); + ASSERT_GE(raw_handle->data[0], 0); + hidl_handle handle = raw_handle; + Return returnStatus = device1->dumpState(handle); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + close(raw_handle->data[0]); + native_handle_delete(raw_handle); - native_handle_t* raw_handle = native_handle_create(1, 0); - raw_handle->data[0] = open(kDumpOutput, O_RDWR); - ASSERT_GE(raw_handle->data[0], 0); - hidl_handle handle = raw_handle; - Return returnStatus = device1->dumpState(handle); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - close(raw_handle->data[0]); - native_handle_delete(raw_handle); - - ret = device1->close(); - ASSERT_TRUE(ret.isOk()); + ret = device1->close(); + ASSERT_TRUE(ret.isOk()); + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -2119,69 +2198,83 @@ TEST_F(CameraHidlTest, constructDefaultRequestSettings) { hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_2; - Return ret; - ALOGI("constructDefaultRequestSettings: Testing camera device %s", name.c_str()); - ret = mProvider->getCameraDeviceInterface_V3_x( - name, [&](auto status, const auto& device) { - ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_x; + Return ret; + ALOGI("constructDefaultRequestSettings: Testing camera device %s", name.c_str()); + ret = mProvider->getCameraDeviceInterface_V3_x( + name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device3_x = device; + }); + ASSERT_TRUE(ret.isOk()); + + sp cb = new EmptyDeviceCb; + sp session; + ret = device3_x->open(cb, [&](auto status, const auto& newSession) { + ALOGI("device::open returns status:%d", (int)status); ASSERT_EQ(Status::OK, status); - ASSERT_NE(device, nullptr); - device3_2 = device; + ASSERT_NE(newSession, nullptr); + session = newSession; }); - ASSERT_TRUE(ret.isOk()); + ASSERT_TRUE(ret.isOk()); - sp cb = new EmptyDeviceCb; - sp session; - ret = device3_2->open(cb, [&](auto status, const auto& newSession) { - ALOGI("device::open returns status:%d", (int)status); - ASSERT_EQ(Status::OK, status); - ASSERT_NE(newSession, nullptr); - session = newSession; - }); - ASSERT_TRUE(ret.isOk()); + for (uint32_t t = (uint32_t)RequestTemplate::PREVIEW; + t <= (uint32_t)RequestTemplate::MANUAL; t++) { + RequestTemplate reqTemplate = (RequestTemplate)t; + ret = + session->constructDefaultRequestSettings( + reqTemplate, [&](auto status, const auto& req) { + ALOGI("constructDefaultRequestSettings returns status:%d", + (int)status); + if (reqTemplate == RequestTemplate::ZERO_SHUTTER_LAG || + reqTemplate == RequestTemplate::MANUAL) { + // optional templates + ASSERT_TRUE((status == Status::OK) || + (status == Status::ILLEGAL_ARGUMENT)); + } else { + ASSERT_EQ(Status::OK, status); + } - for (uint32_t t = (uint32_t)RequestTemplate::PREVIEW; - t <= (uint32_t)RequestTemplate::MANUAL; t++) { - RequestTemplate reqTemplate = (RequestTemplate)t; - ret = - session->constructDefaultRequestSettings( - reqTemplate, [&](auto status, const auto& req) { - ALOGI("constructDefaultRequestSettings returns status:%d", - (int)status); - if (reqTemplate == RequestTemplate::ZERO_SHUTTER_LAG || - reqTemplate == RequestTemplate::MANUAL) { - // optional templates - ASSERT_TRUE((status == Status::OK) || - (status == Status::ILLEGAL_ARGUMENT)); - } else { - ASSERT_EQ(Status::OK, status); - } - - if (status == Status::OK) { - const camera_metadata_t* metadata = - (camera_metadata_t*) req.data(); - size_t expectedSize = req.size(); - int result = validate_camera_metadata_structure( - metadata, &expectedSize); - ASSERT_TRUE((result == 0) || - (result == CAMERA_METADATA_VALIDATION_SHIFTED)); - size_t entryCount = - get_camera_metadata_entry_count(metadata); - // TODO: we can do better than 0 here. Need to check how many required - // request keys we've defined for each template - ASSERT_GT(entryCount, 0u); - ALOGI("template %u metadata entry count is %zu", - t, entryCount); - } else { - ASSERT_EQ(0u, req.size()); - } - }); + if (status == Status::OK) { + const camera_metadata_t* metadata = + (camera_metadata_t*) req.data(); + size_t expectedSize = req.size(); + int result = validate_camera_metadata_structure( + metadata, &expectedSize); + ASSERT_TRUE((result == 0) || + (result == CAMERA_METADATA_VALIDATION_SHIFTED)); + size_t entryCount = + get_camera_metadata_entry_count(metadata); + // TODO: we can do better than 0 here. Need to check how many required + // request keys we've defined for each template + ASSERT_GT(entryCount, 0u); + ALOGI("template %u metadata entry count is %zu", + t, entryCount); + } else { + ASSERT_EQ(0u, req.size()); + } + }); + ASSERT_TRUE(ret.isOk()); + } + ret = session->close(); ASSERT_TRUE(ret.isOk()); } - ret = session->close(); - ASSERT_TRUE(ret.isOk()); + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + //Not applicable + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -2193,41 +2286,55 @@ TEST_F(CameraHidlTest, configureStreamsAvailableOutputs) { std::vector outputStreams; for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - camera_metadata_t* staticMeta; - Return ret; - sp session; - openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + camera_metadata_t* staticMeta; + Return ret; + sp session; + openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); - outputStreams.clear(); - ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputStreams)); - ASSERT_NE(0u, outputStreams.size()); + outputStreams.clear(); + ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputStreams)); + ASSERT_NE(0u, outputStreams.size()); - int32_t streamId = 0; - for (auto& it : outputStreams) { - Stream stream = {streamId, - StreamType::OUTPUT, - static_cast(it.width), - static_cast(it.height), - static_cast(it.format), - GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, - 0, - StreamRotation::ROTATION_0}; - ::android::hardware::hidl_vec streams = {stream}; - StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams( - config, [streamId](Status s, HalStreamConfiguration halConfig) { - ASSERT_EQ(Status::OK, s); - ASSERT_EQ(1u, halConfig.streams.size()); - ASSERT_EQ(halConfig.streams[0].id, streamId); - }); + int32_t streamId = 0; + for (auto& it : outputStreams) { + Stream stream = {streamId, + StreamType::OUTPUT, + static_cast(it.width), + static_cast(it.height), + static_cast(it.format), + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, + 0, + StreamRotation::ROTATION_0}; + ::android::hardware::hidl_vec streams = {stream}; + StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams( + config, [streamId](Status s, HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(1u, halConfig.streams.size()); + ASSERT_EQ(halConfig.streams[0].id, streamId); + }); + ASSERT_TRUE(ret.isOk()); + streamId++; + } + + free_camera_metadata(staticMeta); + ret = session->close(); ASSERT_TRUE(ret.isOk()); - streamId++; } - - free_camera_metadata(staticMeta); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + //Not applicable + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -2238,53 +2345,40 @@ TEST_F(CameraHidlTest, configureStreamsInvalidOutputs) { std::vector outputStreams; for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - camera_metadata_t* staticMeta; - Return ret; - sp session; - openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + camera_metadata_t* staticMeta; + Return ret; + sp session; + openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); - outputStreams.clear(); - ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputStreams)); - ASSERT_NE(0u, outputStreams.size()); + outputStreams.clear(); + ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputStreams)); + ASSERT_NE(0u, outputStreams.size()); - int32_t streamId = 0; - Stream stream = {streamId++, - StreamType::OUTPUT, - static_cast(0), - static_cast(0), - static_cast(outputStreams[0].format), - GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, - 0, - StreamRotation::ROTATION_0}; - ::android::hardware::hidl_vec streams = {stream}; - StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { - ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || (Status::INTERNAL_ERROR == s)); - }); - ASSERT_TRUE(ret.isOk()); + int32_t streamId = 0; + Stream stream = {streamId++, + StreamType::OUTPUT, + static_cast(0), + static_cast(0), + static_cast(outputStreams[0].format), + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, + 0, + StreamRotation::ROTATION_0}; + ::android::hardware::hidl_vec streams = {stream}; + StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { + ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || (Status::INTERNAL_ERROR == s)); + }); + ASSERT_TRUE(ret.isOk()); - stream = {streamId++, - StreamType::OUTPUT, - static_cast(UINT32_MAX), - static_cast(UINT32_MAX), - static_cast(outputStreams[0].format), - GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, - 0, - StreamRotation::ROTATION_0}; - streams[0] = stream; - config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); - }); - ASSERT_TRUE(ret.isOk()); - - for (auto& it : outputStreams) { stream = {streamId++, StreamType::OUTPUT, - static_cast(it.width), - static_cast(it.height), - static_cast(UINT32_MAX), + static_cast(UINT32_MAX), + static_cast(UINT32_MAX), + static_cast(outputStreams[0].format), GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 0, StreamRotation::ROTATION_0}; @@ -2295,25 +2389,52 @@ TEST_F(CameraHidlTest, configureStreamsInvalidOutputs) { }); ASSERT_TRUE(ret.isOk()); - stream = {streamId++, - StreamType::OUTPUT, - static_cast(it.width), - static_cast(it.height), - static_cast(it.format), - GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, - 0, - static_cast(UINT32_MAX)}; - streams[0] = stream; - config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); - }); + for (auto& it : outputStreams) { + stream = {streamId++, + StreamType::OUTPUT, + static_cast(it.width), + static_cast(it.height), + static_cast(UINT32_MAX), + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, + 0, + StreamRotation::ROTATION_0}; + streams[0] = stream; + config = {streams, StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + ASSERT_TRUE(ret.isOk()); + + stream = {streamId++, + StreamType::OUTPUT, + static_cast(it.width), + static_cast(it.height), + static_cast(it.format), + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, + 0, + static_cast(UINT32_MAX)}; + streams[0] = stream; + config = {streams, StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + ASSERT_TRUE(ret.isOk()); + } + + free_camera_metadata(staticMeta); + ret = session->close(); ASSERT_TRUE(ret.isOk()); } - - free_camera_metadata(staticMeta); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + //Not applicable + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -2326,79 +2447,99 @@ TEST_F(CameraHidlTest, configureStreamsZSLInputOutputs) { std::vector inputOutputMap; for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - camera_metadata_t* staticMeta; - Return ret; - sp session; - openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + camera_metadata_t* staticMeta; + Return ret; + sp session; + openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); - Status rc = isZSLModeAvailable(staticMeta); - if (Status::METHOD_NOT_SUPPORTED == rc) { - ret = session->close(); - ASSERT_TRUE(ret.isOk()); - continue; - } - ASSERT_EQ(Status::OK, rc); + Status rc = isZSLModeAvailable(staticMeta); + if (Status::METHOD_NOT_SUPPORTED == rc) { + ret = session->close(); + ASSERT_TRUE(ret.isOk()); + continue; + } + ASSERT_EQ(Status::OK, rc); - inputStreams.clear(); - ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, inputStreams)); - ASSERT_NE(0u, inputStreams.size()); - - inputOutputMap.clear(); - ASSERT_EQ(Status::OK, getZSLInputOutputMap(staticMeta, inputOutputMap)); - ASSERT_NE(0u, inputOutputMap.size()); - - int32_t streamId = 0; - for (auto& inputIter : inputOutputMap) { - AvailableStream input; - ASSERT_EQ(Status::OK, findLargestSize(inputStreams, inputIter.inputFormat, input)); + inputStreams.clear(); + ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, inputStreams)); ASSERT_NE(0u, inputStreams.size()); - AvailableStream outputThreshold = {INT32_MAX, INT32_MAX, inputIter.outputFormat}; - std::vector outputStreams; - ASSERT_EQ(Status::OK, - getAvailableOutputStreams(staticMeta, outputStreams, &outputThreshold)); - for (auto& outputIter : outputStreams) { - Stream zslStream = {streamId++, - StreamType::OUTPUT, - static_cast(input.width), - static_cast(input.height), - static_cast(input.format), - GRALLOC_USAGE_HW_CAMERA_ZSL, - 0, - StreamRotation::ROTATION_0}; - Stream inputStream = {streamId++, - StreamType::INPUT, - static_cast(input.width), - static_cast(input.height), - static_cast(input.format), - 0, - 0, - StreamRotation::ROTATION_0}; - Stream outputStream = {streamId++, - StreamType::OUTPUT, - static_cast(outputIter.width), - static_cast(outputIter.height), - static_cast(outputIter.format), - GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, - 0, - StreamRotation::ROTATION_0}; + inputOutputMap.clear(); + ASSERT_EQ(Status::OK, getZSLInputOutputMap(staticMeta, inputOutputMap)); + ASSERT_NE(0u, inputOutputMap.size()); - ::android::hardware::hidl_vec streams = {inputStream, zslStream, - outputStream}; - StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, - [](Status s, HalStreamConfiguration halConfig) { - ASSERT_EQ(Status::OK, s); - ASSERT_EQ(3u, halConfig.streams.size()); - }); - ASSERT_TRUE(ret.isOk()); + int32_t streamId = 0; + for (auto& inputIter : inputOutputMap) { + AvailableStream input; + ASSERT_EQ(Status::OK, findLargestSize(inputStreams, inputIter.inputFormat, + input)); + ASSERT_NE(0u, inputStreams.size()); + + AvailableStream outputThreshold = {INT32_MAX, INT32_MAX, + inputIter.outputFormat}; + std::vector outputStreams; + ASSERT_EQ(Status::OK, + getAvailableOutputStreams(staticMeta, outputStreams, + &outputThreshold)); + for (auto& outputIter : outputStreams) { + Stream zslStream = {streamId++, + StreamType::OUTPUT, + static_cast(input.width), + static_cast(input.height), + static_cast(input.format), + GRALLOC_USAGE_HW_CAMERA_ZSL, + 0, + StreamRotation::ROTATION_0}; + Stream inputStream = {streamId++, + StreamType::INPUT, + static_cast(input.width), + static_cast(input.height), + static_cast(input.format), + 0, + 0, + StreamRotation::ROTATION_0}; + Stream outputStream = {streamId++, + StreamType::OUTPUT, + static_cast(outputIter.width), + static_cast(outputIter.height), + static_cast(outputIter.format), + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, + 0, + StreamRotation::ROTATION_0}; + + ::android::hardware::hidl_vec streams = {inputStream, zslStream, + outputStream}; + StreamConfiguration config = {streams, + StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams(config, + [](Status s, + HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(3u, + halConfig.streams.size()); + }); + ASSERT_TRUE(ret.isOk()); + } } - } - free_camera_metadata(staticMeta); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); + free_camera_metadata(staticMeta); + ret = session->close(); + ASSERT_TRUE(ret.isOk()); + } + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + //Not applicable + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -2411,58 +2552,78 @@ TEST_F(CameraHidlTest, configureStreamsPreviewStillOutputs) { std::vector outputPreviewStreams; AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; - AvailableStream blobThreshold = {INT32_MAX, INT32_MAX, static_cast(PixelFormat::BLOB)}; + AvailableStream blobThreshold = {INT32_MAX, INT32_MAX, + static_cast(PixelFormat::BLOB)}; for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - camera_metadata_t* staticMeta; - Return ret; - sp session; - openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + camera_metadata_t* staticMeta; + Return ret; + sp session; + openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); - outputBlobStreams.clear(); - ASSERT_EQ(Status::OK, - getAvailableOutputStreams(staticMeta, outputBlobStreams, &blobThreshold)); - ASSERT_NE(0u, outputBlobStreams.size()); + outputBlobStreams.clear(); + ASSERT_EQ(Status::OK, + getAvailableOutputStreams(staticMeta, outputBlobStreams, + &blobThreshold)); + ASSERT_NE(0u, outputBlobStreams.size()); - outputPreviewStreams.clear(); - ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputPreviewStreams, - &previewThreshold)); - ASSERT_NE(0u, outputPreviewStreams.size()); + outputPreviewStreams.clear(); + ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputPreviewStreams, + &previewThreshold)); + ASSERT_NE(0u, outputPreviewStreams.size()); - int32_t streamId = 0; - for (auto& blobIter : outputBlobStreams) { - for (auto& previewIter : outputPreviewStreams) { - Stream previewStream = {streamId++, - StreamType::OUTPUT, - static_cast(previewIter.width), - static_cast(previewIter.height), - static_cast(previewIter.format), - GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, - 0, - StreamRotation::ROTATION_0}; - Stream blobStream = {streamId++, - StreamType::OUTPUT, - static_cast(blobIter.width), - static_cast(blobIter.height), - static_cast(blobIter.format), - GRALLOC1_CONSUMER_USAGE_CPU_READ, - 0, - StreamRotation::ROTATION_0}; - ::android::hardware::hidl_vec streams = {previewStream, blobStream}; - StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, - [](Status s, HalStreamConfiguration halConfig) { - ASSERT_EQ(Status::OK, s); - ASSERT_EQ(2u, halConfig.streams.size()); - }); - ASSERT_TRUE(ret.isOk()); + int32_t streamId = 0; + for (auto& blobIter : outputBlobStreams) { + for (auto& previewIter : outputPreviewStreams) { + Stream previewStream = {streamId++, + StreamType::OUTPUT, + static_cast(previewIter.width), + static_cast(previewIter.height), + static_cast(previewIter.format), + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, + 0, + StreamRotation::ROTATION_0}; + Stream blobStream = {streamId++, + StreamType::OUTPUT, + static_cast(blobIter.width), + static_cast(blobIter.height), + static_cast(blobIter.format), + GRALLOC1_CONSUMER_USAGE_CPU_READ, + 0, + StreamRotation::ROTATION_0}; + ::android::hardware::hidl_vec streams = {previewStream, + blobStream}; + StreamConfiguration config = {streams, + StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams(config, + [](Status s, + HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(2u, + halConfig.streams.size()); + }); + ASSERT_TRUE(ret.isOk()); + } } - } - free_camera_metadata(staticMeta); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); + free_camera_metadata(staticMeta); + ret = session->close(); + ASSERT_TRUE(ret.isOk()); + } + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + //Not applicable + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -2474,92 +2635,107 @@ TEST_F(CameraHidlTest, configureStreamsConstrainedOutputs) { hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - camera_metadata_t* staticMeta; - Return ret; - sp session; - openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + camera_metadata_t* staticMeta; + Return ret; + sp session; + openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); - Status rc = isConstrainedModeAvailable(staticMeta); - if (Status::METHOD_NOT_SUPPORTED == rc) { + Status rc = isConstrainedModeAvailable(staticMeta); + if (Status::METHOD_NOT_SUPPORTED == rc) { + ret = session->close(); + ASSERT_TRUE(ret.isOk()); + continue; + } + ASSERT_EQ(Status::OK, rc); + + AvailableStream hfrStream; + rc = pickConstrainedModeSize(staticMeta, hfrStream); + ASSERT_EQ(Status::OK, rc); + + int32_t streamId = 0; + Stream stream = {streamId, + StreamType::OUTPUT, + static_cast(hfrStream.width), + static_cast(hfrStream.height), + static_cast(hfrStream.format), + GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, + 0, + StreamRotation::ROTATION_0}; + ::android::hardware::hidl_vec streams = {stream}; + StreamConfiguration config = {streams, + StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; + ret = session->configureStreams(config, + [streamId](Status s, + HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(1u, halConfig.streams.size()); + ASSERT_EQ(halConfig.streams[0].id, streamId); + }); + ASSERT_TRUE(ret.isOk()); + + stream = {streamId++, + StreamType::OUTPUT, + static_cast(0), + static_cast(0), + static_cast(hfrStream.format), + GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, + 0, + StreamRotation::ROTATION_0}; + streams[0] = stream; + config = {streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { + ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || (Status::INTERNAL_ERROR == s)); + }); + ASSERT_TRUE(ret.isOk()); + + stream = {streamId++, + StreamType::OUTPUT, + static_cast(UINT32_MAX), + static_cast(UINT32_MAX), + static_cast(hfrStream.format), + GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, + 0, + StreamRotation::ROTATION_0}; + streams[0] = stream; + config = {streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + ASSERT_TRUE(ret.isOk()); + + stream = {streamId++, + StreamType::OUTPUT, + static_cast(hfrStream.width), + static_cast(hfrStream.height), + static_cast(UINT32_MAX), + GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, + 0, + StreamRotation::ROTATION_0}; + streams[0] = stream; + config = {streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; + ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + ASSERT_TRUE(ret.isOk()); + + free_camera_metadata(staticMeta); ret = session->close(); ASSERT_TRUE(ret.isOk()); - continue; } - ASSERT_EQ(Status::OK, rc); - - AvailableStream hfrStream; - rc = pickConstrainedModeSize(staticMeta, hfrStream); - ASSERT_EQ(Status::OK, rc); - - int32_t streamId = 0; - Stream stream = {streamId, - StreamType::OUTPUT, - static_cast(hfrStream.width), - static_cast(hfrStream.height), - static_cast(hfrStream.format), - GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, - 0, - StreamRotation::ROTATION_0}; - ::android::hardware::hidl_vec streams = {stream}; - StreamConfiguration config = {streams, - StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; - ret = session->configureStreams(config, - [streamId](Status s, HalStreamConfiguration halConfig) { - ASSERT_EQ(Status::OK, s); - ASSERT_EQ(1u, halConfig.streams.size()); - ASSERT_EQ(halConfig.streams[0].id, streamId); - }); - ASSERT_TRUE(ret.isOk()); - - stream = {streamId++, - StreamType::OUTPUT, - static_cast(0), - static_cast(0), - static_cast(hfrStream.format), - GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, - 0, - StreamRotation::ROTATION_0}; - streams[0] = stream; - config = {streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; - ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { - ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || (Status::INTERNAL_ERROR == s)); - }); - ASSERT_TRUE(ret.isOk()); - - stream = {streamId++, - StreamType::OUTPUT, - static_cast(UINT32_MAX), - static_cast(UINT32_MAX), - static_cast(hfrStream.format), - GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, - 0, - StreamRotation::ROTATION_0}; - streams[0] = stream; - config = {streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; - ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); - }); - ASSERT_TRUE(ret.isOk()); - - stream = {streamId++, - StreamType::OUTPUT, - static_cast(hfrStream.width), - static_cast(hfrStream.height), - static_cast(UINT32_MAX), - GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, - 0, - StreamRotation::ROTATION_0}; - streams[0] = stream; - config = {streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; - ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); - }); - ASSERT_TRUE(ret.isOk()); - - free_camera_metadata(staticMeta); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + //Not applicable + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -2576,55 +2752,74 @@ TEST_F(CameraHidlTest, configureStreamsVideoStillOutputs) { static_cast(PixelFormat::BLOB)}; for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - camera_metadata_t* staticMeta; - Return ret; - sp session; - openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + camera_metadata_t* staticMeta; + Return ret; + sp session; + openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); - outputBlobStreams.clear(); - ASSERT_EQ(Status::OK, - getAvailableOutputStreams(staticMeta, outputBlobStreams, &blobThreshold)); - ASSERT_NE(0u, outputBlobStreams.size()); + outputBlobStreams.clear(); + ASSERT_EQ(Status::OK, + getAvailableOutputStreams(staticMeta, outputBlobStreams, + &blobThreshold)); + ASSERT_NE(0u, outputBlobStreams.size()); - outputVideoStreams.clear(); - ASSERT_EQ(Status::OK, - getAvailableOutputStreams(staticMeta, outputVideoStreams, &videoThreshold)); - ASSERT_NE(0u, outputVideoStreams.size()); + outputVideoStreams.clear(); + ASSERT_EQ(Status::OK, + getAvailableOutputStreams(staticMeta, outputVideoStreams, + &videoThreshold)); + ASSERT_NE(0u, outputVideoStreams.size()); - int32_t streamId = 0; - for (auto& blobIter : outputBlobStreams) { - for (auto& videoIter : outputVideoStreams) { - Stream videoStream = {streamId++, - StreamType::OUTPUT, - static_cast(videoIter.width), - static_cast(videoIter.height), - static_cast(videoIter.format), - GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, - 0, - StreamRotation::ROTATION_0}; - Stream blobStream = {streamId++, - StreamType::OUTPUT, - static_cast(blobIter.width), - static_cast(blobIter.height), - static_cast(blobIter.format), - GRALLOC1_CONSUMER_USAGE_CPU_READ, - 0, - StreamRotation::ROTATION_0}; - ::android::hardware::hidl_vec streams = {videoStream, blobStream}; - StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, - [](Status s, HalStreamConfiguration halConfig) { - ASSERT_EQ(Status::OK, s); - ASSERT_EQ(2u, halConfig.streams.size()); - }); - ASSERT_TRUE(ret.isOk()); + int32_t streamId = 0; + for (auto& blobIter : outputBlobStreams) { + for (auto& videoIter : outputVideoStreams) { + Stream videoStream = {streamId++, + StreamType::OUTPUT, + static_cast(videoIter.width), + static_cast(videoIter.height), + static_cast(videoIter.format), + GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, + 0, + StreamRotation::ROTATION_0}; + Stream blobStream = {streamId++, + StreamType::OUTPUT, + static_cast(blobIter.width), + static_cast(blobIter.height), + static_cast(blobIter.format), + GRALLOC1_CONSUMER_USAGE_CPU_READ, + 0, + StreamRotation::ROTATION_0}; + ::android::hardware::hidl_vec streams = {videoStream, blobStream}; + StreamConfiguration config = {streams, + StreamConfigurationMode::NORMAL_MODE}; + ret = session->configureStreams(config, + [](Status s, + HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(2u, + halConfig.streams.size()); + }); + ASSERT_TRUE(ret.isOk()); + } } - } - free_camera_metadata(staticMeta); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); + free_camera_metadata(staticMeta); + ret = session->close(); + ASSERT_TRUE(ret.isOk()); + } + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + //Not applicable + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -2639,129 +2834,152 @@ TEST_F(CameraHidlTest, processCaptureRequestPreview) { ::android::hardware::hidl_vec settings; for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - Stream previewStream; - HalStreamConfiguration halStreamConfig; - sp session; - bool supportsPartialResults = false; - uint32_t partialResultCount = 0; - configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, - &previewStream /*out*/, &halStreamConfig /*out*/, - &supportsPartialResults /*out*/, &partialResultCount /*out*/); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + Stream previewStream; + HalStreamConfiguration halStreamConfig; + sp session; + bool supportsPartialResults = false; + uint32_t partialResultCount = 0; + configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, + &previewStream /*out*/, &halStreamConfig /*out*/, + &supportsPartialResults /*out*/, + &partialResultCount /*out*/); - std::shared_ptr resultQueue; - auto resultQueueRet = - session->getCaptureResultMetadataQueue( - [&resultQueue](const auto& descriptor) { - resultQueue = std::make_shared( - descriptor); - if (!resultQueue->isValid() || - resultQueue->availableToWrite() <= 0) { - ALOGE("%s: HAL returns empty result metadata fmq," - " not use it", __func__); - resultQueue = nullptr; - // Don't use the queue onwards. - } + std::shared_ptr resultQueue; + auto resultQueueRet = + session->getCaptureResultMetadataQueue( + [&resultQueue](const auto& descriptor) { + resultQueue = std::make_shared( + descriptor); + if (!resultQueue->isValid() || + resultQueue->availableToWrite() <= 0) { + ALOGE("%s: HAL returns empty result metadata fmq," + " not use it", __func__); + resultQueue = nullptr; + // Don't use the queue onwards. + } + }); + ASSERT_TRUE(resultQueueRet.isOk()); + + InFlightRequest inflightReq = {1, false, supportsPartialResults, + partialResultCount, resultQueue}; + + RequestTemplate reqTemplate = RequestTemplate::PREVIEW; + Return ret; + ret = session->constructDefaultRequestSettings(reqTemplate, + [&](auto status, const auto& req) { + ASSERT_EQ(Status::OK, status); + settings = req; + }); + ASSERT_TRUE(ret.isOk()); + + sp gb = new GraphicBuffer( + previewStream.width, previewStream.height, + static_cast(halStreamConfig.streams[0].overrideFormat), 1, + android_convertGralloc1To0Usage(halStreamConfig.streams[0].producerUsage, + halStreamConfig.streams[0].consumerUsage)); + ASSERT_NE(nullptr, gb.get()); + StreamBuffer outputBuffer = {halStreamConfig.streams[0].id, + bufferId, + hidl_handle(gb->getNativeBuffer()->handle), + BufferStatus::OK, + nullptr, + nullptr}; + ::android::hardware::hidl_vec outputBuffers = {outputBuffer}; + StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, nullptr, + nullptr}; + CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, + emptyInputBuffer, outputBuffers}; + + { + std::unique_lock l(mLock); + mInflightMap.clear(); + mInflightMap.add(frameNumber, &inflightReq); + } + + Status status = Status::INTERNAL_ERROR; + uint32_t numRequestProcessed = 0; + hidl_vec cachesToRemove; + Return returnStatus = session->processCaptureRequest( + {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, + uint32_t n) { + status = s; + numRequestProcessed = n; }); - ASSERT_TRUE(resultQueueRet.isOk()); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, status); + ASSERT_EQ(numRequestProcessed, 1u); - InFlightRequest inflightReq = {1, false, supportsPartialResults, partialResultCount, - resultQueue}; + { + std::unique_lock l(mLock); + while (!inflightReq.errorCodeValid && + ((0 < inflightReq.numBuffersLeft) || + (!inflightReq.haveResultMetadata))) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kStreamBufferTimeoutSec); + ASSERT_NE(std::cv_status::timeout, + mResultCondition.wait_until(l, timeout)); + } - RequestTemplate reqTemplate = RequestTemplate::PREVIEW; - Return ret; - ret = session->constructDefaultRequestSettings(reqTemplate, - [&](auto status, const auto& req) { - ASSERT_EQ(Status::OK, status); - settings = req; - }); - ASSERT_TRUE(ret.isOk()); + ASSERT_FALSE(inflightReq.errorCodeValid); + ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); + ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); - sp gb = new GraphicBuffer( - previewStream.width, previewStream.height, - static_cast(halStreamConfig.streams[0].overrideFormat), 1, - android_convertGralloc1To0Usage(halStreamConfig.streams[0].producerUsage, - halStreamConfig.streams[0].consumerUsage)); - ASSERT_NE(nullptr, gb.get()); - StreamBuffer outputBuffer = {halStreamConfig.streams[0].id, - bufferId, - hidl_handle(gb->getNativeBuffer()->handle), - BufferStatus::OK, - nullptr, - nullptr}; - ::android::hardware::hidl_vec outputBuffers = {outputBuffer}; - StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, nullptr, nullptr}; - CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, - emptyInputBuffer, outputBuffers}; - - { - std::unique_lock l(mLock); - mInflightMap.clear(); - mInflightMap.add(frameNumber, &inflightReq); - } - - Status status = Status::INTERNAL_ERROR; - uint32_t numRequestProcessed = 0; - hidl_vec cachesToRemove; - Return returnStatus = session->processCaptureRequest( - {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, uint32_t n) { - status = s; - numRequestProcessed = n; - }); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, status); - ASSERT_EQ(numRequestProcessed, 1u); - - { - std::unique_lock l(mLock); - while (!inflightReq.errorCodeValid && - ((0 < inflightReq.numBuffersLeft) || (!inflightReq.haveResultMetadata))) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kStreamBufferTimeoutSec); - ASSERT_NE(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); + request.frameNumber++; + // Empty settings should be supported after the first call + // for repeating requests. + request.settings.setToExternal(nullptr, 0, true); + // The buffer has been registered to HAL by bufferId, so per + // API contract we should send a null handle for this buffer + request.outputBuffers[0].buffer = nullptr; + mInflightMap.clear(); + inflightReq = {1, false, supportsPartialResults, partialResultCount, + resultQueue}; + mInflightMap.add(request.frameNumber, &inflightReq); } - ASSERT_FALSE(inflightReq.errorCodeValid); - ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); - ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); + returnStatus = session->processCaptureRequest( + {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, + uint32_t n) { + status = s; + numRequestProcessed = n; + }); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, status); + ASSERT_EQ(numRequestProcessed, 1u); - request.frameNumber++; - // Empty settings should be supported after the first call - // for repeating requests. - request.settings.setToExternal(nullptr, 0, true); - // The buffer has been registered to HAL by bufferId, so per - // API contract we should send a null handle for this buffer - request.outputBuffers[0].buffer = nullptr; - mInflightMap.clear(); - inflightReq = {1, false, supportsPartialResults, partialResultCount, resultQueue}; - mInflightMap.add(request.frameNumber, &inflightReq); - } + { + std::unique_lock l(mLock); + while (!inflightReq.errorCodeValid && + ((0 < inflightReq.numBuffersLeft) || + (!inflightReq.haveResultMetadata))) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kStreamBufferTimeoutSec); + ASSERT_NE(std::cv_status::timeout, + mResultCondition.wait_until(l, timeout)); + } - returnStatus = session->processCaptureRequest( - {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, uint32_t n) { - status = s; - numRequestProcessed = n; - }); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, status); - ASSERT_EQ(numRequestProcessed, 1u); - - { - std::unique_lock l(mLock); - while (!inflightReq.errorCodeValid && - ((0 < inflightReq.numBuffersLeft) || (!inflightReq.haveResultMetadata))) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kStreamBufferTimeoutSec); - ASSERT_NE(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); + ASSERT_FALSE(inflightReq.errorCodeValid); + ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); + ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); } - ASSERT_FALSE(inflightReq.errorCodeValid); - ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); - ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); + ret = session->close(); + ASSERT_TRUE(ret.isOk()); } - - ret = session->close(); - ASSERT_TRUE(ret.isOk()); + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + //Not applicable + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -2778,48 +2996,65 @@ TEST_F(CameraHidlTest, processCaptureRequestInvalidSinglePreview) { ::android::hardware::hidl_vec settings; for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - Stream previewStream; - HalStreamConfiguration halStreamConfig; - sp session; - bool supportsPartialResults = false; - uint32_t partialResultCount = 0; - configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, - &previewStream /*out*/, &halStreamConfig /*out*/, - &supportsPartialResults /*out*/, &partialResultCount /*out*/); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + Stream previewStream; + HalStreamConfiguration halStreamConfig; + sp session; + bool supportsPartialResults = false; + uint32_t partialResultCount = 0; + configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, + &previewStream /*out*/, &halStreamConfig /*out*/, + &supportsPartialResults /*out*/, + &partialResultCount /*out*/); - sp gb = new GraphicBuffer( - previewStream.width, previewStream.height, - static_cast(halStreamConfig.streams[0].overrideFormat), 1, - android_convertGralloc1To0Usage(halStreamConfig.streams[0].producerUsage, - halStreamConfig.streams[0].consumerUsage)); + sp gb = new GraphicBuffer( + previewStream.width, previewStream.height, + static_cast(halStreamConfig.streams[0].overrideFormat), 1, + android_convertGralloc1To0Usage(halStreamConfig.streams[0].producerUsage, + halStreamConfig.streams[0].consumerUsage)); - StreamBuffer outputBuffer = {halStreamConfig.streams[0].id, - bufferId, - hidl_handle(gb->getNativeBuffer()->handle), - BufferStatus::OK, - nullptr, - nullptr}; - ::android::hardware::hidl_vec outputBuffers = {outputBuffer}; - StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, nullptr, nullptr}; - CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, - emptyInputBuffer, outputBuffers}; + StreamBuffer outputBuffer = {halStreamConfig.streams[0].id, + bufferId, + hidl_handle(gb->getNativeBuffer()->handle), + BufferStatus::OK, + nullptr, + nullptr}; + ::android::hardware::hidl_vec outputBuffers = {outputBuffer}; + StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, nullptr, + nullptr}; + CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, + emptyInputBuffer, outputBuffers}; - // Settings were not correctly initialized, we should fail here - Status status = Status::OK; - uint32_t numRequestProcessed = 0; - hidl_vec cachesToRemove; - Return ret = session->processCaptureRequest( - {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, uint32_t n) { - status = s; - numRequestProcessed = n; - }); - ASSERT_TRUE(ret.isOk()); - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, status); - ASSERT_EQ(numRequestProcessed, 0u); + // Settings were not correctly initialized, we should fail here + Status status = Status::OK; + uint32_t numRequestProcessed = 0; + hidl_vec cachesToRemove; + Return ret = session->processCaptureRequest( + {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, + uint32_t n) { + status = s; + numRequestProcessed = n; + }); + ASSERT_TRUE(ret.isOk()); + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, status); + ASSERT_EQ(numRequestProcessed, 0u); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); + ret = session->close(); + ASSERT_TRUE(ret.isOk()); + } + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + //Not applicable + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -2835,45 +3070,62 @@ TEST_F(CameraHidlTest, processCaptureRequestInvalidBuffer) { ::android::hardware::hidl_vec settings; for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - Stream previewStream; - HalStreamConfiguration halStreamConfig; - sp session; - bool supportsPartialResults = false; - uint32_t partialResultCount = 0; - configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, - &previewStream /*out*/, &halStreamConfig /*out*/, - &supportsPartialResults /*out*/, &partialResultCount /*out*/); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + Stream previewStream; + HalStreamConfiguration halStreamConfig; + sp session; + bool supportsPartialResults = false; + uint32_t partialResultCount = 0; + configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, + &previewStream /*out*/, &halStreamConfig /*out*/, + &supportsPartialResults /*out*/, + &partialResultCount /*out*/); - RequestTemplate reqTemplate = RequestTemplate::PREVIEW; - Return ret; - ret = session->constructDefaultRequestSettings(reqTemplate, - [&](auto status, const auto& req) { - ASSERT_EQ(Status::OK, status); - settings = req; - }); - ASSERT_TRUE(ret.isOk()); + RequestTemplate reqTemplate = RequestTemplate::PREVIEW; + Return ret; + ret = session->constructDefaultRequestSettings(reqTemplate, + [&](auto status, const auto& req) { + ASSERT_EQ(Status::OK, status); + settings = req; + }); + ASSERT_TRUE(ret.isOk()); - ::android::hardware::hidl_vec emptyOutputBuffers; - StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, nullptr, nullptr}; - CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, - emptyInputBuffer, emptyOutputBuffers}; + ::android::hardware::hidl_vec emptyOutputBuffers; + StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, nullptr, + nullptr}; + CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, + emptyInputBuffer, emptyOutputBuffers}; - // Output buffers are missing, we should fail here - Status status = Status::OK; - uint32_t numRequestProcessed = 0; - hidl_vec cachesToRemove; - ret = session->processCaptureRequest( - {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, uint32_t n) { - status = s; - numRequestProcessed = n; - }); - ASSERT_TRUE(ret.isOk()); - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, status); - ASSERT_EQ(numRequestProcessed, 0u); + // Output buffers are missing, we should fail here + Status status = Status::OK; + uint32_t numRequestProcessed = 0; + hidl_vec cachesToRemove; + ret = session->processCaptureRequest( + {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, + uint32_t n) { + status = s; + numRequestProcessed = n; + }); + ASSERT_TRUE(ret.isOk()); + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, status); + ASSERT_EQ(numRequestProcessed, 0u); - ret = session->close(); - ASSERT_TRUE(ret.isOk()); + ret = session->close(); + ASSERT_TRUE(ret.isOk()); + } + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + //Not applicable + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -2889,113 +3141,131 @@ TEST_F(CameraHidlTest, flushPreviewRequest) { ::android::hardware::hidl_vec settings; for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - Stream previewStream; - HalStreamConfiguration halStreamConfig; - sp session; - bool supportsPartialResults = false; - uint32_t partialResultCount = 0; - configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, - &previewStream /*out*/, &halStreamConfig /*out*/, - &supportsPartialResults /*out*/, &partialResultCount /*out*/); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + Stream previewStream; + HalStreamConfiguration halStreamConfig; + sp session; + bool supportsPartialResults = false; + uint32_t partialResultCount = 0; + configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, + &previewStream /*out*/, &halStreamConfig /*out*/, + &supportsPartialResults /*out*/, + &partialResultCount /*out*/); - std::shared_ptr resultQueue; - auto resultQueueRet = - session->getCaptureResultMetadataQueue( - [&resultQueue](const auto& descriptor) { - resultQueue = std::make_shared( - descriptor); - if (!resultQueue->isValid() || - resultQueue->availableToWrite() <= 0) { - ALOGE("%s: HAL returns empty result metadata fmq," - " not use it", __func__); - resultQueue = nullptr; - // Don't use the queue onwards. - } - }); - ASSERT_TRUE(resultQueueRet.isOk()); + std::shared_ptr resultQueue; + auto resultQueueRet = + session->getCaptureResultMetadataQueue( + [&resultQueue](const auto& descriptor) { + resultQueue = std::make_shared( + descriptor); + if (!resultQueue->isValid() || + resultQueue->availableToWrite() <= 0) { + ALOGE("%s: HAL returns empty result metadata fmq," + " not use it", __func__); + resultQueue = nullptr; + // Don't use the queue onwards. + } + }); + ASSERT_TRUE(resultQueueRet.isOk()); - InFlightRequest inflightReq = {1, false, supportsPartialResults, partialResultCount, - resultQueue}; - RequestTemplate reqTemplate = RequestTemplate::PREVIEW; - Return ret; - ret = session->constructDefaultRequestSettings(reqTemplate, - [&](auto status, const auto& req) { - ASSERT_EQ(Status::OK, status); - settings = req; - }); - ASSERT_TRUE(ret.isOk()); - - sp gb = new GraphicBuffer( - previewStream.width, previewStream.height, - static_cast(halStreamConfig.streams[0].overrideFormat), 1, - android_convertGralloc1To0Usage(halStreamConfig.streams[0].producerUsage, - halStreamConfig.streams[0].consumerUsage)); - ASSERT_NE(nullptr, gb.get()); - StreamBuffer outputBuffer = {halStreamConfig.streams[0].id, - bufferId, - hidl_handle(gb->getNativeBuffer()->handle), - BufferStatus::OK, - nullptr, - nullptr}; - ::android::hardware::hidl_vec outputBuffers = {outputBuffer}; - const StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, - nullptr, nullptr}; - CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, - emptyInputBuffer, outputBuffers}; - - { - std::unique_lock l(mLock); - mInflightMap.clear(); - mInflightMap.add(frameNumber, &inflightReq); - } - - Status status = Status::INTERNAL_ERROR; - uint32_t numRequestProcessed = 0; - hidl_vec cachesToRemove; - ret = session->processCaptureRequest( - {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, uint32_t n) { - status = s; - numRequestProcessed = n; - }); - - ASSERT_TRUE(ret.isOk()); - ASSERT_EQ(Status::OK, status); - ASSERT_EQ(numRequestProcessed, 1u); - // Flush before waiting for request to complete. - Return returnStatus = session->flush(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); - - { - std::unique_lock l(mLock); - while (!inflightReq.errorCodeValid && - ((0 < inflightReq.numBuffersLeft) || (!inflightReq.haveResultMetadata))) { - auto timeout = std::chrono::system_clock::now() + - std::chrono::seconds(kStreamBufferTimeoutSec); - ASSERT_NE(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); - } - - if (!inflightReq.errorCodeValid) { - ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); - ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); - } else { - switch (inflightReq.errorCode) { - case ErrorCode::ERROR_REQUEST: - case ErrorCode::ERROR_RESULT: - case ErrorCode::ERROR_BUFFER: - // Expected - break; - case ErrorCode::ERROR_DEVICE: - default: - FAIL() << "Unexpected error:" - << static_cast(inflightReq.errorCode); - } - } - - ret = session->close(); + InFlightRequest inflightReq = {1, false, supportsPartialResults, + partialResultCount, resultQueue}; + RequestTemplate reqTemplate = RequestTemplate::PREVIEW; + Return ret; + ret = session->constructDefaultRequestSettings(reqTemplate, + [&](auto status, const auto& req) { + ASSERT_EQ(Status::OK, status); + settings = req; + }); ASSERT_TRUE(ret.isOk()); + + sp gb = new GraphicBuffer( + previewStream.width, previewStream.height, + static_cast(halStreamConfig.streams[0].overrideFormat), 1, + android_convertGralloc1To0Usage(halStreamConfig.streams[0].producerUsage, + halStreamConfig.streams[0].consumerUsage)); + ASSERT_NE(nullptr, gb.get()); + StreamBuffer outputBuffer = {halStreamConfig.streams[0].id, + bufferId, + hidl_handle(gb->getNativeBuffer()->handle), + BufferStatus::OK, + nullptr, + nullptr}; + ::android::hardware::hidl_vec outputBuffers = {outputBuffer}; + const StreamBuffer emptyInputBuffer = {-1, 0, nullptr, + BufferStatus::ERROR, nullptr, nullptr}; + CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, + emptyInputBuffer, outputBuffers}; + + { + std::unique_lock l(mLock); + mInflightMap.clear(); + mInflightMap.add(frameNumber, &inflightReq); + } + + Status status = Status::INTERNAL_ERROR; + uint32_t numRequestProcessed = 0; + hidl_vec cachesToRemove; + ret = session->processCaptureRequest( + {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, + uint32_t n) { + status = s; + numRequestProcessed = n; + }); + + ASSERT_TRUE(ret.isOk()); + ASSERT_EQ(Status::OK, status); + ASSERT_EQ(numRequestProcessed, 1u); + // Flush before waiting for request to complete. + Return returnStatus = session->flush(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); + + { + std::unique_lock l(mLock); + while (!inflightReq.errorCodeValid && + ((0 < inflightReq.numBuffersLeft) || + (!inflightReq.haveResultMetadata))) { + auto timeout = std::chrono::system_clock::now() + + std::chrono::seconds(kStreamBufferTimeoutSec); + ASSERT_NE(std::cv_status::timeout, mResultCondition.wait_until(l, + timeout)); + } + + if (!inflightReq.errorCodeValid) { + ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); + ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); + } else { + switch (inflightReq.errorCode) { + case ErrorCode::ERROR_REQUEST: + case ErrorCode::ERROR_RESULT: + case ErrorCode::ERROR_BUFFER: + // Expected + break; + case ErrorCode::ERROR_DEVICE: + default: + FAIL() << "Unexpected error:" + << static_cast(inflightReq.errorCode); + } + } + + ret = session->close(); + ASSERT_TRUE(ret.isOk()); + } } + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + //Not applicable + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -3008,29 +3278,44 @@ TEST_F(CameraHidlTest, flushEmpty) { static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; for (const auto& name : cameraDeviceNames) { - if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_3_2) { - Stream previewStream; - HalStreamConfiguration halStreamConfig; - sp session; - bool supportsPartialResults = false; - uint32_t partialResultCount = 0; - configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, - &previewStream /*out*/, &halStreamConfig /*out*/, - &supportsPartialResults /*out*/, &partialResultCount /*out*/); + int deviceVersion = getCameraDeviceVersion(name, mProviderType); + switch (deviceVersion) { + case CAMERA_DEVICE_API_VERSION_3_3: + case CAMERA_DEVICE_API_VERSION_3_2: { + Stream previewStream; + HalStreamConfiguration halStreamConfig; + sp session; + bool supportsPartialResults = false; + uint32_t partialResultCount = 0; + configurePreviewStream(name, mProvider, &previewThreshold, &session /*out*/, + &previewStream /*out*/, &halStreamConfig /*out*/, + &supportsPartialResults /*out*/, + &partialResultCount /*out*/); - Return returnStatus = session->flush(); - ASSERT_TRUE(returnStatus.isOk()); - ASSERT_EQ(Status::OK, returnStatus); + Return returnStatus = session->flush(); + ASSERT_TRUE(returnStatus.isOk()); + ASSERT_EQ(Status::OK, returnStatus); - { - std::unique_lock l(mLock); - auto timeout = std::chrono::system_clock::now() + - std::chrono::milliseconds(kEmptyFlushTimeoutMSec); - ASSERT_EQ(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); + { + std::unique_lock l(mLock); + auto timeout = std::chrono::system_clock::now() + + std::chrono::milliseconds(kEmptyFlushTimeoutMSec); + ASSERT_EQ(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); + } + + Return ret = session->close(); + ASSERT_TRUE(ret.isOk()); } - - Return ret = session->close(); - ASSERT_TRUE(ret.isOk()); + break; + case CAMERA_DEVICE_API_VERSION_1_0: { + //Not applicable + } + break; + default: { + ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); + ADD_FAILURE(); + } + break; } } } @@ -3234,7 +3519,7 @@ void CameraHidlTest::configurePreviewStream(const std::string &name, ASSERT_NE(nullptr, partialResultCount); std::vector outputPreviewStreams; - ::android::sp device3_2; + ::android::sp device3_x; ALOGI("configureStreams: Testing camera device %s", name.c_str()); Return ret; ret = provider->getCameraDeviceInterface_V3_x( @@ -3244,12 +3529,12 @@ void CameraHidlTest::configurePreviewStream(const std::string &name, (int)status); ASSERT_EQ(Status::OK, status); ASSERT_NE(device, nullptr); - device3_2 = device; + device3_x = device; }); ASSERT_TRUE(ret.isOk()); sp cb = new DeviceCb(this); - ret = device3_2->open( + ret = device3_x->open( cb, [&](auto status, const auto& newSession) { ALOGI("device::open returns status:%d", (int)status); @@ -3260,7 +3545,7 @@ void CameraHidlTest::configurePreviewStream(const std::string &name, ASSERT_TRUE(ret.isOk()); camera_metadata_t *staticMeta; - ret = device3_2->getCameraCharacteristics([&] (Status s, + ret = device3_x->getCameraCharacteristics([&] (Status s, CameraMetadata metadata) { ASSERT_EQ(Status::OK, s); staticMeta = clone_camera_metadata( @@ -3309,7 +3594,7 @@ void CameraHidlTest::openEmptyDeviceSession(const std::string &name, ASSERT_NE(nullptr, session); ASSERT_NE(nullptr, staticMeta); - ::android::sp device3_2; + ::android::sp device3_x; ALOGI("configureStreams: Testing camera device %s", name.c_str()); Return ret; ret = provider->getCameraDeviceInterface_V3_x( @@ -3319,12 +3604,12 @@ void CameraHidlTest::openEmptyDeviceSession(const std::string &name, (int)status); ASSERT_EQ(Status::OK, status); ASSERT_NE(device, nullptr); - device3_2 = device; + device3_x = device; }); ASSERT_TRUE(ret.isOk()); sp cb = new EmptyDeviceCb(); - ret = device3_2->open(cb, [&](auto status, const auto& newSession) { + ret = device3_x->open(cb, [&](auto status, const auto& newSession) { ALOGI("device::open returns status:%d", (int)status); ASSERT_EQ(Status::OK, status); ASSERT_NE(newSession, nullptr); @@ -3332,7 +3617,7 @@ void CameraHidlTest::openEmptyDeviceSession(const std::string &name, }); ASSERT_TRUE(ret.isOk()); - ret = device3_2->getCameraCharacteristics([&] (Status s, + ret = device3_x->getCameraCharacteristics([&] (Status s, CameraMetadata metadata) { ASSERT_EQ(Status::OK, s); *staticMeta = clone_camera_metadata( From e224f065b8a49124d8873568f2d781edc76fc367 Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Fri, 29 Sep 2017 16:37:59 -0700 Subject: [PATCH 244/265] Camera: Update VTS for new camera@3.3 interfaces - Cross check device version in name with ICameraDeviceSession version - Switch all calls to configureStreams to configureStreams_3_3 when a v3.3 ICameraDeviceSession is available Test: Test passes on v3.3 devices, doesn't regress on v3.2 Bug: 62358514 Change-Id: I7450e5d5119c5ec1fe9f1360bfc99fc8a47d0936 --- camera/provider/2.4/vts/functional/Android.bp | 1 + .../VtsHalCameraProviderV2_4TargetTest.cpp | 280 +++++++++++++----- 2 files changed, 213 insertions(+), 68 deletions(-) diff --git a/camera/provider/2.4/vts/functional/Android.bp b/camera/provider/2.4/vts/functional/Android.bp index 84d76f1fbd..81d3de1566 100644 --- a/camera/provider/2.4/vts/functional/Android.bp +++ b/camera/provider/2.4/vts/functional/Android.bp @@ -34,6 +34,7 @@ cc_test { "android.hardware.camera.common@1.0-helper", "android.hardware.camera.device@1.0", "android.hardware.camera.device@3.2", + "android.hardware.camera.device@3.3", "android.hardware.camera.provider@2.4", "android.hardware.graphics.common@1.0", "android.hardware.graphics.mapper@2.0", diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index 34c583549a..e4cf9af273 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -101,6 +102,8 @@ using ::android::hardware::kSynchronizedReadWrite; using ResultMetadataQueue = MessageQueue; using ::android::hidl::manager::V1_0::IServiceManager; +using namespace ::android::hardware::camera; + const uint32_t kMaxPreviewWidth = 1920; const uint32_t kMaxPreviewHeight = 1080; const uint32_t kMaxVideoWidth = 4096; @@ -608,6 +611,7 @@ public: void openEmptyDeviceSession(const std::string &name, sp provider, sp *session /*out*/, + sp *session3_3 /*out*/, camera_metadata_t **staticMeta /*out*/); void configurePreviewStream(const std::string &name, sp provider, @@ -2148,7 +2152,16 @@ TEST_F(CameraHidlTest, openClose) { session = newSession; }); ASSERT_TRUE(ret.isOk()); - + // Ensure that a device labeling itself as 3.3 can have its session interface cast + // to the 3.3 interface, and that lower versions can't be cast to it. + auto castResult = device::V3_3::ICameraDeviceSession::castFrom(session); + ASSERT_TRUE(castResult.isOk()); + sp sessionV3_3 = castResult; + if (deviceVersion == CAMERA_DEVICE_API_VERSION_3_3) { + ASSERT_TRUE(sessionV3_3.get() != nullptr); + } else { + ASSERT_TRUE(sessionV3_3.get() == nullptr); + } native_handle_t* raw_handle = native_handle_create(1, 0); raw_handle->data[0] = open(kDumpOutput, O_RDWR); ASSERT_GE(raw_handle->data[0], 0); @@ -2279,6 +2292,7 @@ TEST_F(CameraHidlTest, constructDefaultRequestSettings) { } } + // Verify that all supported stream formats and sizes can be configured // successfully. TEST_F(CameraHidlTest, configureStreamsAvailableOutputs) { @@ -2293,7 +2307,9 @@ TEST_F(CameraHidlTest, configureStreamsAvailableOutputs) { camera_metadata_t* staticMeta; Return ret; sp session; - openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); + sp session3_3; + openEmptyDeviceSession(name, mProvider, + &session /*out*/, &session3_3 /*out*/, &staticMeta /*out*/); outputStreams.clear(); ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputStreams)); @@ -2311,12 +2327,21 @@ TEST_F(CameraHidlTest, configureStreamsAvailableOutputs) { StreamRotation::ROTATION_0}; ::android::hardware::hidl_vec streams = {stream}; StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams( - config, [streamId](Status s, HalStreamConfiguration halConfig) { - ASSERT_EQ(Status::OK, s); - ASSERT_EQ(1u, halConfig.streams.size()); - ASSERT_EQ(halConfig.streams[0].id, streamId); - }); + if (session3_3 == nullptr) { + ret = session->configureStreams(config, + [streamId](Status s, HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(1u, halConfig.streams.size()); + ASSERT_EQ(halConfig.streams[0].id, streamId); + }); + } else { + ret = session3_3->configureStreams_3_3(config, + [streamId](Status s, device::V3_3::HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(1u, halConfig.streams.size()); + ASSERT_EQ(halConfig.streams[0].v3_2.id, streamId); + }); + } ASSERT_TRUE(ret.isOk()); streamId++; } @@ -2352,7 +2377,9 @@ TEST_F(CameraHidlTest, configureStreamsInvalidOutputs) { camera_metadata_t* staticMeta; Return ret; sp session; - openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); + sp session3_3; + openEmptyDeviceSession(name, mProvider, + &session /*out*/, &session3_3 /*out*/, &staticMeta /*out*/); outputStreams.clear(); ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputStreams)); @@ -2369,9 +2396,19 @@ TEST_F(CameraHidlTest, configureStreamsInvalidOutputs) { StreamRotation::ROTATION_0}; ::android::hardware::hidl_vec streams = {stream}; StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { - ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || (Status::INTERNAL_ERROR == s)); - }); + if(session3_3 == nullptr) { + ret = session->configureStreams(config, + [](Status s, HalStreamConfiguration) { + ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || + (Status::INTERNAL_ERROR == s)); + }); + } else { + ret = session3_3->configureStreams_3_3(config, + [](Status s, device::V3_3::HalStreamConfiguration) { + ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || + (Status::INTERNAL_ERROR == s)); + }); + } ASSERT_TRUE(ret.isOk()); stream = {streamId++, @@ -2384,9 +2421,17 @@ TEST_F(CameraHidlTest, configureStreamsInvalidOutputs) { StreamRotation::ROTATION_0}; streams[0] = stream; config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); - }); + if(session3_3 == nullptr) { + ret = session->configureStreams(config, [](Status s, + HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + } else { + ret = session3_3->configureStreams_3_3(config, [](Status s, + device::V3_3::HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + } ASSERT_TRUE(ret.isOk()); for (auto& it : outputStreams) { @@ -2400,9 +2445,17 @@ TEST_F(CameraHidlTest, configureStreamsInvalidOutputs) { StreamRotation::ROTATION_0}; streams[0] = stream; config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); - }); + if(session3_3 == nullptr) { + ret = session->configureStreams(config, + [](Status s, HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + } else { + ret = session3_3->configureStreams_3_3(config, + [](Status s, device::V3_3::HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + } ASSERT_TRUE(ret.isOk()); stream = {streamId++, @@ -2415,9 +2468,17 @@ TEST_F(CameraHidlTest, configureStreamsInvalidOutputs) { static_cast(UINT32_MAX)}; streams[0] = stream; config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); - }); + if(session3_3 == nullptr) { + ret = session->configureStreams(config, + [](Status s, HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + } else { + ret = session3_3->configureStreams_3_3(config, + [](Status s, device::V3_3::HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + } ASSERT_TRUE(ret.isOk()); } @@ -2454,7 +2515,9 @@ TEST_F(CameraHidlTest, configureStreamsZSLInputOutputs) { camera_metadata_t* staticMeta; Return ret; sp session; - openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); + sp session3_3; + openEmptyDeviceSession(name, mProvider, + &session /*out*/, &session3_3 /*out*/, &staticMeta /*out*/); Status rc = isZSLModeAvailable(staticMeta); if (Status::METHOD_NOT_SUPPORTED == rc) { @@ -2515,13 +2578,19 @@ TEST_F(CameraHidlTest, configureStreamsZSLInputOutputs) { outputStream}; StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, - [](Status s, - HalStreamConfiguration halConfig) { - ASSERT_EQ(Status::OK, s); - ASSERT_EQ(3u, - halConfig.streams.size()); - }); + if (session3_3 == nullptr) { + ret = session->configureStreams(config, + [](Status s, HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(3u, halConfig.streams.size()); + }); + } else { + ret = session3_3->configureStreams_3_3(config, + [](Status s, device::V3_3::HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(3u, halConfig.streams.size()); + }); + } ASSERT_TRUE(ret.isOk()); } } @@ -2563,7 +2632,9 @@ TEST_F(CameraHidlTest, configureStreamsPreviewStillOutputs) { camera_metadata_t* staticMeta; Return ret; sp session; - openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); + sp session3_3; + openEmptyDeviceSession(name, mProvider, + &session /*out*/, &session3_3 /*out*/, &staticMeta /*out*/); outputBlobStreams.clear(); ASSERT_EQ(Status::OK, @@ -2599,13 +2670,19 @@ TEST_F(CameraHidlTest, configureStreamsPreviewStillOutputs) { blobStream}; StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, - [](Status s, - HalStreamConfiguration halConfig) { - ASSERT_EQ(Status::OK, s); - ASSERT_EQ(2u, - halConfig.streams.size()); - }); + if (session3_3 == nullptr) { + ret = session->configureStreams(config, + [](Status s, HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(2u, halConfig.streams.size()); + }); + } else { + ret = session3_3->configureStreams_3_3(config, + [](Status s, device::V3_3::HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(2u, halConfig.streams.size()); + }); + } ASSERT_TRUE(ret.isOk()); } } @@ -2642,7 +2719,9 @@ TEST_F(CameraHidlTest, configureStreamsConstrainedOutputs) { camera_metadata_t* staticMeta; Return ret; sp session; - openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); + sp session3_3; + openEmptyDeviceSession(name, mProvider, + &session /*out*/, &session3_3 /*out*/, &staticMeta /*out*/); Status rc = isConstrainedModeAvailable(staticMeta); if (Status::METHOD_NOT_SUPPORTED == rc) { @@ -2668,13 +2747,21 @@ TEST_F(CameraHidlTest, configureStreamsConstrainedOutputs) { ::android::hardware::hidl_vec streams = {stream}; StreamConfiguration config = {streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; - ret = session->configureStreams(config, - [streamId](Status s, - HalStreamConfiguration halConfig) { - ASSERT_EQ(Status::OK, s); - ASSERT_EQ(1u, halConfig.streams.size()); - ASSERT_EQ(halConfig.streams[0].id, streamId); - }); + if (session3_3 == nullptr) { + ret = session->configureStreams(config, + [streamId](Status s, HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(1u, halConfig.streams.size()); + ASSERT_EQ(halConfig.streams[0].id, streamId); + }); + } else { + ret = session3_3->configureStreams_3_3(config, + [streamId](Status s, device::V3_3::HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(1u, halConfig.streams.size()); + ASSERT_EQ(halConfig.streams[0].v3_2.id, streamId); + }); + } ASSERT_TRUE(ret.isOk()); stream = {streamId++, @@ -2687,9 +2774,19 @@ TEST_F(CameraHidlTest, configureStreamsConstrainedOutputs) { StreamRotation::ROTATION_0}; streams[0] = stream; config = {streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; - ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { - ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || (Status::INTERNAL_ERROR == s)); - }); + if (session3_3 == nullptr) { + ret = session->configureStreams(config, + [](Status s, HalStreamConfiguration) { + ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || + (Status::INTERNAL_ERROR == s)); + }); + } else { + ret = session3_3->configureStreams_3_3(config, + [](Status s, device::V3_3::HalStreamConfiguration) { + ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || + (Status::INTERNAL_ERROR == s)); + }); + } ASSERT_TRUE(ret.isOk()); stream = {streamId++, @@ -2702,9 +2799,17 @@ TEST_F(CameraHidlTest, configureStreamsConstrainedOutputs) { StreamRotation::ROTATION_0}; streams[0] = stream; config = {streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; - ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); - }); + if (session3_3 == nullptr) { + ret = session->configureStreams(config, + [](Status s, HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + } else { + ret = session3_3->configureStreams_3_3(config, + [](Status s, device::V3_3::HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + } ASSERT_TRUE(ret.isOk()); stream = {streamId++, @@ -2717,9 +2822,17 @@ TEST_F(CameraHidlTest, configureStreamsConstrainedOutputs) { StreamRotation::ROTATION_0}; streams[0] = stream; config = {streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE}; - ret = session->configureStreams(config, [](Status s, HalStreamConfiguration) { - ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); - }); + if (session3_3 == nullptr) { + ret = session->configureStreams(config, + [](Status s, HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + } else { + ret = session3_3->configureStreams_3_3(config, + [](Status s, device::V3_3::HalStreamConfiguration) { + ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); + }); + } ASSERT_TRUE(ret.isOk()); free_camera_metadata(staticMeta); @@ -2759,7 +2872,9 @@ TEST_F(CameraHidlTest, configureStreamsVideoStillOutputs) { camera_metadata_t* staticMeta; Return ret; sp session; - openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); + sp session3_3; + openEmptyDeviceSession(name, mProvider, + &session /*out*/, &session3_3 /*out*/, &staticMeta /*out*/); outputBlobStreams.clear(); ASSERT_EQ(Status::OK, @@ -2795,13 +2910,19 @@ TEST_F(CameraHidlTest, configureStreamsVideoStillOutputs) { ::android::hardware::hidl_vec streams = {videoStream, blobStream}; StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = session->configureStreams(config, - [](Status s, - HalStreamConfiguration halConfig) { - ASSERT_EQ(Status::OK, s); - ASSERT_EQ(2u, - halConfig.streams.size()); - }); + if (session3_3 == nullptr) { + ret = session->configureStreams(config, + [](Status s, HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(2u, halConfig.streams.size()); + }); + } else { + ret = session3_3->configureStreams_3_3(config, + [](Status s, device::V3_3::HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(2u, halConfig.streams.size()); + }); + } ASSERT_TRUE(ret.isOk()); } } @@ -3544,6 +3665,10 @@ void CameraHidlTest::configurePreviewStream(const std::string &name, }); ASSERT_TRUE(ret.isOk()); + auto castResult = device::V3_3::ICameraDeviceSession::castFrom(*session); + ASSERT_TRUE(castResult.isOk()); + sp session3_3 = castResult; + camera_metadata_t *staticMeta; ret = device3_x->getCameraCharacteristics([&] (Status s, CameraMetadata metadata) { @@ -3577,12 +3702,24 @@ void CameraHidlTest::configurePreviewStream(const std::string &name, ::android::hardware::hidl_vec streams = {*previewStream}; StreamConfiguration config = {streams, StreamConfigurationMode::NORMAL_MODE}; - ret = (*session)->configureStreams(config, [&] (Status s, - HalStreamConfiguration halConfig) { - ASSERT_EQ(Status::OK, s); - ASSERT_EQ(1u, halConfig.streams.size()); - *halStreamConfig = halConfig; - }); + if (session3_3 == nullptr) { + ret = (*session)->configureStreams(config, + [&] (Status s, HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(1u, halConfig.streams.size()); + *halStreamConfig = halConfig; + }); + } else { + ret = session3_3->configureStreams_3_3(config, + [&] (Status s, device::V3_3::HalStreamConfiguration halConfig) { + ASSERT_EQ(Status::OK, s); + ASSERT_EQ(1u, halConfig.streams.size()); + halStreamConfig->streams.resize(halConfig.streams.size()); + for (size_t i = 0; i < halConfig.streams.size(); i++) { + halStreamConfig->streams[i] = halConfig.streams[i].v3_2; + } + }); + } ASSERT_TRUE(ret.isOk()); } @@ -3590,6 +3727,7 @@ void CameraHidlTest::configurePreviewStream(const std::string &name, void CameraHidlTest::openEmptyDeviceSession(const std::string &name, sp provider, sp *session /*out*/, + sp *session3_3 /*out*/, camera_metadata_t **staticMeta /*out*/) { ASSERT_NE(nullptr, session); ASSERT_NE(nullptr, staticMeta); @@ -3625,6 +3763,12 @@ void CameraHidlTest::openEmptyDeviceSession(const std::string &name, ASSERT_NE(nullptr, *staticMeta); }); ASSERT_TRUE(ret.isOk()); + + if(session3_3 != nullptr) { + auto castResult = device::V3_3::ICameraDeviceSession::castFrom(*session); + ASSERT_TRUE(castResult.isOk()); + *session3_3 = castResult; + } } // Open a particular camera device. From cf22a57c1a05272d055b0deaa10094852dece797 Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Fri, 22 Sep 2017 13:26:12 -0700 Subject: [PATCH 245/265] NNAPI HAL: Change IEvent to explicit callbacks IEvent was a synchronization primitive which caused some confusion in the interface. Originally the event object was paired with an asynchronous task, and the asynchronous task would signal this event when the corresponding output was ready to be used. In the case of IDevice::prepareModel, the function call would return an IPreparedModel object that was not guaranteed to be prepared until the runtime had returned from waiting on the corresponding event object. The event object has been changed to two explicit callbacks-- IPreparedModelCallback and IExecutionCallback. Now, IDevice::prepareModel no longer returns an unfinished IPreparedModel; instead, it will pass the IPreparedModel object to the runtime through IPreparedModelCallback::notify. When the runtime retreives the IPreparedModel object, the asynchronous task has already finished preparing the model. The two callbacks are used for different purposes. Each has its own version of notify to pass the data back to the runtime: * IPreparedModelCallback::notify(ErrorStatus, IPreparedModel) * IExecutionCallback::notify(ErrorStatus) Bug: 63905942 Test: mm, vts, ml/nn/runtime/tests Change-Id: I0c88cd262ba762e0af15e9da31ebe813a5d150b2 --- neuralnetworks/1.0/Android.bp | 21 +- neuralnetworks/1.0/IDevice.hal | 65 +++- neuralnetworks/1.0/IEvent.hal | 45 --- neuralnetworks/1.0/IExecutionCallback.hal | 44 +++ neuralnetworks/1.0/IPreparedModel.hal | 38 ++- neuralnetworks/1.0/IPreparedModelCallback.hal | 53 +++ neuralnetworks/1.0/vts/functional/Android.bp | 2 +- .../1.0/vts/functional/Callbacks.cpp | 127 +++++++ neuralnetworks/1.0/vts/functional/Callbacks.h | 319 ++++++++++++++++++ neuralnetworks/1.0/vts/functional/Event.cpp | 94 ------ neuralnetworks/1.0/vts/functional/Event.h | 216 ------------ .../vts/functional/GeneratedTestHarness.cpp | 55 +-- .../VtsHalNeuralnetworksV1_0TargetTest.cpp | 179 +++++----- .../VtsHalNeuralnetworksV1_0TargetTest.h | 19 +- 14 files changed, 779 insertions(+), 498 deletions(-) delete mode 100644 neuralnetworks/1.0/IEvent.hal create mode 100644 neuralnetworks/1.0/IExecutionCallback.hal create mode 100644 neuralnetworks/1.0/IPreparedModelCallback.hal create mode 100644 neuralnetworks/1.0/vts/functional/Callbacks.cpp create mode 100644 neuralnetworks/1.0/vts/functional/Callbacks.h delete mode 100644 neuralnetworks/1.0/vts/functional/Event.cpp delete mode 100644 neuralnetworks/1.0/vts/functional/Event.h diff --git a/neuralnetworks/1.0/Android.bp b/neuralnetworks/1.0/Android.bp index d7c3bbbf72..ba32d0c396 100644 --- a/neuralnetworks/1.0/Android.bp +++ b/neuralnetworks/1.0/Android.bp @@ -5,8 +5,9 @@ filegroup { srcs: [ "types.hal", "IDevice.hal", - "IEvent.hal", + "IExecutionCallback.hal", "IPreparedModel.hal", + "IPreparedModelCallback.hal", ], } @@ -20,8 +21,9 @@ genrule { out: [ "android/hardware/neuralnetworks/1.0/types.cpp", "android/hardware/neuralnetworks/1.0/DeviceAll.cpp", - "android/hardware/neuralnetworks/1.0/EventAll.cpp", + "android/hardware/neuralnetworks/1.0/ExecutionCallbackAll.cpp", "android/hardware/neuralnetworks/1.0/PreparedModelAll.cpp", + "android/hardware/neuralnetworks/1.0/PreparedModelCallbackAll.cpp", ], } @@ -40,16 +42,21 @@ genrule { "android/hardware/neuralnetworks/1.0/BnHwDevice.h", "android/hardware/neuralnetworks/1.0/BpHwDevice.h", "android/hardware/neuralnetworks/1.0/BsDevice.h", - "android/hardware/neuralnetworks/1.0/IEvent.h", - "android/hardware/neuralnetworks/1.0/IHwEvent.h", - "android/hardware/neuralnetworks/1.0/BnHwEvent.h", - "android/hardware/neuralnetworks/1.0/BpHwEvent.h", - "android/hardware/neuralnetworks/1.0/BsEvent.h", + "android/hardware/neuralnetworks/1.0/IExecutionCallback.h", + "android/hardware/neuralnetworks/1.0/IHwExecutionCallback.h", + "android/hardware/neuralnetworks/1.0/BnHwExecutionCallback.h", + "android/hardware/neuralnetworks/1.0/BpHwExecutionCallback.h", + "android/hardware/neuralnetworks/1.0/BsExecutionCallback.h", "android/hardware/neuralnetworks/1.0/IPreparedModel.h", "android/hardware/neuralnetworks/1.0/IHwPreparedModel.h", "android/hardware/neuralnetworks/1.0/BnHwPreparedModel.h", "android/hardware/neuralnetworks/1.0/BpHwPreparedModel.h", "android/hardware/neuralnetworks/1.0/BsPreparedModel.h", + "android/hardware/neuralnetworks/1.0/IPreparedModelCallback.h", + "android/hardware/neuralnetworks/1.0/IHwPreparedModelCallback.h", + "android/hardware/neuralnetworks/1.0/BnHwPreparedModelCallback.h", + "android/hardware/neuralnetworks/1.0/BpHwPreparedModelCallback.h", + "android/hardware/neuralnetworks/1.0/BsPreparedModelCallback.h", ], } diff --git a/neuralnetworks/1.0/IDevice.hal b/neuralnetworks/1.0/IDevice.hal index 91a9555b6d..49c29674ee 100644 --- a/neuralnetworks/1.0/IDevice.hal +++ b/neuralnetworks/1.0/IDevice.hal @@ -16,8 +16,7 @@ package android.hardware.neuralnetworks@1.0; -import IEvent; -import IPreparedModel; +import IPreparedModelCallback; /** * This interface represents a device driver. @@ -37,10 +36,9 @@ interface IDevice { /** * Gets the supported operations in a model. * - * getSupportedSubgraph provides a more nuanced indication on whether a - * model is able to be compiled by the driver. Having the entire model - * allows for additional information such as tensor shapes to inputs or - * tensor strides, information which is not known in "initialize". + * getSupportedSubgraph indicates which operations of a model are fully + * supported by the vendor driver. If an operation may not be supported for + * any reason, getSupportedOperations must return false for that operation. * * @param model A model whose operations--and their corresponding * operands--are to be verified by the driver. @@ -48,7 +46,7 @@ interface IDevice { * - NONE if successful * - DEVICE_UNAVAILABLE if driver is offline or busy * - GENERAL_FAILURE if there is an unspecified error - * - INVALID_ARGUMENT when provided model is invalid + * - INVALID_ARGUMENT if provided model is invalid * @return supportedOperations A list of supported operations, where true * indicates the operation is supported and * false indicates the operation is not @@ -60,29 +58,60 @@ interface IDevice { generates (ErrorStatus status, vec supportedOperations); /** - * Prepares a model for execution. + * Creates a prepared model for execution. * * prepareModel is used to make any necessary transformations or alternative - * representations to a model for execution, possible including + * representations to a model for execution, possiblly including * transformations on the constant data, optimization on the model's graph, - * or compilation into the device's native binary format. + * or compilation into the device's native binary format. The model itself + * is not changed. + * + * The model is prepared asynchronously with respect to the caller. The + * prepareModel function must verify the inputs to the prepareModel function + * are correct. If there is an error, prepareModel must immediately invoke + * the callback with the appropriate ErrorStatus value and nullptr for the + * IPreparedModel, then return with the same ErrorStatus. If the inputs to + * the prepareModel function are valid and there is no error, prepareModel + * must launch an asynchronous task to prepare the model in the background, + * and immediately return from prepareModel with ErrorStatus::NONE. If the + * asynchronous task fails to launch, prepareModel must immediately invoke + * the callback with ErrorStatus::GENERAL_FAILURE and nullptr for the + * IPreparedModel, then return with ErrorStatus::GENERAL_FAILURE. + * + * When the asynchronous task has finished preparing the model, it must + * immediately invoke the callback function provided as an input to + * prepareModel. If the model was prepared successfully, the callback object + * must be invoked with an error status of ErrorStatus::NONE and the + * produced IPreparedModel object. If an error occurred preparing the model, + * the callback object must be invoked with the appropriate ErrorStatus + * value and nullptr for the IPreparedModel. * * The only information that may be unknown to the model at this stage is - * the shape of the tensors, which may only be known at execution time. + * the shape of the tensors, which may only be known at execution time. As + * such, some driver services may return partially prepared models, where + * the prepared model can only be finished when it is paired with a set of + * inputs to the model. Note that the same prepared model object can be + * used with different shapes of inputs on different (possibly concurrent) + * executions. + * + * Multiple threads can call prepareModel on the same model concurrently. * * @param model The model to be prepared for execution. - * @param event A synchronization callback that must be signaled once the - * execution has finished. - * @return status Error status of the call, must be: + * @param callback A callback object used to return the error status of + * preparing the model for execution and the prepared model + * if successful, nullptr otherwise. The callback object's + * notify function must be called exactly once, even if the + * model could not be prepared. + * @return status Error status of launching a task which prepares the model + * in the background; must be: * - NONE if preparation task is successfully launched * - DEVICE_UNAVAILABLE if driver is offline or busy * - GENERAL_FAILURE if there is an unspecified error - * - INVALID_ARGUMENT when one of the input arguments is + * - INVALID_ARGUMENT if one of the input arguments is * invalid - * @return preparedModel A handle to the resultant prepared model. */ - prepareModel(Model model, IEvent event) - generates (ErrorStatus status, IPreparedModel preparedModel); + prepareModel(Model model, IPreparedModelCallback callback) + generates (ErrorStatus status); /** * Returns the current status of a driver. diff --git a/neuralnetworks/1.0/IEvent.hal b/neuralnetworks/1.0/IEvent.hal deleted file mode 100644 index 2fe454c1cd..0000000000 --- a/neuralnetworks/1.0/IEvent.hal +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 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. - */ - -package android.hardware.neuralnetworks@1.0; - -/** - * The IEvent interface is a callback object passed by the - * Neuralnetworks runtime to the vendor service. It is used as a - * synchronization primitive between one or more runtime threads and a - * single asynchronous vendor thread. An event object is passed as an - * argument to a HIDL call that is expected to take a non-trivial - * amount of time. When the asynchronous execution thread has - * completed its computation, it must call "notify" on the event to - * indicate to the Neuralnetworks runtime whether the computation was - * successful or not, and that the corresponding output is ready to be - * consumed if the execution was successful. - */ -interface IEvent { - - /** - * IEvent::notify is called by the server thread (i.e., the thread doing - * the work) to mark the event as completed so that any threads requiring - * the corresponding output can continue executing. - * - * @param status Error status returned from the asynchronous task, must be: - * - NONE if asynchronous task was successful - * - DEVICE_UNAVAILABLE if driver is offline or busy - * - GENERAL_FAILURE if the asynchronous task resulted in an - * unspecified error - */ - oneway notify(ErrorStatus status); -}; diff --git a/neuralnetworks/1.0/IExecutionCallback.hal b/neuralnetworks/1.0/IExecutionCallback.hal new file mode 100644 index 0000000000..ef0f4549dd --- /dev/null +++ b/neuralnetworks/1.0/IExecutionCallback.hal @@ -0,0 +1,44 @@ +/* + * Copyright (C) 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. + */ + +package android.hardware.neuralnetworks@1.0; + +/** + * IExecutionCallback must be used to return the error status result from an + * execution asynchronously launched from IPreparedModel::execute. + */ +interface IExecutionCallback { + + /** + * notify must be invoked immediately after the asynchronous task has + * finished performing the execution. notify must be provided with the + * ErrorStatus resulting from the execution. If the asynchronous task + * is not launched, notify must be invoked with the appropriate error. + * + * @return param Error status returned from launching the asynchronous task + * (if the launch fails) or from the asynchronous task itself + * (if the launch succeeds). Must be: + * - NONE if the asynchronous execution was successful + * - DEVICE_UNAVAILABLE if driver is offline or busy + * - GENERAL_FAILURE if the asynchronous task resulted in an + * unspecified error + * - OUTPUT_INSUFFICIENT_SIZE if provided output buffer is + * not large enough to store the resultant values + * - INVALID_ARGUMENT if one of the input arguments to + * prepareModel is invalid + */ + oneway notify(ErrorStatus status); +}; diff --git a/neuralnetworks/1.0/IPreparedModel.hal b/neuralnetworks/1.0/IPreparedModel.hal index 5df883e1d2..ee406fb79b 100644 --- a/neuralnetworks/1.0/IPreparedModel.hal +++ b/neuralnetworks/1.0/IPreparedModel.hal @@ -16,7 +16,7 @@ package android.hardware.neuralnetworks@1.0; -import IEvent; +import IExecutionCallback; /** * IPreparedModel describes a model that has been prepared for execution and @@ -24,28 +24,42 @@ import IEvent; */ interface IPreparedModel { /** - * Spawns an asynchronous execution on a prepared model. + * Launches an asynchronous execution on a prepared model. * - * Executions are asynchronous with respect to the Neuralnetworks runtime. - * To support this, IPreparedModel::execute must spawn a new task and return - * whether the task was successfully launched. The asynchronous task which - * performs the execution must call event's IEvent::notify with the status - * of the execution immediately after the execution has finished. + * The execution is performed asynchronously with respect to the caller. + * execute must verify the inputs to the function are correct. If there is + * an error, execute must immediately invoke the callback with the + * appropriate ErrorStatus value, then return with the same ErrorStatus. If + * the inputs to the function are valid and there is no error, execute must + * launch an asynchronous task to perform the execution in the background, + * and immediately return with ErrorStatus::NONE. If the asynchronous task + * fails to launch, execute must immediately invoke the callback with + * ErrorStatus::GENERAL_FAILURE, then return with + * ErrorStatus::GENERAL_FAILURE. * - * Multiple threads can call this execute function concurrently. + * When the asynchronous task has finished its execution, it must + * immediately invoke the callback object provided as an input to the + * execute function. This callback must be provided with the ErrorStatus of + * the execution. + * + * Multiple threads can call the execute function on the same IPreparedModel + * object concurrently with different requests. * * @param request The input and output information on which the prepared * model is to be executed. - * @param event A callback used for synchronization that must be signaled - * once the execution has finished. + * @param callback A callback object used to return the error status of + * the execution. The callback object's notify function must + * be called exactly once, even if the execution was + * unsuccessful. * @return status Error status of the call, must be: * - NONE if task is successfully launched * - DEVICE_UNAVAILABLE if driver is offline or busy * - GENERAL_FAILURE if there is an unspecified error * - OUTPUT_INSUFFICIENT_SIZE if provided output buffer is * not large enough to store the resultant values - * - INVALID_ARGUMENT when one of the input arguments is + * - INVALID_ARGUMENT if one of the input arguments is * invalid */ - execute(Request request, IEvent event) generates (ErrorStatus status); + execute(Request request, IExecutionCallback callback) + generates (ErrorStatus status); }; diff --git a/neuralnetworks/1.0/IPreparedModelCallback.hal b/neuralnetworks/1.0/IPreparedModelCallback.hal new file mode 100644 index 0000000000..fa1bf9d508 --- /dev/null +++ b/neuralnetworks/1.0/IPreparedModelCallback.hal @@ -0,0 +1,53 @@ +/* + * Copyright (C) 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. + */ + +package android.hardware.neuralnetworks@1.0; + +import IPreparedModel; + +/** + * IPreparedModelCallback must be used to return a prepared model produced by an + * asynchronous task launched from IDevice::prepareModel. + */ +interface IPreparedModelCallback { + + /** + * notify must be invoked immediately after the asynchronous task holding + * this callback has finished preparing the model. If the model was + * successfully prepared, notify must be invoked with ErrorStatus::NONE and + * the prepared model. If the model was not able to be successfully + * prepared, notify must be invoked with the appropriate ErrorStatus and + * nullptr as the IPreparedModel. If the asynchronous task holding this + * callback fails to launch or if the model provided to + * IDevice::prepareModel is invalid, notify must be invoked with the + * appropriate error as well as nullptr for the IPreparedModel. + * + * @param status Error status returned from the asynchronous model + * preparation task; must be: + * - NONE if the asynchronous task successfully prepared the + * model + * - DEVICE_UNAVAILABLE if driver is offline or busy + * - GENERAL_FAILURE if the asynchronous task resulted in an + * unspecified error + * - INVALID_ARGUMENT if one of the input arguments to + * prepareModel is invalid + * @param preparedModel A model that has been asynchronously prepared for + * execution. If the model was unable to be prepared + * due to an error, nullptr must be passed in place of + * the IPreparedModel object. + */ + oneway notify(ErrorStatus status, IPreparedModel preparedModel); +}; diff --git a/neuralnetworks/1.0/vts/functional/Android.bp b/neuralnetworks/1.0/vts/functional/Android.bp index 89e1021153..e33ee77f12 100644 --- a/neuralnetworks/1.0/vts/functional/Android.bp +++ b/neuralnetworks/1.0/vts/functional/Android.bp @@ -17,7 +17,7 @@ cc_test { name: "VtsHalNeuralnetworksV1_0TargetTest", srcs: [ - "Event.cpp", + "Callbacks.cpp", "GeneratedTestHarness.cpp", "Models.cpp", "VtsHalNeuralnetworksV1_0TargetTest.cpp", diff --git a/neuralnetworks/1.0/vts/functional/Callbacks.cpp b/neuralnetworks/1.0/vts/functional/Callbacks.cpp new file mode 100644 index 0000000000..46bf24350f --- /dev/null +++ b/neuralnetworks/1.0/vts/functional/Callbacks.cpp @@ -0,0 +1,127 @@ +#include "Callbacks.h" +#include + +namespace android { +namespace hardware { +namespace neuralnetworks { +namespace V1_0 { +namespace implementation { + +CallbackBase::CallbackBase() : mNotified(false) {} + +CallbackBase::~CallbackBase() { + // Note that we cannot call CallbackBase::join_thread from here: + // CallbackBase is intended to be reference counted, and it is possible that + // the reference count drops to zero in the bound thread, causing the + // bound thread to call this destructor. If a thread tries to join + // itself, it throws an exception, producing a message like the + // following: + // + // terminating with uncaught exception of type std::__1::system_error: + // thread::join failed: Resource deadlock would occur +} + +void CallbackBase::wait() { + std::unique_lock lock(mMutex); + mCondition.wait(lock, [this]{return mNotified;}); + join_thread_locked(); +} + +bool CallbackBase::on_finish(std::function post_work) { + std::lock_guard lock(mMutex); + if (mPostWork != nullptr) { + LOG(ERROR) << "CallbackBase::on_finish -- a post-work function has already been bound to " + "this callback object"; + return false; + } + if (post_work == nullptr) { + LOG(ERROR) << "CallbackBase::on_finish -- the new post-work function is invalid"; + return false; + } + mPostWork = std::move(post_work); + return true; +} + +bool CallbackBase::bind_thread(std::thread&& asyncThread) { + std::lock_guard lock(mMutex); + if (mThread.joinable()) { + LOG(ERROR) << "CallbackBase::bind_thread -- a thread has already been bound to this " + "callback object"; + return false; + } + if (!asyncThread.joinable()) { + LOG(ERROR) << "CallbackBase::bind_thread -- the new thread is not joinable"; + return false; + } + mThread = std::move(asyncThread); + return true; +} + +void CallbackBase::join_thread() { + std::lock_guard lock(mMutex); + join_thread_locked(); +} + +void CallbackBase::notify() { + { + std::lock_guard lock(mMutex); + mNotified = true; + if (mPostWork != nullptr) { + bool success = mPostWork(); + if (!success) { + LOG(ERROR) << "CallbackBase::notify -- post work failed"; + } + } + } + mCondition.notify_all(); +} + +void CallbackBase::join_thread_locked() { + if (mThread.joinable()) { + mThread.join(); + } +} + +PreparedModelCallback::PreparedModelCallback() : + mErrorStatus(ErrorStatus::GENERAL_FAILURE), mPreparedModel(nullptr) {} + +PreparedModelCallback::~PreparedModelCallback() {} + +Return PreparedModelCallback::notify(ErrorStatus errorStatus, + const sp& preparedModel) { + mErrorStatus = errorStatus; + mPreparedModel = preparedModel; + CallbackBase::notify(); + return Void(); +} + +ErrorStatus PreparedModelCallback::getStatus() { + wait(); + return mErrorStatus; +} + +sp PreparedModelCallback::getPreparedModel() { + wait(); + return mPreparedModel; +} + +ExecutionCallback::ExecutionCallback() : mErrorStatus(ErrorStatus::GENERAL_FAILURE) {} + +ExecutionCallback::~ExecutionCallback() {} + +Return ExecutionCallback::notify(ErrorStatus errorStatus) { + mErrorStatus = errorStatus; + CallbackBase::notify(); + return Void(); +} + +ErrorStatus ExecutionCallback::getStatus() { + wait(); + return mErrorStatus; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace neuralnetworks +} // namespace hardware +} // namespace android diff --git a/neuralnetworks/1.0/vts/functional/Callbacks.h b/neuralnetworks/1.0/vts/functional/Callbacks.h new file mode 100644 index 0000000000..0e2ffb324a --- /dev/null +++ b/neuralnetworks/1.0/vts/functional/Callbacks.h @@ -0,0 +1,319 @@ +#ifndef ANDROID_HARDWARE_NEURALNETWORKS_V1_0_CALLBACKS_H +#define ANDROID_HARDWARE_NEURALNETWORKS_V1_0_CALLBACKS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace android { +namespace hardware { +namespace neuralnetworks { +namespace V1_0 { +namespace implementation { + +using ::android::hardware::hidl_array; +using ::android::hardware::hidl_memory; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +/** + * The CallbackBase class is used internally by the NeuralNetworks runtime to + * synchronize between different threads. An asynchronous task is launched + * paired with a callback object. When a client thread requires the output being + * generated by the asynchronous task, the client thread can wait for the result + * and be blocked until it has completed or a timeout condition has been + * reached. Any wait* may safely be called concurrently, even on the same + * callback object. When the asynchronous task has finished its workload, it + * must immediately call "notify". If the asynchronous task has failed to launch, + * the function that tried to launch the asynchronous task must immediately call + * "notify". This "notify" call awakens any client threads waiting on the + * callback object. + * + * callback object. When the asynchronous task has finished its workload or has + * failed to launch, it must immediately call "notify", awakening any client + * threads waiting on the callback object. + * + * The CallbackBase class implements some of the base synchronization common to + * both PrepareModelCallback and ExecutionCallback. For consistency, any HIDL + * callback class must inherit from CallbackBase as well as the HIDL callback + * interface it implements. + * + * This class exists to enable synchronization across HIDL. When synchronization + * is only required in the same process, consider using std::future, std::mutex, + * std::condition_variable, or std::experimental::latch instead. + */ +class CallbackBase { + public: + CallbackBase(); + ~CallbackBase(); + + /** + * CallbackBase::wait blocks until notify has been called on the callback + * object. + */ + void wait(); + + /** + * CallbackBase::wait_for blocks until notify has been called on the + * callback object or the time duration from the time the wait_for function + * was called has expired, whichever comes first. + * + * @return Status std::cv_status::no_timeout if the callback was notified + * before the time duration expired, std::cv_status::timeout + * otherwise. + */ + template + std::cv_status wait_for(const std::chrono::duration& timeout_duration); + + /** + * CallbackBase::on_finish binds a function to the callback object. This + * bound function will be executed when CallbackBase::notify is called, + * before any calls to wait* return. (Note that CallbackBase::wait_for can + * return std::cv_status::timeout before CallbackBase::notify is called for + * the first time, and hence before the bound function is executed.) + * + * The bound function must not synchronize with or otherwise access the + * callback object it is bound to, as this could cause a deadlock. + * + * CallbackBase::on_finish can be called at most once on a given callback + * object, and the call to CallbackBase::on_finish must finish before + * CallbackBase::notify is called. + * + * @param post_work Function to be invoked the first time + * CallbackBase::notify is called. Must have a target -- + * i.e., must not compare equal to nullptr. post_work + * returns true if it successfully completes, false if it + * fails. + * @return bool True if the function was successfully bound, false if + * unsuccessful. + * + * TODO: Why does the return value of the callback matter? + */ + bool on_finish(std::function post_work); + + /** + * CallbackBase::bind_thread binds a thread to the event for later use by + * CallbackBase::join_thread. + * + * The thread must be passed using std::move. + * + * Once a thread is bound with CallbackBase::bind_thread, the client code + * should ensure that one of the following occurs before the event is + * destroyed: + * - CallbackBase::join_thread has been called. + * - CallbackBase::wait has been called. + * - CallbackBase::wait_for has been called and returned other than + * std::cv_status::no_timeout. + * + * The bound thread shall not call any CallbackBase method with the + * exception of CallbackBase::notify, which it must call when the thread has + * finished its computation. + * + * CallbackBase::bind_thread can be called at most once on a given callback + * object. + * + * @param asyncThread Thread to be bound to the callback object. The thread + * object must represent a thread of execution -- i.e., + * asyncThread.joinable() must be true. + * @return bool True if successful, false if thread was not properly bound. + */ + bool bind_thread(std::thread&& asyncThread); + + /** + * CallbackBase::join_thread ensures that the thread (if any) bound to this + * event with CallbackBase::bind_thread has fully finished and cleaned its + * resources. It is legal to call this function multiple times, concurrently + * or sequentially. + */ + void join_thread(); + + protected: + /** + * CallbackBase::notify enables all prior and future wait* calls on the + * callback object to proceed. The call to CallbackBase::notify happens + * before any wait* calls on this callback object return (except in the case + * of wait_for timing out). The asynchronous call the callback object is + * paired with must ensure that any update to state that should be visible + * to the caller of wait* happens before the call to CallbackBase::notify. + * + * CallbackBase::notify must be called exactly once on a given callback + * object. + */ + void notify(); + + private: + // Same as CallbackBase::join_thread but assumes we already hold a lock on + // mMutex. + void join_thread_locked(); + + bool mNotified; + std::mutex mMutex; + std::condition_variable mCondition; + std::function mPostWork; + std::thread mThread; +}; + +/** + * The PreparedModelCallback class is used to receive the error status of + * preparing a model as well as the prepared model from a task executing + * asynchronously with respect to the runtime. If a calling thread calls wait* + * or get* on a PreparedModelCallback object and the corresponding asynchronous + * task has not finished preparing the model, the calling thread will block + * until the asynchronous task has called notify. For more information on the + * synchronization behavior, refer to the CallbackBase class. + * + * This class inherits the basic blocking and signaling calls from + * CallbackBase, and implements the HIDL notify call from + * IPreparedModelCallback. This callback object is passed as an argument to + * IDevice::prepareModel. + */ +class PreparedModelCallback : public CallbackBase, public IPreparedModelCallback { + public: + PreparedModelCallback(); + ~PreparedModelCallback() override; + + /** + * IPreparedModelCallback::notify marks the callback object with the return + * status of the asynchronous model preparation along with the prepared + * model, and calls CallbackBase::notify, enabling all prior and future + * wait* calls on the PreparedModelCallback object to proceed. For more + * information on the synchronization behavior, refer to the CallbackBase + * class. + * + * IPreparedModelCallback::notify must be called exactly once on a given + * PreparedModelCallback object. + * + * @param status Error status returned from asynchronously preparing the + * model; will be: + * - NONE if the asynchronous preparation was successful + * - DEVICE_UNAVAILABLE if driver is offline or busy + * - GENERAL_FAILURE if there is an unspecified error + * - INVALID_ARGUMENT if the input model is invalid + * @param preparedModel Returned model that has been prepared for execution, + * nullptr if the model was unable to be prepared. + */ + Return notify(ErrorStatus status, const sp& preparedModel) override; + + /** + * Retrieves the error status returned from the asynchronous task launched + * by IDevice::prepareModel. If IDevice::prepareModel has not finished + * asynchronously preparing the model, this call will block until the + * asynchronous task notifies the object. + * + * @return status Error status returned from asynchronously preparing the + * model; will be: + * - NONE if the asynchronous preparation was successful + * - DEVICE_UNAVAILABLE if driver is offline or busy + * - GENERAL_FAILURE if there is an unspecified error + * - INVALID_ARGUMENT if the input model is invalid + */ + ErrorStatus getStatus(); + + /** + * Retrieves the model that has been prepared for execution from the + * asynchronous task launched by IDevice::prepareModel. If + * IDevice::prepareModel has not finished asynchronously preparing the + * model, this call will block until the asynchronous task notifies the + * object. + * + * @return preparedModel Returned model that has been prepared for + * execution, nullptr if the model was unable to be + * prepared. + */ + sp getPreparedModel(); + + private: + ErrorStatus mErrorStatus; + sp mPreparedModel; +}; + +/** + * The ExecutionCallback class is used to receive the error status of the + * execution from a task executing asynchronously with respect to the runtime. + * If a calling thread calls wait* or get* on a PreparedModelCallback object and + * the corresponding asynchronous task has not finished the execution, the + * calling thread will block until the asynchronous task has called notify. For + * more information on the synchronization behavior, refer to the CallbackBase + * class. + * + * This class inherits the basic blocking and signaling calls from + * CallbackBase, and implements the HIDL notify call from + * IExecutionCallback. This callback object is passed as an argument to + * IPreparedModel::execute. + */ +class ExecutionCallback : public CallbackBase, public IExecutionCallback { + public: + ExecutionCallback(); + ~ExecutionCallback() override; + + /** + * IExecutionCallback::notify marks the callback object with the return + * status of the asynchronous execution that held this callback and enables + * all prior and future wait* calls on the ExecutionCallback object to + * proceed. For more information on the synchronization behavior, refer to + * the CallbackBase class. + * + * IExecutionCallback::notify must be called exactly once on a given + * ExecutionCallback object. + * + * @param status Error status returned from asynchronously preparing the + * model; will be: + * - NONE if the asynchronous execution was successful + * - DEVICE_UNAVAILABLE if driver is offline or busy + * - GENERAL_FAILURE if there is an unspecified error + * - OUTPUT_INSUFFICIENT_SIZE if provided output buffer is + * not large enough to store the resultant values + * - INVALID_ARGUMENT if the input request is invalid + */ + Return notify(ErrorStatus status) override; + + /** + * Retrieves the error status returned from the asynchronous task launched + * by IPreparedModel::execute. If IPreparedModel::execute has not finished + * asynchronously executing, this call will block until the asynchronous task + * notifies the object. + * + * @return status Error status returned from asynchronously preparing the + * model; will be: + * - NONE if the asynchronous execution was successful + * - DEVICE_UNAVAILABLE if driver is offline or busy + * - GENERAL_FAILURE if there is an unspecified error + * - OUTPUT_INSUFFICIENT_SIZE if provided output buffer is + * not large enough to store the resultant values + * - INVALID_ARGUMENT if the input request is invalid + */ + ErrorStatus getStatus(); + + private: + ErrorStatus mErrorStatus; +}; + + +// template function implementation(s) below this point + +template +std::cv_status CallbackBase::wait_for(const std::chrono::duration& timeout_duration) { + std::unique_lock lock(mMutex); + std::cv_status status = mCondition.wait_for(lock, timeout_duration, [this]{return mNotified;}); + if (status != std::cv_status::timeout) { + join_thread_locked(); + } + return status; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace neuralnetworks +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_NEURALNETWORKS_V1_0_CALLBACKS_H diff --git a/neuralnetworks/1.0/vts/functional/Event.cpp b/neuralnetworks/1.0/vts/functional/Event.cpp deleted file mode 100644 index efaacb3dcb..0000000000 --- a/neuralnetworks/1.0/vts/functional/Event.cpp +++ /dev/null @@ -1,94 +0,0 @@ -#include "Event.h" -#include - -namespace android { -namespace hardware { -namespace neuralnetworks { -namespace V1_0 { -namespace implementation { - -Event::Event() : mStatus(Status::WAITING) {} - -Event::~Event() { - // Note that we cannot call Event::join_thread from here: Event is - // intended to be reference counted, and it is possible that the - // reference count drops to zero in the bound thread, causing the - // bound thread to call this destructor. If a thread tries to join - // itself, it throws an exception, producing a message like the - // following: - // - // terminating with uncaught exception of type std::__1::system_error: - // thread::join failed: Resource deadlock would occur -} - -Return Event::notify(ErrorStatus status) { - { - std::lock_guard lock(mMutex); - mStatus = status == ErrorStatus::NONE ? Status::SUCCESS : Status::ERROR; - if (mStatus == Status::SUCCESS && mCallback != nullptr) { - bool success = mCallback(); - if (!success) { - LOG(ERROR) << "Event::notify -- callback failed"; - } - } - } - mCondition.notify_all(); - return Void(); -} - -Event::Status Event::poll() { - std::lock_guard lock(mMutex); - return mStatus; -} - -Event::Status Event::wait() { - std::unique_lock lock(mMutex); - mCondition.wait(lock, [this]{return mStatus != Status::WAITING;}); - join_thread_locked(); - return mStatus; -} - -bool Event::on_finish(std::function callback) { - std::lock_guard lock(mMutex); - if (mCallback != nullptr) { - LOG(ERROR) << "Event::on_finish -- a callback has already been bound to this event"; - return false; - } - if (callback == nullptr) { - LOG(ERROR) << "Event::on_finish -- the new callback is invalid"; - return false; - } - mCallback = std::move(callback); - return true; -} - -bool Event::bind_thread(std::thread&& asyncThread) { - std::lock_guard lock(mMutex); - if (mThread.joinable()) { - LOG(ERROR) << "Event::bind_thread -- a thread has already been bound to this event"; - return false; - } - if (!asyncThread.joinable()) { - LOG(ERROR) << "Event::bind_thread -- the new thread is not joinable"; - return false; - } - mThread = std::move(asyncThread); - return true; -} - -void Event::join_thread() { - std::lock_guard lock(mMutex); - join_thread_locked(); -} - -void Event::join_thread_locked() { - if (mThread.joinable()) { - mThread.join(); - } -} - -} // namespace implementation -} // namespace V1_0 -} // namespace neuralnetworks -} // namespace hardware -} // namespace android diff --git a/neuralnetworks/1.0/vts/functional/Event.h b/neuralnetworks/1.0/vts/functional/Event.h deleted file mode 100644 index 7dd40703c5..0000000000 --- a/neuralnetworks/1.0/vts/functional/Event.h +++ /dev/null @@ -1,216 +0,0 @@ -#ifndef ANDROID_HARDWARE_NEURALNETWORKS_V1_0_EVENT_H -#define ANDROID_HARDWARE_NEURALNETWORKS_V1_0_EVENT_H - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace android { -namespace hardware { -namespace neuralnetworks { -namespace V1_0 { -namespace implementation { - -using ::android::hardware::hidl_array; -using ::android::hardware::hidl_memory; -using ::android::hardware::hidl_string; -using ::android::hardware::hidl_vec; -using ::android::hardware::Return; -using ::android::hardware::Void; -using ::android::sp; - -/** - * The Event class is used internally by the Neuralnetworks runtime to - * synchronize between different threads. An asynchronous task is launched - * paired with an event object. When a client thread requires the output being - * processed by the asynchronous task, the client thread can wait for the result - * and be blocked until it has completed or a timeout condition has been - * reached, or poll the result periodically. Both poll and wait* may safely be - * called concurrently, even on the same event. When the server thread has - * completed, it should immediately call "notify" to indicate the corresponding - * output has been produced and awaken any client threads waiting on the event. - * - * This class exists to enable synchronization across HIDL. When synchronization - * is only required in the same process, consider using std::future, std::mutex, - * std::condition_variable, or std::experimental::latch instead. - */ -struct Event : public IEvent { - Event(); - ~Event() override; - - /** - * Event::Status::WAITING -- The corresponding asynchronous execution has - * not yet finished. - * Event::Status::SUCCESS -- The corresponding asynchronous execution has - * succeeded and the output is ready to be - * consumed. - * Event::Status::TIMEOUT -- The calling thread has waited longer than the - * user has specified. This only applies to the - * methods Event::wait_for and Event::wait_until. - * Event::Status::ERROR -- The corresponding asynchronous execution has - * failed to properly execute. - */ - enum class Status : uint32_t { - WAITING, - SUCCESS, - TIMEOUT, - ERROR, - }; - - /** - * IEvent::notify marks the event with the return status of the - * asynchronous call the event is paired with and enables all - * prior and future wait calls on the Event object to proceed. The - * call to IEvent::notify happens before any wait* calls on - * this event return (except in the case of TIMEOUT) and before - * any poll calls that see the resulting status. The asynchronous - * call the event is paired with must ensure that any update to - * state that should be visible to the caller of wait* or poll - * happens before the call to IEvent::notify. - * - * IEvent::notify can be called at most once on a given event. - * - * @param neuralnetworks::V1_0::ErrorStatus ErrorStatus::NONE on success - */ - Return notify(ErrorStatus status) override; - - /** - * Event::poll returns the current status of the event. - * - * @return Status SUCCESS, ERROR, or WAITING - */ - Event::Status poll(); - - /** - * Event::wait blocks until the event has been signaled. - * - * @return Status SUCCESS or ERROR - */ - Event::Status wait(); - - /** - * Event::wait_for blocks until the event has been signaled or the time - * duration from the time the wait_for function was called has expired, - * whichever comes first. - * - * @return Status SUCCESS, ERROR, or TIMEOUT - */ - template - Event::Status wait_for(const std::chrono::duration& timeout_duration); - - /** - * Event::wait_until blocks until the event has been signaled or a certain - * time has been reached, whichever comes first. - * - * @return Status SUCCESS, ERROR, or TIMEOUT - */ - template - Event::Status wait_until(const std::chrono::time_point& timeout_duration); - - /** - * Event::on_finish binds a callback function to the event. The - * callback will be executed when IEvent::notify is called, before - * any calls to wait* return. (Note that wait_for or wait_until - * can return TIMEOUT before IEvent::notify is called for the - * first time, and hence before the callback is executed.) - * - * The callback function must not synchronize with or otherwise - * access the event object it is bound to. - * - * Event::on_finish can be called at most once on a given event. - * - * @param callback Function to be invoked the first time IEvent::notify is - * called. Must have a target -- i.e., must not compare equal - * to nullptr. Callback returns true if it successfully - * completes, false if it fails. - * @return bool True if the callback was successfully bound, false if - * unsuccessful. - * - * TODO: What if notify has already been called before on_finish? - * TODO: Why does the return value of the callback matter? - */ - bool on_finish(std::function callback); - - /** - * Event::bind_thread binds a thread to the event for later use by - * Event::join_thread. - * - * The thread must be passed using std::move. - * - * Once a thread is bound with Event::bind_thread, the client code - * should ensure that one of the following occurs before the event is - * destroyed: - * - Event::join_thread has been called. - * - Event::wait has been called. - * - Event::wait_for has been called and returned other than TIMEOUT. - * - Event::wait_until has been called and returned other than TIMEOUT. - * - * The bound thread shall not call any Event method with the exception of - * IEvent::notify, which it will call when the thread has finished its - * computation. - * - * Event::bind_thread can be called at most once on a given event. - * - * @param asyncThread Thread to be bound to the event. The thread object - * must represent a thread of execution -- i.e., - * asyncThread.joinable() must be true. - * @return bool True if successful, false if thread was not properly bound. - */ - bool bind_thread(std::thread&& asyncThread); - - /** - * Event::join_thread ensures that the thread (if any) bound to - * this event with Event::bind_thread has fully finished and - * cleaned its resources. It is legal to call this function - * multiple times, concurrently or sequentially. - */ - void join_thread(); - - private: - // Same as Event::join_thread but assumes we already hold a lock on mMutex. - void join_thread_locked(); - - Status mStatus; - std::mutex mMutex; - std::condition_variable mCondition; - std::function mCallback; - std::thread mThread; -}; - - -// template function implementations - -template -Event::Status Event::wait_for(const std::chrono::duration& timeout_duration) { - std::unique_lock lock(mMutex); - std::cv_status status = mCondition.wait_for(lock, timeout_duration, - [this]{return mStatus != Status::WAITING;}); - if (status != std::cv_status::timeout) { - join_thread_locked(); - } - return status != std::cv_status::timeout ? mStatus : Status::TIMEOUT; -} - -template -Event::Status Event::wait_until(const std::chrono::time_point& timeout_time) { - std::unique_lock lock(mMutex); - std::cv_status status = mCondition.wait_until(lock, timeout_time, - [this]{return mStatus != Status::WAITING;}); - if (status != std::cv_status::timeout) { - join_thread_locked(); - } - return status != std::cv_status::timeout ? mStatus : Status::TIMEOUT; -} - -} // namespace implementation -} // namespace V1_0 -} // namespace neuralnetworks -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_NEURALNETWORKS_V1_0_EVENT_H diff --git a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp index 4b8daec432..366bfc19a8 100644 --- a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "Event.h" +#include "Callbacks.h" #include "TestHarness.h" #include "VtsHalNeuralnetworksV1_0TargetTest.h" @@ -32,7 +32,8 @@ namespace functional { hidl_memory allocateSharedMemory(int64_t size, const std::string& type = "ashmem"); namespace generated_tests { -using ::android::hardware::neuralnetworks::V1_0::implementation::Event; +using ::android::hardware::neuralnetworks::V1_0::implementation::ExecutionCallback; +using ::android::hardware::neuralnetworks::V1_0::implementation::PreparedModelCallback; using ::generated_tests::filter; using ::generated_tests::for_all; using ::generated_tests::for_each; @@ -65,22 +66,22 @@ void copy_back(MixedTyped* dst, const std::vector& ra, char* sr void Execute(const sp& device, std::function create_model, std::function is_ignored, const std::vector& examples) { - Model model = create_model(); - sp preparedModel; - sp preparationEvent = new Event(); - ASSERT_NE(nullptr, preparationEvent.get()); - Return prepareRet = device->prepareModel( - model, preparationEvent, [&](ErrorStatus status, const sp& prepared) { - EXPECT_EQ(ErrorStatus::NONE, status); - preparedModel = prepared; - }); - ASSERT_TRUE(prepareRet.isOk()); - ASSERT_NE(nullptr, preparedModel.get()); - Event::Status preparationStatus = preparationEvent->wait(); - EXPECT_EQ(Event::Status::SUCCESS, preparationStatus); - const uint32_t INPUT = 0; const uint32_t OUTPUT = 1; + Model model = create_model(); + + // launch prepare model + sp preparedModelCallback = new PreparedModelCallback(); + ASSERT_NE(nullptr, preparedModelCallback.get()); + Return prepareLaunchStatus = device->prepareModel(model, preparedModelCallback); + ASSERT_TRUE(prepareLaunchStatus.isOk()); + + // retrieve prepared model + preparedModelCallback->wait(); + ErrorStatus prepareReturnStatus = preparedModelCallback->getStatus(); + EXPECT_EQ(ErrorStatus::NONE, prepareReturnStatus); + sp preparedModel = preparedModelCallback->getPreparedModel(); + ASSERT_NE(nullptr, preparedModel.get()); int example_no = 1; for (auto& example : examples) { @@ -160,15 +161,19 @@ void Execute(const sp& device, std::function create_model, inputMemory->commit(); outputMemory->commit(); - // execute request - sp executionEvent = new Event(); - ASSERT_NE(nullptr, executionEvent.get()); - Return executeStatus = preparedModel->execute( - {.inputs = inputs_info, .outputs = outputs_info, .pools = pools}, executionEvent); - ASSERT_TRUE(executeStatus.isOk()); - EXPECT_EQ(ErrorStatus::NONE, static_cast(executeStatus)); - Event::Status eventStatus = executionEvent->wait(); - EXPECT_EQ(Event::Status::SUCCESS, eventStatus); + + // launch execution + sp executionCallback = new ExecutionCallback(); + ASSERT_NE(nullptr, executionCallback.get()); + Return executionLaunchStatus = preparedModel->execute( + {.inputs = inputs_info, .outputs = outputs_info, .pools = pools}, executionCallback); + ASSERT_TRUE(executionLaunchStatus.isOk()); + EXPECT_EQ(ErrorStatus::NONE, static_cast(executionLaunchStatus)); + + // retrieve execution status + executionCallback->wait(); + ErrorStatus executionReturnStatus = executionCallback->getStatus(); + EXPECT_EQ(ErrorStatus::NONE, executionReturnStatus); // validate results outputMemory->read(); diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp index 0f354d1b73..b99e20e3b4 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.cpp @@ -17,7 +17,8 @@ #define LOG_TAG "neuralnetworks_hidl_hal_test" #include "VtsHalNeuralnetworksV1_0TargetTest.h" -#include "Event.h" + +#include "Callbacks.h" #include "Models.h" #include "TestHarness.h" @@ -32,8 +33,10 @@ namespace V1_0 { namespace vts { namespace functional { -using ::android::hardware::neuralnetworks::V1_0::implementation::Event; +using ::android::hardware::neuralnetworks::V1_0::implementation::ExecutionCallback; +using ::android::hardware::neuralnetworks::V1_0::implementation::PreparedModelCallback; using ::generated_tests::MixedTypedExampleType; + namespace generated_tests { extern void Execute(const sp&, std::function, std::function, const std::vector&); @@ -66,26 +69,22 @@ void NeuralnetworksHidlTest::SetUp() { void NeuralnetworksHidlTest::TearDown() {} -sp NeuralnetworksHidlTest::doPrepareModelShortcut(const Model& model) { - sp preparedModel; - ErrorStatus prepareStatus; - sp preparationEvent = new Event(); - if (preparationEvent.get() == nullptr) { +sp NeuralnetworksHidlTest::doPrepareModelShortcut() { + Model model = createValidTestModel(); + + sp preparedModelCallback = new PreparedModelCallback(); + if (preparedModelCallback == nullptr) { + return nullptr; + } + Return prepareLaunchStatus = device->prepareModel(model, preparedModelCallback); + if (!prepareLaunchStatus.isOk() || prepareLaunchStatus != ErrorStatus::NONE) { return nullptr; } - Return prepareRet = device->prepareModel( - model, preparationEvent, [&](ErrorStatus status, const sp& prepared) { - prepareStatus = status; - preparedModel = prepared; - }); - - if (!prepareRet.isOk() || prepareStatus != ErrorStatus::NONE || - preparedModel.get() == nullptr) { - return nullptr; - } - Event::Status eventStatus = preparationEvent->wait(); - if (eventStatus != Event::Status::SUCCESS) { + preparedModelCallback->wait(); + ErrorStatus prepareReturnStatus = preparedModelCallback->getStatus(); + sp preparedModel = preparedModelCallback->getPreparedModel(); + if (prepareReturnStatus != ErrorStatus::NONE || preparedModel == nullptr) { return nullptr; } @@ -151,99 +150,121 @@ TEST_F(NeuralnetworksHidlTest, SupportedOperationsNegativeTest2) { // prepare simple model positive test TEST_F(NeuralnetworksHidlTest, SimplePrepareModelPositiveTest) { Model model = createValidTestModel(); - sp preparationEvent = new Event(); - ASSERT_NE(nullptr, preparationEvent.get()); - Return prepareRet = device->prepareModel( - model, preparationEvent, [&](ErrorStatus status, const sp& prepared) { - EXPECT_EQ(ErrorStatus::NONE, status); - (void)prepared; - }); - ASSERT_TRUE(prepareRet.isOk()); + sp preparedModelCallback = new PreparedModelCallback(); + ASSERT_NE(nullptr, preparedModelCallback.get()); + Return prepareLaunchStatus = device->prepareModel(model, preparedModelCallback); + ASSERT_TRUE(prepareLaunchStatus.isOk()); + EXPECT_EQ(ErrorStatus::NONE, static_cast(prepareLaunchStatus)); + + preparedModelCallback->wait(); + ErrorStatus prepareReturnStatus = preparedModelCallback->getStatus(); + EXPECT_EQ(ErrorStatus::NONE, prepareReturnStatus); + sp preparedModel = preparedModelCallback->getPreparedModel(); + EXPECT_NE(nullptr, preparedModel.get()); } // prepare simple model negative test 1 TEST_F(NeuralnetworksHidlTest, SimplePrepareModelNegativeTest1) { Model model = createInvalidTestModel1(); - sp preparationEvent = new Event(); - ASSERT_NE(nullptr, preparationEvent.get()); - Return prepareRet = device->prepareModel( - model, preparationEvent, [&](ErrorStatus status, const sp& prepared) { - EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, status); - (void)prepared; - }); - ASSERT_TRUE(prepareRet.isOk()); + sp preparedModelCallback = new PreparedModelCallback(); + ASSERT_NE(nullptr, preparedModelCallback.get()); + Return prepareLaunchStatus = device->prepareModel(model, preparedModelCallback); + ASSERT_TRUE(prepareLaunchStatus.isOk()); + EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, static_cast(prepareLaunchStatus)); + + preparedModelCallback->wait(); + ErrorStatus prepareReturnStatus = preparedModelCallback->getStatus(); + EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, prepareReturnStatus); + sp preparedModel = preparedModelCallback->getPreparedModel(); + EXPECT_EQ(nullptr, preparedModel.get()); } // prepare simple model negative test 2 TEST_F(NeuralnetworksHidlTest, SimplePrepareModelNegativeTest2) { Model model = createInvalidTestModel2(); - sp preparationEvent = new Event(); - ASSERT_NE(nullptr, preparationEvent.get()); - Return prepareRet = device->prepareModel( - model, preparationEvent, [&](ErrorStatus status, const sp& prepared) { - EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, status); - (void)prepared; - }); - ASSERT_TRUE(prepareRet.isOk()); + sp preparedModelCallback = new PreparedModelCallback(); + ASSERT_NE(nullptr, preparedModelCallback.get()); + Return prepareLaunchStatus = device->prepareModel(model, preparedModelCallback); + ASSERT_TRUE(prepareLaunchStatus.isOk()); + EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, static_cast(prepareLaunchStatus)); + + preparedModelCallback->wait(); + ErrorStatus prepareReturnStatus = preparedModelCallback->getStatus(); + EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, prepareReturnStatus); + sp preparedModel = preparedModelCallback->getPreparedModel(); + EXPECT_EQ(nullptr, preparedModel.get()); } // execute simple graph positive test TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphPositiveTest) { - Model model = createValidTestModel(); - sp preparedModel = doPrepareModelShortcut(model); - ASSERT_NE(nullptr, preparedModel.get()); - Request request = createValidTestRequest(); - - sp executionEvent = new Event(); - ASSERT_NE(nullptr, executionEvent.get()); - Return executeStatus = preparedModel->execute(request, executionEvent); - ASSERT_TRUE(executeStatus.isOk()); - EXPECT_EQ(ErrorStatus::NONE, static_cast(executeStatus)); - Event::Status eventStatus = executionEvent->wait(); - EXPECT_EQ(Event::Status::SUCCESS, eventStatus); - std::vector outputData = {-1.0f, -1.0f, -1.0f, -1.0f}; std::vector expectedData = {6.0f, 8.0f, 10.0f, 12.0f}; const uint32_t OUTPUT = 1; - sp outputMemory = mapMemory(request.pools[OUTPUT]); - ASSERT_NE(nullptr, outputMemory.get()); - float* outputPtr = reinterpret_cast(static_cast(outputMemory->getPointer())); - ASSERT_NE(nullptr, outputPtr); - outputMemory->read(); - std::copy(outputPtr, outputPtr + outputData.size(), outputData.begin()); - outputMemory->commit(); + sp preparedModel = doPrepareModelShortcut(); + ASSERT_NE(nullptr, preparedModel.get()); + Request request = createValidTestRequest(); + + auto postWork = [&] { + sp outputMemory = mapMemory(request.pools[OUTPUT]); + if (outputMemory == nullptr) { + return false; + } + float* outputPtr = reinterpret_cast(static_cast(outputMemory->getPointer())); + if (outputPtr == nullptr) { + return false; + } + outputMemory->read(); + std::copy(outputPtr, outputPtr + outputData.size(), outputData.begin()); + outputMemory->commit(); + return true; + }; + + sp executionCallback = new ExecutionCallback(); + ASSERT_NE(nullptr, executionCallback.get()); + executionCallback->on_finish(postWork); + Return executeLaunchStatus = preparedModel->execute(request, executionCallback); + ASSERT_TRUE(executeLaunchStatus.isOk()); + EXPECT_EQ(ErrorStatus::NONE, static_cast(executeLaunchStatus)); + + executionCallback->wait(); + ErrorStatus executionReturnStatus = executionCallback->getStatus(); + EXPECT_EQ(ErrorStatus::NONE, executionReturnStatus); EXPECT_EQ(expectedData, outputData); } // execute simple graph negative test 1 TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphNegativeTest1) { - Model model = createValidTestModel(); - sp preparedModel = doPrepareModelShortcut(model); + sp preparedModel = doPrepareModelShortcut(); ASSERT_NE(nullptr, preparedModel.get()); Request request = createInvalidTestRequest1(); - sp executionEvent = new Event(); - ASSERT_NE(nullptr, executionEvent.get()); - Return executeStatus = preparedModel->execute(request, executionEvent); - ASSERT_TRUE(executeStatus.isOk()); - EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, static_cast(executeStatus)); - executionEvent->wait(); + sp executionCallback = new ExecutionCallback(); + ASSERT_NE(nullptr, executionCallback.get()); + Return executeLaunchStatus = preparedModel->execute(request, executionCallback); + ASSERT_TRUE(executeLaunchStatus.isOk()); + EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, static_cast(executeLaunchStatus)); + + executionCallback->wait(); + ErrorStatus executionReturnStatus = executionCallback->getStatus(); + EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, executionReturnStatus); } // execute simple graph negative test 2 TEST_F(NeuralnetworksHidlTest, SimpleExecuteGraphNegativeTest2) { - Model model = createValidTestModel(); - sp preparedModel = doPrepareModelShortcut(model); + sp preparedModel = doPrepareModelShortcut(); ASSERT_NE(nullptr, preparedModel.get()); Request request = createInvalidTestRequest2(); - sp executionEvent = new Event(); - ASSERT_NE(nullptr, executionEvent.get()); - Return executeStatus = preparedModel->execute(request, executionEvent); - ASSERT_TRUE(executeStatus.isOk()); - EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, static_cast(executeStatus)); - executionEvent->wait(); + sp executionCallback = new ExecutionCallback(); + ASSERT_NE(nullptr, executionCallback.get()); + Return executeLaunchStatus = preparedModel->execute(request, executionCallback); + ASSERT_TRUE(executeLaunchStatus.isOk()); + EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, static_cast(executeLaunchStatus)); + + executionCallback->wait(); + ErrorStatus executionReturnStatus = executionCallback->getStatus(); + EXPECT_EQ(ErrorStatus::INVALID_ARGUMENT, executionReturnStatus); } // Mixed-typed examples diff --git a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h index 1b3b3342d1..5cd209ae62 100644 --- a/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h +++ b/neuralnetworks/1.0/vts/functional/VtsHalNeuralnetworksV1_0TargetTest.h @@ -18,7 +18,9 @@ #define VTS_HAL_NEURALNETWORKS_V1_0_TARGET_TESTS_H #include +#include #include +#include #include #include @@ -72,13 +74,28 @@ class NeuralnetworksHidlTest : public ::testing::VtsHalHidlTargetTestBase { void SetUp() override; void TearDown() override; - sp doPrepareModelShortcut(const Model& model); + sp doPrepareModelShortcut(); sp device; }; } // namespace functional } // namespace vts + +// pretty-print values for error messages + +template +::std::basic_ostream& operator<<(::std::basic_ostream& os, + ErrorStatus errorStatus) { + return os << toString(errorStatus); +} + +template +::std::basic_ostream& operator<<(::std::basic_ostream& os, + DeviceStatus deviceStatus) { + return os << toString(deviceStatus); +} + } // namespace V1_0 } // namespace neuralnetworks } // namespace hardware From 578b61c67e3fb0af5903de7c95359b172b7ed88e Mon Sep 17 00:00:00 2001 From: Jean-Luc Brouillet Date: Wed, 27 Sep 2017 19:22:04 -0700 Subject: [PATCH 246/265] Fix problem passing null optional operands. Allow optional operands to be specified as having no value in the model. Make sure that both these and model arguements that have no value can be passed to through the HAL. Change the validation to ensure that all required ops are there. Bug: 63905942 Test: Compiled and ran runtime/test and VTS tests. Change-Id: Ia20954b9712042f5c0571822967521aedb66150b --- neuralnetworks/1.0/types.hal | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index 54ed4020ad..a6453934cc 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -990,6 +990,12 @@ enum OperandLifeTime : int32_t { * The operand is a constant that was specified via a Memory object. */ CONSTANT_REFERENCE, + + /** + * The operand does not have a value. This is valid only for optional arguments + * of operations. + */ + NO_VALUE, }; /** @@ -1084,8 +1090,7 @@ struct Operand { /** * Quantized zero-point offset of the operand. * - * Only applicable if the operand is of type TENSOR_QUANT8_ASYMM or - * TENSOR_INT32. + * Only applicable if the operand is of type TENSOR_QUANT8_ASYMM. */ int32_t zeroPoint; @@ -1096,7 +1101,7 @@ struct Operand { /** * Where to find the data for this operand. - * If the lifetime is TEMPORARY_VARIABLE, MODEL_INPUT, or MODEL_OUTPUT: + * If the lifetime is TEMPORARY_VARIABLE, MODEL_INPUT, MODEL_OUTPUT, or NO_VALUE: * - All the fields will be 0. * If the lifetime is CONSTANT_COPY: * - location.poolIndex is 0. @@ -1189,6 +1194,13 @@ struct Model { * any updates to the input or output operand. */ struct RequestArgument { + /** + * If true, the argument does not have a value. This can be used for operations + * that take optional arguments. If true, the fields of location are set to 0 and + * the dimensions vector is left empty. + */ + bool hasNoValue; + /** * The location within one of the memory pools passed in the Request. */ From 48311a8c274e54d27fb804204353bc1dc0a11ef7 Mon Sep 17 00:00:00 2001 From: Edwin Wong Date: Fri, 29 Sep 2017 15:58:37 -0700 Subject: [PATCH 247/265] Fix VtsHalDrmV1_0Target clearkey tests. 1. Fix the following issues: - queryKeyStatus is now implemented, do not return ERROR_DRM_CANNOT_HANDLE anymore - expectedKeyRequest and knownKeyResponse should use '-' and '_' instead of '+' and '/' for base64Url encode; one uint8_t change from 0x2b to 0x2d for each vector 2. Add tests to create clearkey drm and crypto plugin using both common pssh box format system ID and clearkey scheme UUID. Test: Vts test on Marlin and Taimen adb shell /data/nativetest/VtsHalDrmV1_0TargetTest/ VtsHalDrmV1_0TargetTest Test: Cts ClearKeyTest on Marlin and Taimen ANDROIOP= ./android-cts/tools/cts-tradefed run cts -m CtsMediaTestCases --test android.media.cts.ClearKeySystemTest Test: ClearKey plugin unit tests adb shell LD_LIBRARY_PATH="/vendor/lib/mediadrm" /data/nativetest/ClearKeyDrmUnitTest/ClearKeyDrmUnitTest Test: netflix and Play Movies & TV for sanity check bug: 66327050 Change-Id: Icfbe715cf246a7c5253d5f104d0fd446618b18bd --- .../vts/functional/drm_hal_clearkey_test.cpp | 88 ++++++++++++------- 1 file changed, 57 insertions(+), 31 deletions(-) diff --git a/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp b/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp index 3966eac15b..4652c76d5d 100644 --- a/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp +++ b/drm/1.0/vts/functional/drm_hal_clearkey_test.cpp @@ -76,12 +76,14 @@ using std::vector; #define ASSERT_OK(ret) ASSERT_TRUE(ret.isOk()) #define EXPECT_OK(ret) EXPECT_TRUE(ret.isOk()) -static const uint8_t kCommonPsshBoxUUID[16] = {0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, - 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B}; +static const uint8_t kCommonPsshBoxUUID[16] = { + 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, + 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B}; // To be used in mpd to specify drm scheme for players -static const uint8_t kClearKeyUUID[16] = {0xE2, 0x71, 0x9D, 0x58, 0xA9, 0x85, 0xB3, 0xC9, - 0x78, 0x1A, 0xB0, 0x30, 0xAF, 0x78, 0xD3, 0x0E}; +static const uint8_t kClearKeyUUID[16] = { + 0xE2, 0x71, 0x9D, 0x58, 0xA9, 0x85, 0xB3, 0xC9, + 0x78, 0x1A, 0xB0, 0x30, 0xAF, 0x78, 0xD3, 0x0E}; static const uint8_t kInvalidUUID[16] = { 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, @@ -111,7 +113,7 @@ class DrmHalClearkeyFactoryTest : public ::testing::VtsHalHidlTargetTestBase { }; /** - * Ensure the factory supports the clearkey scheme UUID + * Ensure the factory supports both Common Pssh Box UUID and Clearkey Scheme UUID */ TEST_F(DrmHalClearkeyFactoryTest, ClearKeyPluginSupported) { EXPECT_TRUE(drmFactory->isCryptoSchemeSupported(kCommonPsshBoxUUID)); @@ -164,9 +166,23 @@ TEST_F(DrmHalClearkeyFactoryTest, ValidContentTypeSupported) { } /** - * Ensure clearkey drm plugin can be created + * Ensure clearkey drm plugin can be created using Common Pssh Box UUID */ -TEST_F(DrmHalClearkeyFactoryTest, CreateClearKeyDrmPlugin) { +TEST_F(DrmHalClearkeyFactoryTest, CreateClearKeyDrmPluginUsingCommonPsshBoxUuid) { + hidl_string packageName("android.hardware.drm.test"); + auto res = drmFactory->createPlugin( + kCommonPsshBoxUUID, packageName, + [&](Status status, const sp& plugin) { + EXPECT_EQ(Status::OK, status); + EXPECT_NE(nullptr, plugin.get()); + }); + EXPECT_OK(res); +} + +/** + * Ensure clearkey drm plugin can be created using ClearKey UUID + */ + TEST_F(DrmHalClearkeyFactoryTest, CreateClearKeyDrmPluginUsingClearKeyUuid) { hidl_string packageName("android.hardware.drm.test"); auto res = drmFactory->createPlugin( kClearKeyUUID, packageName, @@ -178,9 +194,23 @@ TEST_F(DrmHalClearkeyFactoryTest, CreateClearKeyDrmPlugin) { } /** - * Ensure clearkey crypto plugin can be created + * Ensure clearkey crypto plugin can be created using Common Pssh Box UUID */ -TEST_F(DrmHalClearkeyFactoryTest, CreateClearKeyCryptoPlugin) { +TEST_F(DrmHalClearkeyFactoryTest, CreateClearKeyCryptoPluginUsingCommonPsshBoxUuid) { + hidl_vec initVec; + auto res = cryptoFactory->createPlugin( + kCommonPsshBoxUUID, initVec, + [&](Status status, const sp& plugin) { + EXPECT_EQ(Status::OK, status); + EXPECT_NE(nullptr, plugin.get()); + }); + EXPECT_OK(res); +} + +/** + * Ensure clearkey crypto plugin can be created using ClearKey UUID + */ +TEST_F(DrmHalClearkeyFactoryTest, CreateClearKeyCryptoPluginUsingClearKeyUuid) { hidl_vec initVec; auto res = cryptoFactory->createPlugin( kClearKeyUUID, initVec, @@ -332,32 +362,29 @@ hidl_vec DrmHalClearkeyPluginTest::loadKeys( // full box header (version = 1 flags = 0) 0x01, 0x00, 0x00, 0x00, // system id - 0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02, 0xac, 0xe3, 0x3c, 0x1e, - 0x52, 0xe2, 0xfb, 0x4b, + 0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02, 0xac, 0xe3, 0x3c, + 0x1e, 0x52, 0xe2, 0xfb, 0x4b, // number of key ids 0x00, 0x00, 0x00, 0x01, // key id - 0x60, 0x06, 0x1e, 0x01, 0x7e, 0x47, 0x7e, 0x87, 0x7e, 0x57, 0xd0, 0x0d, - 0x1e, 0xd0, 0x0d, 0x1e, + 0x60, 0x06, 0x1e, 0x01, 0x7e, 0x47, 0x7e, 0x87, 0x7e, 0x57, 0xd0, + 0x0d, 0x1e, 0xd0, 0x0d, 0x1e, // size of data, must be zero 0x00, 0x00, 0x00, 0x00}; hidl_vec expectedKeyRequest = { - 0x7b, 0x22, 0x6b, 0x69, 0x64, 0x73, 0x22, 0x3a, 0x5b, 0x22, 0x59, - 0x41, 0x59, 0x65, 0x41, 0x58, 0x35, 0x48, 0x66, 0x6f, 0x64, 0x2b, - 0x56, 0x39, 0x41, 0x4e, 0x48, 0x74, 0x41, 0x4e, 0x48, 0x67, 0x22, - 0x5d, 0x2c, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x74, - 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x22, 0x7d}; + 0x7b, 0x22, 0x6b, 0x69, 0x64, 0x73, 0x22, 0x3a, 0x5b, 0x22, 0x59, 0x41, 0x59, 0x65, + 0x41, 0x58, 0x35, 0x48, 0x66, 0x6f, 0x64, 0x2d, 0x56, 0x39, 0x41, 0x4e, 0x48, 0x74, + 0x41, 0x4e, 0x48, 0x67, 0x22, 0x5d, 0x2c, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x22, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x22, 0x7d}; hidl_vec knownKeyResponse = { - 0x7b, 0x22, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, - 0x6b, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x6f, 0x63, 0x74, 0x22, 0x2c, - 0x22, 0x6b, 0x69, 0x64, 0x22, 0x3a, 0x22, 0x59, 0x41, 0x59, 0x65, - 0x41, 0x58, 0x35, 0x48, 0x66, 0x6f, 0x64, 0x2b, 0x56, 0x39, 0x41, - 0x4e, 0x48, 0x74, 0x41, 0x4e, 0x48, 0x67, 0x22, 0x2c, 0x22, 0x6b, - 0x22, 0x3a, 0x22, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x54, 0x65, - 0x73, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x61, 0x73, 0x65, 0x36, 0x34, - 0x67, 0x67, 0x67, 0x22, 0x7d, 0x5d, 0x7d, 0x0a}; + 0x7b, 0x22, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x6b, 0x74, 0x79, 0x22, + 0x3a, 0x22, 0x6f, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x6b, 0x69, 0x64, 0x22, 0x3a, 0x22, 0x59, + 0x41, 0x59, 0x65, 0x41, 0x58, 0x35, 0x48, 0x66, 0x6f, 0x64, 0x2d, 0x56, 0x39, 0x41, 0x4e, + 0x48, 0x74, 0x41, 0x4e, 0x48, 0x67, 0x22, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x22, 0x47, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x54, 0x65, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x61, 0x73, 0x65, + 0x36, 0x34, 0x67, 0x67, 0x67, 0x22, 0x7d, 0x5d, 0x7d, 0x0a}; hidl_string mimeType = "video/mp4"; KeyedVector optionalParameters; @@ -1085,12 +1112,11 @@ void DrmHalClearkeyDecryptTest::aes_cbc_decrypt(uint8_t* dest, uint8_t* src, */ TEST_F(DrmHalClearkeyDecryptTest, TestQueryKeyStatus) { auto sessionId = openSession(); - auto res = drmPlugin->queryKeyStatus(sessionId, - [&](Status status, KeyedVector /* info */) { - // clearkey doesn't support this method - EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); - }); + auto res = drmPlugin->queryKeyStatus( + sessionId, [&](Status status, KeyedVector /* info */) { EXPECT_EQ(Status::OK, status); }); EXPECT_OK(res); + + closeSession(sessionId); } From 0897ab3aad7d062c101892fd40a96271714f1613 Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Wed, 4 Oct 2017 02:38:42 -0700 Subject: [PATCH 248/265] Only verify output of models a vendor nn service fully supports Some service drivers won't be able to support all operations. In those cases, run the test as far as it can go, but ignore the output data. For example, the hvx nn service does not support svdf, so it should attempt to prepare and execute the model, but the test should not fail if the hvx driver reports an error. However, hvx indicates it is able to run MAX_POOL_2D, so the test should fail if that output is incorrect. Bug: 63905942 Test: mm Test: run vts binary on hvx service Change-Id: I3ebc05836c8e070b66daa2e38b107f96637ca812 --- .../vts/functional/GeneratedTestHarness.cpp | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp index 366bfc19a8..8c9a0a369c 100644 --- a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp @@ -21,6 +21,7 @@ #include #include #include +#include namespace android { namespace hardware { @@ -70,6 +71,19 @@ void Execute(const sp& device, std::function create_model, const uint32_t OUTPUT = 1; Model model = create_model(); + // see if service can handle model + ErrorStatus supportedStatus; + bool fullySupportsModel = false; + Return supportedCall = device->getSupportedOperations( + model, [&](ErrorStatus status, const hidl_vec& supported) { + supportedStatus = status; + ASSERT_NE(0ul, supported.size()); + fullySupportsModel = + std::all_of(supported.begin(), supported.end(), [](bool valid) { return valid; }); + }); + ASSERT_TRUE(supportedCall.isOk()); + ASSERT_EQ(ErrorStatus::NONE, supportedStatus); + // launch prepare model sp preparedModelCallback = new PreparedModelCallback(); ASSERT_NE(nullptr, preparedModelCallback.get()); @@ -79,8 +93,13 @@ void Execute(const sp& device, std::function create_model, // retrieve prepared model preparedModelCallback->wait(); ErrorStatus prepareReturnStatus = preparedModelCallback->getStatus(); - EXPECT_EQ(ErrorStatus::NONE, prepareReturnStatus); sp preparedModel = preparedModelCallback->getPreparedModel(); + if (fullySupportsModel) { + EXPECT_EQ(ErrorStatus::NONE, prepareReturnStatus); + } else { + EXPECT_TRUE(prepareReturnStatus == ErrorStatus::NONE || + prepareReturnStatus == ErrorStatus::GENERAL_FAILURE); + } ASSERT_NE(nullptr, preparedModel.get()); int example_no = 1; @@ -173,6 +192,17 @@ void Execute(const sp& device, std::function create_model, // retrieve execution status executionCallback->wait(); ErrorStatus executionReturnStatus = executionCallback->getStatus(); + if (!fullySupportsModel && + static_cast(executionReturnStatus) == ErrorStatus::GENERAL_FAILURE) { + LOG(INFO) << "Ignoring execution results from model that is not supported by the " + "vendor service driver"; + std::cout << "[ ] Ignoring execution results from model that is not " + "supported by the vendor service driver" + << std::endl; + continue; + } + LOG(INFO) << "CONTINUING TO CHECK VALUE"; + std::cout << "[ ] CONTINUING TO CHECK VALUE" << std::endl; EXPECT_EQ(ErrorStatus::NONE, executionReturnStatus); // validate results From 13cbc53a65dd84a95a96e852f2cd7a5348cf4762 Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Wed, 4 Oct 2017 18:13:52 -0700 Subject: [PATCH 249/265] Early test termination for unsupported models Some service drivers won't be able to support all operations. In those cases, try to prepare the model anyway. If it works, proceed with the test; if it fails, terminate the test early. For example, the hvx nn service does not support svdf, so it should attempt to prepare the model, but the test should not fail if the hvx driver reports an error. Bug: 63905942 Test: mm, expected behavior when running on hvx service Change-Id: I51aa1911145f0d17590906c21314d2bdc24cffea --- .../vts/functional/GeneratedTestHarness.cpp | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp index 8c9a0a369c..fc8cc6dcf5 100644 --- a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp @@ -100,6 +100,17 @@ void Execute(const sp& device, std::function create_model, EXPECT_TRUE(prepareReturnStatus == ErrorStatus::NONE || prepareReturnStatus == ErrorStatus::GENERAL_FAILURE); } + + // early termination if vendor service cannot fully prepare model + if (!fullySupportsModel && prepareReturnStatus == ErrorStatus::GENERAL_FAILURE) { + ASSERT_EQ(nullptr, preparedModel.get()); + LOG(INFO) << "NN VTS: Early termination of test because vendor service cannot " + "prepare model that it does not support."; + std::cout << "[ ] Early termination of test because vendor service cannot " + "prepare model that it does not support." + << std::endl; + return; + } ASSERT_NE(nullptr, preparedModel.get()); int example_no = 1; @@ -192,17 +203,6 @@ void Execute(const sp& device, std::function create_model, // retrieve execution status executionCallback->wait(); ErrorStatus executionReturnStatus = executionCallback->getStatus(); - if (!fullySupportsModel && - static_cast(executionReturnStatus) == ErrorStatus::GENERAL_FAILURE) { - LOG(INFO) << "Ignoring execution results from model that is not supported by the " - "vendor service driver"; - std::cout << "[ ] Ignoring execution results from model that is not " - "supported by the vendor service driver" - << std::endl; - continue; - } - LOG(INFO) << "CONTINUING TO CHECK VALUE"; - std::cout << "[ ] CONTINUING TO CHECK VALUE" << std::endl; EXPECT_EQ(ErrorStatus::NONE, executionReturnStatus); // validate results From 959cd78e6766626d4cd9c52f7cdc156fd7880169 Mon Sep 17 00:00:00 2001 From: "I-Jui (Ray) Sung" Date: Wed, 4 Oct 2017 20:49:57 -0700 Subject: [PATCH 250/265] Fix VTS failures on tests with optional inputs RequestArgument for optional inputs should have its .hasNoValue set and other fields left empty. The test harness was incorrectly ignoring the hasNoValue field and initializing the offset field even for missing arguments. That inconsistency was caught by the sample driver and caused an invalid argument error. With this CL the test harness now populates requests correctly for tests with intentionally missing inputs, and that fixes lstm* and lsh_projection. Test: VtsHalNeuralnetworksV1_0TargetTest on Angler Bug: 63905942 Change-Id: I8729124b720f0d4163f4b9efd452f82b825b0885 --- neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp index 8c9a0a369c..819f01355a 100644 --- a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp @@ -120,14 +120,17 @@ void Execute(const sp& device, std::function create_model, .location = {.poolIndex = INPUT, .offset = 0, .length = static_cast(s)}, .dimensions = {}, }; - inputs_info[index] = arg; + RequestArgument arg_empty = { + .hasNoValue = true, + }; + inputs_info[index] = s ? arg : arg_empty; inputSize += s; }); // Compute offset for inputs 1 and so on { size_t offset = 0; for (auto& i : inputs_info) { - i.location.offset = offset; + if (!i.hasNoValue) i.location.offset = offset; offset += i.location.length; } } From 7bb56703223f5b9a75c9b25fbdb081f0236c494c Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Wed, 27 Sep 2017 16:42:19 +0530 Subject: [PATCH 251/265] omxvts: exit gracefully during fatal fails Bug: 63796949 Change-Id: I735db42f7de6926adddd328db1a48de35faaa608 --- .../VtsHalMediaOmxV1_0TargetAudioDecTest.cpp | 262 ++++++++++-------- .../VtsHalMediaOmxV1_0TargetAudioEncTest.cpp | 48 ++-- .../common/media_hidl_test_common.cpp | 47 ++-- .../common/media_hidl_test_common.h | 2 +- .../VtsHalMediaOmxV1_0TargetComponentTest.cpp | 204 ++++++++------ .../VtsHalMediaOmxV1_0TargetMasterTest.cpp | 3 + .../VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 255 +++++++++-------- .../VtsHalMediaOmxV1_0TargetVideoEncTest.cpp | 144 +++++----- 8 files changed, 550 insertions(+), 415 deletions(-) diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp index 116144491b..9e185f2799 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp @@ -165,6 +165,7 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { this->omxNode = _nl; }) .isOk()); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); ASSERT_NE(omxNode, nullptr); ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role"; struct StringToName { @@ -423,6 +424,9 @@ void getInputChannelInfo(sp omxNode, OMX_U32 kPortIndexInput, ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); *nChannels = param.nChannels; + // NOTE: For amrnb sample rate is 8k and amrwb sample rate is 16k. + // There is no nSampleRate field in OMX_AUDIO_PARAM_AMRTYPE. Just + // return 8k to avoid returning uninit variable. *nSampleRate = 8000; break; } @@ -548,13 +552,13 @@ void portReconfiguration(sp omxNode, sp observer, // set Port Params int32_t nChannels; int32_t nSampleRate; - getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels, - &nSampleRate); + ASSERT_NO_FATAL_FAILURE(getInputChannelInfo( + omxNode, kPortIndexInput, eEncoding, &nChannels, &nSampleRate)); // Configure output port // SPECIAL CASE: Soft Vorbis, Opus and Raw Decoders do not offer way - // to - // configure output PCM port. The port undergoes auto configuration - // internally basing on parsed elementary stream information. + // to configure output PCM port. The port undergoes auto + // configuration internally basing on parsed elementary stream + // information. if (comp != AudioDecHidlTest::standardComp::vorbis && comp != AudioDecHidlTest::standardComp::opus && comp != AudioDecHidlTest::standardComp::raw) { @@ -563,9 +567,8 @@ void portReconfiguration(sp omxNode, sp observer, nSampleRate); } - // If you can disable a port, then you should be able to - // enable - // it as well + // If you can disable a port, then you should be able to enable it + // as well status = omxNode->sendCommand( toRawCommandType(OMX_CommandPortEnable), kPortIndexOutput); ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); @@ -576,7 +579,8 @@ void portReconfiguration(sp omxNode, sp observer, ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); - allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE( + allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput)); status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); @@ -586,14 +590,14 @@ void portReconfiguration(sp omxNode, sp observer, // dispatch output buffers for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, i)); } } else { ASSERT_TRUE(false); } } else { - EXPECT_TRUE(false); - return; + ASSERT_TRUE(false); } } @@ -613,11 +617,12 @@ void waitOnInputConsumption(sp omxNode, sp observer, status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); if (status == android::hardware::media::omx::V1_0::Status::OK) { - EXPECT_EQ(msg.type, Message::Type::EVENT); + ASSERT_EQ(msg.type, Message::Type::EVENT); packedArgs audioArgs = {eEncoding, comp}; - portReconfiguration(omxNode, observer, iBuffer, oBuffer, - kPortIndexInput, kPortIndexOutput, msg, - PortMode::PRESET_BYTE_BUFFER, &audioArgs); + ASSERT_NO_FATAL_FAILURE( + portReconfiguration(omxNode, observer, iBuffer, oBuffer, + kPortIndexInput, kPortIndexOutput, msg, + PortMode::PRESET_BYTE_BUFFER, &audioArgs)); } // status == TIMED_OUT, it could be due to process time being large // than DEFAULT_TIMEOUT or component needs output buffers to start @@ -630,7 +635,8 @@ void waitOnInputConsumption(sp omxNode, sp observer, // Dispatch an output buffer assuming outQueue.empty() is true size_t index; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, index); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index)); timeOut = TIMEOUT_COUNTER_Q; } } @@ -660,9 +666,10 @@ void decodeNFrames(sp omxNode, sp observer, if (status == android::hardware::media::omx::V1_0::Status::OK && msg.type == Message::Type::EVENT) { packedArgs audioArgs = {eEncoding, comp}; - portReconfiguration(omxNode, observer, iBuffer, oBuffer, - kPortIndexInput, kPortIndexOutput, msg, - PortMode::PRESET_BYTE_BUFFER, &audioArgs); + ASSERT_NO_FATAL_FAILURE( + portReconfiguration(omxNode, observer, iBuffer, oBuffer, + kPortIndexInput, kPortIndexOutput, msg, + PortMode::PRESET_BYTE_BUFFER, &audioArgs)); } if (frameID == (int)Info->size() || frameID == (offset + range)) break; @@ -684,15 +691,16 @@ void decodeNFrames(sp omxNode, sp observer, if (signalEOS && ((frameID == (int)Info->size() - 1) || (frameID == (offset + range - 1)))) flags |= OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, index, - (*Info)[frameID].bytesCount, flags, - (*Info)[frameID].timestamp); + ASSERT_NO_FATAL_FAILURE(dispatchInputBuffer( + omxNode, iBuffer, index, (*Info)[frameID].bytesCount, flags, + (*Info)[frameID].timestamp)); frameID++; iQueued = true; } // Dispatch output buffer if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, index); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index)); oQueued = true; } // Reset Counters when either input or output buffer is dispatched @@ -701,8 +709,7 @@ void decodeNFrames(sp omxNode, sp observer, else timeOut--; if (timeOut == 0) { - EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite"; - break; + ASSERT_TRUE(false) << "Wait on Input/Output is found indefinite"; } } } @@ -784,8 +791,8 @@ TEST_F(AudioDecHidlTest, DecodeTest) { setDefaultPortParam(omxNode, kPortIndexInput, eEncoding, 1, 8000, OMX_AUDIO_PCMModeLinear, OMX_NumericalDataSigned, 32); - getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels, - &nSampleRate); + ASSERT_NO_FATAL_FAILURE(getInputChannelInfo( + omxNode, kPortIndexInput, eEncoding, &nChannels, &nSampleRate)); // Configure output port // SPECIAL CASE: Soft Vorbis, Opus and Raw Decoders do not offer way to // configure output PCM port. The port undergoes auto configuration @@ -798,28 +805,33 @@ TEST_F(AudioDecHidlTest, DecodeTest) { android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // Port Reconfiguration eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0, - (int)Info.size(), compName); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(), compName)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, compName); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, + kPortIndexInput, kPortIndexOutput, compName)); packedArgs audioArgs = {eEncoding, compName}; - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, nullptr, - portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs)); if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // end of sequence test @@ -845,8 +857,8 @@ TEST_F(AudioDecHidlTest, EOSTest_M) { setDefaultPortParam(omxNode, kPortIndexInput, eEncoding, 1, 8000, OMX_AUDIO_PCMModeLinear, OMX_NumericalDataSigned, 32); - getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels, - &nSampleRate); + ASSERT_NO_FATAL_FAILURE(getInputChannelInfo( + omxNode, kPortIndexInput, eEncoding, &nChannels, &nSampleRate)); // Configure output port // SPECIAL CASE: Soft Vorbis, Opus and Raw Decoders do not offer way to // configure output PCM port. The port undergoes auto configuration @@ -859,26 +871,31 @@ TEST_F(AudioDecHidlTest, EOSTest_M) { android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // request EOS at the start packedArgs audioArgs = {eEncoding, compName}; - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr, - portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); EXPECT_GE(framesReceived, 0U); framesReceived = 0; timestampUs = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); + // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // end of sequence test @@ -924,8 +941,8 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { setDefaultPortParam(omxNode, kPortIndexInput, eEncoding, 1, 8000, OMX_AUDIO_PCMModeLinear, OMX_NumericalDataSigned, 32); - getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels, - &nSampleRate); + ASSERT_NO_FATAL_FAILURE(getInputChannelInfo( + omxNode, kPortIndexInput, eEncoding, &nChannels, &nSampleRate)); // Configure output port // SPECIAL CASE: Soft Vorbis, Opus and Raw Decoders do not offer way to // configure output PCM port. The port undergoes auto configuration @@ -938,10 +955,11 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // request EOS for thumbnail // signal EOS flag with last frame @@ -949,17 +967,19 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { while (!(Info[i].flags & OMX_BUFFERFLAG_SYNCFRAME)) i++; eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0, i + 1, - compName); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, i + 1, compName)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, compName); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, + kPortIndexInput, kPortIndexOutput, compName)); packedArgs audioArgs = {eEncoding, compName}; - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, nullptr, - portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); EXPECT_GE(framesReceived, 1U); framesReceived = 0; timestampUs = 0; @@ -967,25 +987,29 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { // signal EOS flag after last frame eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0, i + 1, - compName, false); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, i + 1, compName, false)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, compName); - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr, - portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, + kPortIndexInput, kPortIndexOutput, compName)); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); EXPECT_GE(framesReceived, 1U); framesReceived = 0; timestampUs = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // end of sequence test @@ -1031,8 +1055,8 @@ TEST_F(AudioDecHidlTest, SimpleEOSTest) { setDefaultPortParam(omxNode, kPortIndexInput, eEncoding, 1, 8000, OMX_AUDIO_PCMModeLinear, OMX_NumericalDataSigned, 32); - getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels, - &nSampleRate); + ASSERT_NO_FATAL_FAILURE(getInputChannelInfo( + omxNode, kPortIndexInput, eEncoding, &nChannels, &nSampleRate)); // Configure output port // SPECIAL CASE: Soft Vorbis, Opus and Raw Decoders do not offer way to // configure output PCM port. The port undergoes auto configuration @@ -1045,33 +1069,39 @@ TEST_F(AudioDecHidlTest, SimpleEOSTest) { android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // request EOS at the end eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0, - (int)Info.size(), compName, false); + ASSERT_NO_FATAL_FAILURE(decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, + eEncoding, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, + (int)Info.size(), compName, false)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, compName); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, + kPortIndexInput, kPortIndexOutput, compName)); packedArgs audioArgs = {eEncoding, compName}; - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr, - portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); framesReceived = 0; timestampUs = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // test input/output port flush @@ -1117,8 +1147,8 @@ TEST_F(AudioDecHidlTest, FlushTest) { setDefaultPortParam(omxNode, kPortIndexInput, eEncoding, 1, 8000, OMX_AUDIO_PCMModeLinear, OMX_NumericalDataSigned, 32); - getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels, - &nSampleRate); + ASSERT_NO_FATAL_FAILURE(getInputChannelInfo( + omxNode, kPortIndexInput, eEncoding, &nChannels, &nSampleRate)); // Configure output port // SPECIAL CASE: Soft Vorbis, Opus and Raw Decoders do not offer way to // configure output PCM port. The port undergoes auto configuration @@ -1131,10 +1161,11 @@ TEST_F(AudioDecHidlTest, FlushTest) { android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // Decode 128 frames and flush. here 128 is chosen to ensure there is a key // frame after this so that the below section can be convered for all @@ -1142,11 +1173,11 @@ TEST_F(AudioDecHidlTest, FlushTest) { int nFrames = 128; eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0, - nFrames, compName, false); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, nFrames, compName, false)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); framesReceived = 0; // Seek to next key frame and start decoding till the end @@ -1163,19 +1194,22 @@ TEST_F(AudioDecHidlTest, FlushTest) { index++; } if (keyFrame) { - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, eleStream, &Info, - index, Info.size() - index, compName, false); + ASSERT_NO_FATAL_FAILURE( + decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding, + kPortIndexInput, kPortIndexOutput, eleStream, &Info, + index, Info.size() - index, compName, false)); } - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); framesReceived = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } int main(int argc, char** argv) { diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp index 66c46371fc..d872444933 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp @@ -165,6 +165,7 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { this->omxNode = _nl; }) .isOk()); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); ASSERT_NE(omxNode, nullptr); ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role"; struct StringToName { @@ -352,7 +353,7 @@ void waitOnInputConsumption(sp omxNode, sp observer, size_t i = 0; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); - EXPECT_EQ(status, + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); // status == TIMED_OUT, it could be due to process time being large // than DEFAULT_TIMEOUT or component needs output buffers to start @@ -365,7 +366,8 @@ void waitOnInputConsumption(sp omxNode, sp observer, // Dispatch an output buffer assuming outQueue.empty() is true size_t index; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, index); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index)); timeOut = TIMEOUT_COUNTER_Q; } } @@ -408,15 +410,16 @@ void encodeNFrames(sp omxNode, sp observer, if (eleStream.gcount() != bytesCount) break; flags = OMX_BUFFERFLAG_ENDOFFRAME; if (signalEOS && (nFrames == 1)) flags |= OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, flags, - timestamp); + ASSERT_NO_FATAL_FAILURE(dispatchInputBuffer( + omxNode, iBuffer, index, bytesCount, flags, timestamp)); timestamp += timestampIncr; nFrames--; iQueued = true; } // Dispatch output buffer if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, index); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index)); oQueued = true; } // Reset Counters when either input or output buffer is dispatched @@ -425,8 +428,7 @@ void encodeNFrames(sp omxNode, sp observer, else timeOut--; if (timeOut == 0) { - EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite"; - break; + ASSERT_TRUE(false) << "Wait on Input/Output is found indefinite"; } } } @@ -517,31 +519,39 @@ TEST_F(AudioEncHidlTest, SimpleEncodeTest) { } setupPCMPort(omxNode, kPortIndexInput, nChannels, OMX_NumericalDataSigned, 16, nSampleRate, OMX_AUDIO_PCMModeLinear); + // Configure output port - setDefaultPortParam(omxNode, kPortIndexOutput, eEncoding, compName, - nChannels, nSampleRate, nBitRate); + ASSERT_NO_FATAL_FAILURE(setDefaultPortParam(omxNode, kPortIndexOutput, + eEncoding, compName, nChannels, + nSampleRate, nBitRate)); android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - encodeNFrames(omxNode, observer, &iBuffer, &oBuffer, 128, samplesPerFrame, - nChannels, nSampleRate, eleStream); + ASSERT_NO_FATAL_FAILURE(encodeNFrames(omxNode, observer, &iBuffer, &oBuffer, + 128, samplesPerFrame, nChannels, + nSampleRate, eleStream)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer)); + ASSERT_NO_FATAL_FAILURE( + testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag)); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } int main(int argc, char** argv) { diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp index 28616e2197..34a96a0ce7 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp @@ -233,7 +233,7 @@ void allocateGraphicBuffers(sp omxNode, OMX_U32 portIndex, error = _s; descriptor = _n1; }); - EXPECT_EQ(error, android::hardware::graphics::mapper::V2_0::Error::NONE); + ASSERT_EQ(error, android::hardware::graphics::mapper::V2_0::Error::NONE); static volatile int32_t nextId = 0; uint64_t id = static_cast(getpid()) << 32; @@ -279,7 +279,7 @@ void allocateBuffer(sp omxNode, BufferInfo* buffer, OMX_U32 portIndex, } else if (portMode == PortMode::PRESET_BYTE_BUFFER || portMode == PortMode::DYNAMIC_ANW_BUFFER) { sp allocator = IAllocator::getService("ashmem"); - EXPECT_NE(allocator.get(), nullptr); + ASSERT_NE(allocator.get(), nullptr); buffer->owner = client; buffer->omxBuffer.type = CodecBuffer::Type::SHARED_MEM; @@ -319,13 +319,14 @@ void allocateBuffer(sp omxNode, BufferInfo* buffer, OMX_U32 portIndex, OMX_PARAM_PORTDEFINITIONTYPE portDef; status = getPortParam(omxNode, OMX_IndexParamPortDefinition, portIndex, &portDef); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); int32_t nStride; buffer->owner = client; buffer->omxBuffer.type = CodecBuffer::Type::ANW_BUFFER; - allocateGraphicBuffers(omxNode, portIndex, buffer, - portDef.format.video.nFrameWidth, - portDef.format.video.nFrameHeight, &nStride, - portDef.format.video.eColorFormat); + ASSERT_NO_FATAL_FAILURE(allocateGraphicBuffers( + omxNode, portIndex, buffer, portDef.format.video.nFrameWidth, + portDef.format.video.nFrameHeight, &nStride, + portDef.format.video.eColorFormat)); omxNode->useBuffer( portIndex, buffer->omxBuffer, [&status, &buffer](android::hardware::media::omx::V1_0::Status _s, @@ -352,14 +353,14 @@ void allocatePortBuffers(sp omxNode, for (size_t i = 0; i < portDef.nBufferCountActual; i++) { BufferInfo buffer; - allocateBuffer(omxNode, &buffer, portIndex, portDef.nBufferSize, - portMode); + ASSERT_NO_FATAL_FAILURE(allocateBuffer(omxNode, &buffer, portIndex, + portDef.nBufferSize, portMode)); if (allocGrap && portMode == PortMode::DYNAMIC_ANW_BUFFER) { int32_t nStride; - allocateGraphicBuffers(omxNode, portIndex, &buffer, - portDef.format.video.nFrameWidth, - portDef.format.video.nFrameHeight, &nStride, - portDef.format.video.eColorFormat); + ASSERT_NO_FATAL_FAILURE(allocateGraphicBuffers( + omxNode, portIndex, &buffer, portDef.format.video.nFrameWidth, + portDef.format.video.nFrameHeight, &nStride, + portDef.format.video.eColorFormat)); } buffArray->push(buffer); } @@ -391,14 +392,16 @@ void changeStateLoadedtoIdle(sp omxNode, sp observer, ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); // allocate buffers on input port - allocatePortBuffers(omxNode, iBuffer, kPortIndexInput, pm[0], allocGrap); + ASSERT_NO_FATAL_FAILURE(allocatePortBuffers( + omxNode, iBuffer, kPortIndexInput, pm[0], allocGrap)); // Dont switch states until the ports are populated status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); // allocate buffers on output port - allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput, pm[1], allocGrap); + ASSERT_NO_FATAL_FAILURE(allocatePortBuffers( + omxNode, oBuffer, kPortIndexOutput, pm[1], allocGrap)); // As the ports are populated, check if the state transition is complete status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); @@ -645,7 +648,8 @@ void testEOS(sp omxNode, sp observer, if (signalEOS) { if ((i = getEmptyBufferID(iBuffer)) < iBuffer->size()) { // signal an empty buffer with flag set to EOS - dispatchInputBuffer(omxNode, iBuffer, i, 0, OMX_BUFFERFLAG_EOS, 0); + ASSERT_NO_FATAL_FAILURE(dispatchInputBuffer(omxNode, iBuffer, i, 0, + OMX_BUFFERFLAG_EOS, 0)); } else { ASSERT_TRUE(false); } @@ -656,7 +660,8 @@ void testEOS(sp omxNode, sp observer, // Dispatch all client owned output buffers to recover remaining frames while (1) { if ((i = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, i, pm[1]); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, i, pm[1])); // if dispatch is successful, perhaps there is a latency // in the component. Dont be in a haste to leave. reset timeout // counter @@ -672,16 +677,16 @@ void testEOS(sp omxNode, sp observer, if (status == android::hardware::media::omx::V1_0::Status::OK) { if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { if (fptr) { - (*fptr)(omxNode, observer, iBuffer, oBuffer, - kPortIndexInput, kPortIndexOutput, msg, pm[1], - args); + ASSERT_NO_FATAL_FAILURE((*fptr)( + omxNode, observer, iBuffer, oBuffer, kPortIndexInput, + kPortIndexOutput, msg, pm[1], args)); } else { // something unexpected happened - EXPECT_TRUE(false); + ASSERT_TRUE(false); } } else { // something unexpected happened - EXPECT_TRUE(false); + ASSERT_TRUE(false); } } if (eosFlag == true) break; diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h index de043b2c66..bec733dc93 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h @@ -1,5 +1,5 @@ /* - * Copyright 2016, The Android Open Source Project + * 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. diff --git a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp index 5d0ac35ed3..401e54ab9f 100644 --- a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp +++ b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp @@ -149,6 +149,7 @@ class ComponentHidlTest : public ::testing::VtsHalHidlTargetTestBase { this->omxNode = _nl; }) .isOk()); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); ASSERT_NE(omxNode, nullptr); ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role"; struct StringToClass { @@ -233,7 +234,6 @@ void initPortMode(PortMode* pm, bool isSecure, break; } } - return; } // test dispatch message API call @@ -410,6 +410,7 @@ TEST_F(ComponentHidlTest, DISABLED_SetDefaultPortParams) { std::cerr << "[ ERROR ] port direction has to be read only " "but is changeable \n"; } + EXPECT_EQ(portDef.eDir, mirror.eDir); setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); // Port Min BufferCount - Read Only @@ -435,6 +436,7 @@ TEST_F(ComponentHidlTest, DISABLED_SetDefaultPortParams) { EXPECT_EQ(portDef.nBufferCountActual, mirror.nBufferCountActual + 1); } + setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); // Port BufferSize is although read only as per OMX-IL 1.2, android // doesnt abide by this. @@ -518,8 +520,9 @@ TEST_F(ComponentHidlTest, DISABLED_PopulatePort) { for (size_t i = 0; i < portDef.nBufferCountActual; i++) { BufferInfo buffer; - allocateBuffer(omxNode, &buffer, portBase, nBufferSize, - PortMode::PRESET_BYTE_BUFFER); + ASSERT_NO_FATAL_FAILURE(allocateBuffer(omxNode, &buffer, portBase, + nBufferSize, + PortMode::PRESET_BYTE_BUFFER)); pBuffer.push(buffer); } @@ -560,39 +563,47 @@ TEST_F(ComponentHidlTest, Flush) { PortMode portMode[2]; initPortMode(portMode, isSecure, compClass); status = omxNode->setPortMode(kPortIndexInput, portMode[0]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // dispatch buffers for (size_t i = 0; i < oBuffer.size(); i++) { - dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1]); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1])); } // flush port - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); +#if 0 // TODO: Sending empty input buffers is slightly tricky. // Components sometimes process input buffers even when output buffers are // not dispatched. For instance Parsing sequence header does not require // output buffers. In such instances sending 0 size input buffers might // make component to send error events. so lets skip this aspect of testing. // dispatch buffers - // for (size_t i = 0; i < iBuffer.size(); i++) { - // dispatchInputBuffer(omxNode, &iBuffer, i, 0, 0, 0, portMode[0]); - // } - // // flush ports - // flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - // kPortIndexOutput); + for (size_t i = 0; i < iBuffer.size(); i++) { + ASSERT_NO_FATAL_FAILURE( + dispatchInputBuffer(omxNode, &iBuffer, i, 0, 0, 0, portMode[0])); + } + // flush ports + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); +#endif + // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to loaded - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // Flush test - monkeying @@ -623,9 +634,9 @@ TEST_F(ComponentHidlTest, Flush_M) { PortMode portMode[2]; initPortMode(portMode, isSecure, compClass); status = omxNode->setPortMode(kPortIndexInput, portMode[0]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); // // Flush all ports ; receive error OMX_ErrorIncorrectStateOperation // status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush), @@ -633,8 +644,9 @@ TEST_F(ComponentHidlTest, Flush_M) { // ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK); // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode)); // // Flush all ports ; receive error OMX_ErrorIncorrectStateOperation // status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush), @@ -642,10 +654,12 @@ TEST_F(ComponentHidlTest, Flush_M) { // ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); + // dispatch buffers for (size_t i = 0; i < oBuffer.size(); i++) { - dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1]); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1])); } // // flush invalid port, expecting OMX_ErrorBadPortIndex @@ -692,10 +706,12 @@ TEST_F(ComponentHidlTest, Flush_M) { } // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to loaded - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // test port mode configuration when the component is in various states @@ -726,13 +742,14 @@ TEST_F(ComponentHidlTest, PortModeConfig) { PortMode portMode[2]; initPortMode(portMode, isSecure, compClass); status = omxNode->setPortMode(kPortIndexInput, portMode[0]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode)); // Only Allow Port Mode configuration in loaded state status = omxNode->setPortMode(kPortIndexInput, portMode[0]); EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK); @@ -740,7 +757,7 @@ TEST_F(ComponentHidlTest, PortModeConfig) { EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // Only Allow Port Mode configuration in loaded state status = omxNode->setPortMode(kPortIndexInput, portMode[0]); EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK); @@ -748,10 +765,12 @@ TEST_F(ComponentHidlTest, PortModeConfig) { EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to loaded - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); status = omxNode->setPortMode(kPortIndexInput, portMode[0]); EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); @@ -788,9 +807,9 @@ TEST_F(ComponentHidlTest, StateTransitions) { PortMode portMode[2]; initPortMode(portMode, isSecure, compClass); status = omxNode->setPortMode(kPortIndexInput, portMode[0]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); // set state to idle status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), @@ -812,8 +831,8 @@ TEST_F(ComponentHidlTest, StateTransitions) { android::hardware::media::omx::V1_0::Status::TIMED_OUT); BufferInfo buffer; - allocateBuffer(omxNode, &buffer, j, def.nBufferSize, - portMode[j - portBase]); + ASSERT_NO_FATAL_FAILURE(allocateBuffer( + omxNode, &buffer, j, def.nBufferSize, portMode[j - portBase])); pBuffer[j - portBase].push(buffer); } } @@ -828,23 +847,28 @@ TEST_F(ComponentHidlTest, StateTransitions) { ASSERT_EQ(msg.data.eventData.data2, OMX_StateIdle); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // dispatch buffers for (size_t i = 0; i < pBuffer[1].size(); i++) { - dispatchOutputBuffer(omxNode, &pBuffer[1], i, portMode[1]); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, &pBuffer[1], i, portMode[1])); } // set state to idle - changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1]); - // // set state to executing - // changeStateIdletoExecute(omxNode, observer); - // // TODO: Sending empty input buffers is slightly tricky. - // // dispatch buffers - // for (size_t i = 0; i < pBuffer[0].size(); i++) { - // dispatchInputBuffer(omxNode, &pBuffer[0], i, 0, 0, 0, - // portMode[0]); - // } - // // set state to idle - // changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1]); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1])); +#if 0 + // set state to executing + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); + // TODO: Sending empty input buffers is slightly tricky. + // dispatch buffers + for (size_t i = 0; i < pBuffer[0].size(); i++) { + ASSERT_NO_FATAL_FAILURE( + dispatchInputBuffer(omxNode, &pBuffer[0], i, 0, 0, 0, portMode[0])); + } + // set state to idle + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1])); +#endif // set state to loaded status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), @@ -908,8 +932,9 @@ TEST_F(ComponentHidlTest, DISABLED_StateTransitions_M) { EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK); // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); // set state to idle ; receive error OMX_ErrorSameState status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), @@ -917,7 +942,7 @@ TEST_F(ComponentHidlTest, DISABLED_StateTransitions_M) { EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // set state to executing ; receive error OMX_ErrorSameState status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), @@ -929,12 +954,13 @@ TEST_F(ComponentHidlTest, DISABLED_StateTransitions_M) { OMX_StateLoaded); EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK); - // set state to Idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); - - // set state to Loaded - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + // set state to idle + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); + // set state to loaded + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // port enable disable test @@ -1017,14 +1043,14 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Idle) { PortMode portMode[2]; initPortMode(portMode, isSecure, compClass); status = omxNode->setPortMode(kPortIndexInput, portMode[0]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1], - kPortIndexInput, kPortIndexOutput, portMode); - + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1], + kPortIndexInput, kPortIndexOutput, portMode)); for (size_t i = portBase; i < portBase + 2; i++) { status = omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), i); @@ -1072,8 +1098,8 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Idle) { ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); - allocatePortBuffers(omxNode, &pBuffer[i - portBase], i, - portMode[i - portBase]); + ASSERT_NO_FATAL_FAILURE(allocatePortBuffers( + omxNode, &pBuffer[i - portBase], i, portMode[i - portBase])); status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0], &pBuffer[1]); ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); @@ -1087,8 +1113,9 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Idle) { } // set state to Loaded - changeStateIdletoLoaded(omxNode, observer, &pBuffer[0], &pBuffer[1], - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE( + changeStateIdletoLoaded(omxNode, observer, &pBuffer[0], &pBuffer[1], + kPortIndexInput, kPortIndexOutput)); } // port enable disable test @@ -1121,20 +1148,20 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Execute) { PortMode portMode[2]; initPortMode(portMode, isSecure, compClass); status = omxNode->setPortMode(kPortIndexInput, portMode[0]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1], - kPortIndexInput, kPortIndexOutput, portMode); - + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1], + kPortIndexInput, kPortIndexOutput, portMode)); // set state to executing - changeStateIdletoExecute(omxNode, observer); - + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // dispatch buffers for (size_t i = 0; i < pBuffer[1].size(); i++) { - dispatchOutputBuffer(omxNode, &pBuffer[1], i, portMode[1]); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, &pBuffer[1], i, portMode[1])); } for (size_t i = portBase; i < portBase + 2; i++) { @@ -1187,8 +1214,8 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Execute) { ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); - allocatePortBuffers(omxNode, &pBuffer[i - portBase], i, - portMode[i - portBase]); + ASSERT_NO_FATAL_FAILURE(allocatePortBuffers( + omxNode, &pBuffer[i - portBase], i, portMode[i - portBase])); status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0], &pBuffer[1]); ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); @@ -1201,12 +1228,13 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Execute) { } } - // set state to Idle - changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1]); - - // set state to Loaded - changeStateIdletoLoaded(omxNode, observer, &pBuffer[0], &pBuffer[1], - kPortIndexInput, kPortIndexOutput); + // set state to idle + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1])); + // set state to loaded + ASSERT_NO_FATAL_FAILURE( + changeStateIdletoLoaded(omxNode, observer, &pBuffer[0], &pBuffer[1], + kPortIndexInput, kPortIndexOutput)); } // port enable disable test - monkeying diff --git a/media/omx/1.0/vts/functional/master/VtsHalMediaOmxV1_0TargetMasterTest.cpp b/media/omx/1.0/vts/functional/master/VtsHalMediaOmxV1_0TargetMasterTest.cpp index 7cffea8c55..5a31d691c9 100644 --- a/media/omx/1.0/vts/functional/master/VtsHalMediaOmxV1_0TargetMasterTest.cpp +++ b/media/omx/1.0/vts/functional/master/VtsHalMediaOmxV1_0TargetMasterTest.cpp @@ -150,6 +150,7 @@ TEST_F(MasterHidlTest, ListServiceAttr) { attributes = _nl; }) .isOk()); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); if (attributes.size() == 0) ALOGV("Warning, Attribute list empty"); } @@ -186,6 +187,7 @@ TEST_F(MasterHidlTest, ListNodes) { nodeList = _nl; }) .isOk()); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); if (nodeList.size() == 0) ALOGV("Warning, ComponentInfo list empty"); else { @@ -204,6 +206,7 @@ TEST_F(MasterHidlTest, ListNodes) { omxNode = _nl; }) .isOk()); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); if (omxNode == nullptr) { isPass = false; std::cerr << "[ !OK ] " << nodeList[i].mName.c_str() diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index a2547e897a..667c2e1248 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -166,6 +166,7 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { this->omxNode = _nl; }) .isOk()); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); ASSERT_NE(omxNode, nullptr); ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role"; struct StringToName { @@ -498,8 +499,7 @@ void portReconfiguration(sp omxNode, sp observer, nFrameWidth, nFrameHeight, 0, xFramerate); // If you can disable a port, then you should be able to - // enable - // it as well + // enable it as well status = omxNode->sendCommand( toRawCommandType(OMX_CommandPortEnable), kPortIndexOutput); ASSERT_EQ(status, @@ -512,8 +512,8 @@ void portReconfiguration(sp omxNode, sp observer, status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); - allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput, - oPortMode, true); + ASSERT_NO_FATAL_FAILURE(allocatePortBuffers( + omxNode, oBuffer, kPortIndexOutput, oPortMode, true)); status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); ASSERT_EQ(status, @@ -534,7 +534,8 @@ void portReconfiguration(sp omxNode, sp observer, // dispatch output buffers for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i, oPortMode); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, i, oPortMode)); } } else { ASSERT_TRUE(false); @@ -550,7 +551,7 @@ void portReconfiguration(sp omxNode, sp observer, } else if (msg.data.eventData.event == OMX_EventError) { std::cerr << "[ ERROR ] OMX_EventError/ " "Decode Frame Call might be failed \n"; - return; + ASSERT_TRUE(false); } else { // something unexpected happened ASSERT_TRUE(false); @@ -572,10 +573,10 @@ void waitOnInputConsumption(sp omxNode, sp observer, status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); if (status == android::hardware::media::omx::V1_0::Status::OK) { - EXPECT_EQ(msg.type, Message::Type::EVENT); - portReconfiguration(omxNode, observer, iBuffer, oBuffer, - kPortIndexInput, kPortIndexOutput, msg, - oPortMode, nullptr); + ASSERT_EQ(msg.type, Message::Type::EVENT); + ASSERT_NO_FATAL_FAILURE(portReconfiguration( + omxNode, observer, iBuffer, oBuffer, kPortIndexInput, + kPortIndexOutput, msg, oPortMode, nullptr)); } // status == TIMED_OUT, it could be due to process time being large // than DEFAULT_TIMEOUT or component needs output buffers to start @@ -588,7 +589,8 @@ void waitOnInputConsumption(sp omxNode, sp observer, // Dispatch an output buffer assuming outQueue.empty() is true size_t index; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode)); timeOut = TIMEOUT_COUNTER_Q; } } @@ -617,9 +619,9 @@ void decodeNFrames(sp omxNode, sp observer, // Port Reconfiguration if (status == android::hardware::media::omx::V1_0::Status::OK && msg.type == Message::Type::EVENT) { - portReconfiguration(omxNode, observer, iBuffer, oBuffer, - kPortIndexInput, kPortIndexOutput, msg, - oPortMode, nullptr); + ASSERT_NO_FATAL_FAILURE(portReconfiguration( + omxNode, observer, iBuffer, oBuffer, kPortIndexInput, + kPortIndexOutput, msg, oPortMode, nullptr)); } if (frameID == (int)Info->size() || frameID == (offset + range)) break; @@ -641,15 +643,16 @@ void decodeNFrames(sp omxNode, sp observer, if (signalEOS && ((frameID == (int)Info->size() - 1) || (frameID == (offset + range - 1)))) flags |= OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, index, - (*Info)[frameID].bytesCount, flags, - (*Info)[frameID].timestamp); + ASSERT_NO_FATAL_FAILURE(dispatchInputBuffer( + omxNode, iBuffer, index, (*Info)[frameID].bytesCount, flags, + (*Info)[frameID].timestamp)); frameID++; iQueued = true; } // Dispatch output buffer if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode)); oQueued = true; } // Reset Counters when either input or output buffer is dispatched @@ -658,8 +661,7 @@ void decodeNFrames(sp omxNode, sp observer, else timeOut--; if (timeOut == 0) { - EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite"; - break; + ASSERT_TRUE(false) << "Wait on Input/Output is found indefinite"; } } } @@ -888,28 +890,33 @@ TEST_F(VideoDecHidlTest, DecodeTest) { android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode, true); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, portMode, true)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // Port Reconfiguration eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(), - portMode[1]); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(), portMode[1])); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode[1]); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode, - portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode[1])); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // Test for adaptive playback support @@ -985,10 +992,11 @@ TEST_F(VideoDecHidlTest, AdaptivePlaybackTest) { android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode, true); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, portMode, true)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); timestampDevTest = true; uint32_t timestampOffset = 0; @@ -1021,9 +1029,10 @@ TEST_F(VideoDecHidlTest, AdaptivePlaybackTest) { // Port Reconfiguration eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(), - portMode[1], false); + ASSERT_NO_FATAL_FAILURE( + decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, eleStream, &Info, + 0, (int)Info.size(), portMode[1], false)); eleStream.close(); getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, @@ -1042,16 +1051,20 @@ TEST_F(VideoDecHidlTest, AdaptivePlaybackTest) { } portSettingsChange = false; } - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode[1]); - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, - portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode[1])); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // end of sequence test @@ -1095,25 +1108,29 @@ TEST_F(VideoDecHidlTest, EOSTest_M) { android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode, true); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, portMode, true)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // request EOS at the start - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, - portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); EXPECT_GE(framesReceived, 0U); framesReceived = 0; timestampUs = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // end of sequence test @@ -1183,50 +1200,58 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) { android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode, true); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, portMode, true)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // request EOS for thumbnail size_t i = 0; while (!(Info[i].flags & OMX_BUFFERFLAG_SYNCFRAME)) i++; eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, eleStream, &Info, 0, i + 1, portMode[1]); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, i + 1, portMode[1])); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode[1]); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode, - portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode[1])); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); EXPECT_GE(framesReceived, 1U); framesReceived = 0; timestampUs = 0; eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, eleStream, &Info, 0, i + 1, portMode[1], - false); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, i + 1, portMode[1], false)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode[1]); - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, - portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode[1])); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); EXPECT_GE(framesReceived, 1U); framesReceived = 0; timestampUs = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // end of sequence test @@ -1302,32 +1327,38 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) { android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode, true); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, portMode, true)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // request EOS at the end eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(), - portMode[1], false); + ASSERT_NO_FATAL_FAILURE(decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, + eleStream, &Info, 0, (int)Info.size(), + portMode[1], false)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode[1]); - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, - portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode[1])); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); framesReceived = 0; timestampUs = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // test input/output port flush @@ -1397,10 +1428,11 @@ TEST_F(VideoDecHidlTest, FlushTest) { android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode, true); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, portMode, true)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // Decode 128 frames and flush. here 128 is chosen to ensure there is a key // frame after this so that the below section can be convered for all @@ -1408,11 +1440,11 @@ TEST_F(VideoDecHidlTest, FlushTest) { int nFrames = 128; eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, eleStream, &Info, 0, nFrames, portMode[1], - false); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, nFrames, portMode[1], false)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); framesReceived = 0; // Seek to next key frame and start decoding till the end @@ -1429,20 +1461,23 @@ TEST_F(VideoDecHidlTest, FlushTest) { index++; } if (keyFrame) { - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, eleStream, &Info, index, - Info.size() - index, portMode[1], false); + ASSERT_NO_FATAL_FAILURE( + decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, eleStream, &Info, + index, Info.size() - index, portMode[1], false)); } eleStream.close(); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); framesReceived = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } int main(int argc, char** argv) { diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp index df90ccce59..743ff787a2 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp @@ -179,6 +179,7 @@ class VideoEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { this->omxNode = _nl; }) .isOk()); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); ASSERT_NE(omxNode, nullptr); ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role"; struct StringToName { @@ -617,7 +618,7 @@ void waitOnInputConsumption(sp omxNode, sp observer, size_t i = 0; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); - EXPECT_EQ(status, + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); // status == TIMED_OUT, it could be due to process time being large // than DEFAULT_TIMEOUT or component needs output buffers to start @@ -634,7 +635,8 @@ void waitOnInputConsumption(sp omxNode, sp observer, // Dispatch an output buffer assuming outQueue.empty() is true size_t index; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, index); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index)); timeOut = TIMEOUT_COUNTER_Q; } } @@ -1008,8 +1010,7 @@ void encodeNFrames(sp omxNode, sp observer, ASSERT_EQ(msg.data.eventData.data2, OMX_IndexConfigAndroidIntraRefresh); } else if (msg.data.eventData.event == OMX_EventError) { - EXPECT_TRUE(false) << "Received OMX_EventError, not sure why"; - break; + ASSERT_TRUE(false) << "Received OMX_EventError, not sure why"; } else if (msg.data.eventData.event == OMX_EventDataSpaceChanged) { // TODO: how am i supposed to respond now? std::cout << "[ INFO ] OMX_EventDataSpaceChanged \n"; @@ -1025,8 +1026,13 @@ void encodeNFrames(sp omxNode, sp observer, if (inputDataIsMeta) { if (listener->freeBuffers > listener->minUnDequeuedCount) { if (dispatchGraphicBuffer(omxNode, producer, listener, iBuffer, - portIndexInput, eleStream, timestamp)) - break; + portIndexInput, eleStream, + timestamp)) { + if (::testing::Test::HasFailure()) + ASSERT_TRUE(false); + else + break; + } timestamp += timestampIncr; nFrames--; ipCount++; @@ -1044,8 +1050,8 @@ void encodeNFrames(sp omxNode, sp observer, break; flags = OMX_BUFFERFLAG_ENDOFFRAME; if (signalEOS && (nFrames == 1)) flags |= OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, flags, - timestamp); + ASSERT_NO_FATAL_FAILURE(dispatchInputBuffer( + omxNode, iBuffer, index, bytesCount, flags, timestamp)); if (timestampUslist) timestampUslist->push_back(timestamp); timestamp += timestampIncr; nFrames--; @@ -1055,7 +1061,8 @@ void encodeNFrames(sp omxNode, sp observer, } // Dispatch output buffer if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, index); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index)); oQueued = true; } // Reset Counters when either input or output buffer is dispatched @@ -1064,8 +1071,7 @@ void encodeNFrames(sp omxNode, sp observer, else timeOut--; if (timeOut == 0) { - EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite"; - break; + ASSERT_TRUE(false) << "Wait on Input/Output is found indefinite"; } // Runtime Param Configuration if (ipCount == 15) { @@ -1137,7 +1143,7 @@ TEST_F(VideoEncHidlTest, BufferSourceCallBacks) { xFramerate, eColorFormat); sp buffersource = new DummyBufferSource(omxNode); - EXPECT_NE(buffersource, nullptr); + ASSERT_NE(buffersource, nullptr); status = omxNode->setInputSurface(buffersource); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); @@ -1151,20 +1157,20 @@ TEST_F(VideoEncHidlTest, BufferSourceCallBacks) { ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &buffersource->iBuffer, - &buffersource->oBuffer, kPortIndexInput, - kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( + omxNode, observer, &buffersource->iBuffer, &buffersource->oBuffer, + kPortIndexInput, kPortIndexOutput, portMode)); // set state to executing - changeStateIdletoExecute(omxNode, observer); - testEOS(omxNode, observer, &buffersource->iBuffer, &buffersource->oBuffer, - false, eosFlag); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); + ASSERT_NO_FATAL_FAILURE(testEOS(omxNode, observer, &buffersource->iBuffer, + &buffersource->oBuffer, false, eosFlag)); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &buffersource->iBuffer, - &buffersource->oBuffer); + ASSERT_NO_FATAL_FAILURE(changeStateExecutetoIdle( + omxNode, observer, &buffersource->iBuffer, &buffersource->oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &buffersource->iBuffer, - &buffersource->oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded( + omxNode, observer, &buffersource->iBuffer, &buffersource->oBuffer, + kPortIndexInput, kPortIndexOutput)); // test for callbacks EXPECT_EQ(buffersource->callback, 31); } @@ -1218,8 +1224,9 @@ TEST_F(VideoEncHidlTest, EncodeTest) { // Configure output port uint32_t nBitRate = 512000; - setDefaultPortParam(omxNode, kPortIndexOutput, eCompressionFormat, - nFrameWidth, nFrameHeight, nBitRate, xFramerate); + ASSERT_NO_FATAL_FAILURE( + setDefaultPortParam(omxNode, kPortIndexOutput, eCompressionFormat, + nFrameWidth, nFrameHeight, nBitRate, xFramerate)); setRefreshPeriod(omxNode, kPortIndexOutput, 0); unsigned int index; @@ -1255,27 +1262,32 @@ TEST_F(VideoEncHidlTest, EncodeTest) { android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - encodeNFrames(omxNode, observer, kPortIndexInput, kPortIndexOutput, - &iBuffer, &oBuffer, 32, xFramerate, - (nFrameWidth * nFrameHeight * 3) >> 1, eleStream, - ×tampUslist); + ASSERT_NO_FATAL_FAILURE(encodeNFrames( + omxNode, observer, kPortIndexInput, kPortIndexOutput, &iBuffer, + &oBuffer, 32, xFramerate, (nFrameWidth * nFrameHeight * 3) >> 1, + eleStream, ×tampUslist)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer)); + ASSERT_NO_FATAL_FAILURE( + testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag)); if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // test raw stream encode (input is ANW buffers) @@ -1304,9 +1316,9 @@ TEST_F(VideoEncHidlTest, EncodeTestBufferMetaModes) { // Configure output port uint32_t nBitRate = 512000; - setDefaultPortParam(omxNode, kPortIndexOutput, eCompressionFormat, - nFrameWidth, nFrameHeight, nBitRate, xFramerate); - + ASSERT_NO_FATAL_FAILURE( + setDefaultPortParam(omxNode, kPortIndexOutput, eCompressionFormat, + nFrameWidth, nFrameHeight, nBitRate, xFramerate)); // CreateInputSurface EXPECT_TRUE(omx->createInputSurface( [&](android::hardware::media::omx::V1_0::Status _s, @@ -1413,28 +1425,32 @@ TEST_F(VideoEncHidlTest, EncodeTestBufferMetaModes) { android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - encodeNFrames(omxNode, observer, kPortIndexInput, kPortIndexOutput, - &iBuffer, &oBuffer, 1024, xFramerate, - (nFrameWidth * nFrameHeight * 3) >> 1, eleStream, nullptr, - false, true, producer, listener); + ASSERT_NO_FATAL_FAILURE(encodeNFrames( + omxNode, observer, kPortIndexInput, kPortIndexOutput, &iBuffer, + &oBuffer, 1024, xFramerate, (nFrameWidth * nFrameHeight * 3) >> 1, + eleStream, nullptr, false, true, producer, listener)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, true, - listener); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); + ASSERT_NO_FATAL_FAILURE(waitOnInputConsumption(omxNode, observer, &iBuffer, + &oBuffer, true, listener)); + ASSERT_NO_FATAL_FAILURE( + testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag)); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); EXPECT_EQ(portDef.nBufferCountActual, listener->freeBuffers); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); returnval = producer->disconnect( NATIVE_WINDOW_API_CPU, IGraphicBufferProducer::DisconnectMode::API); @@ -1528,24 +1544,28 @@ TEST_F(VideoEncHidlTest, EncodeTestEOS) { android::Vector iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // send EOS status = source->signalEndOfInputStream(); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, true, - listener); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); + ASSERT_NO_FATAL_FAILURE(waitOnInputConsumption(omxNode, observer, &iBuffer, + &oBuffer, true, listener)); + ASSERT_NO_FATAL_FAILURE( + testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag)); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); EXPECT_EQ(portDef.nBufferCountActual, listener->freeBuffers); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); returnval = producer->disconnect( NATIVE_WINDOW_API_CPU, IGraphicBufferProducer::DisconnectMode::API); From 90379def76606c8d6fbd6149d33c9da72d87434e Mon Sep 17 00:00:00 2001 From: Jean-Luc Brouillet Date: Wed, 4 Oct 2017 18:24:59 -0700 Subject: [PATCH 252/265] Corrected performanceInfo documentation We'll be using relative numbers, change the doc to reflect that. Bug: 63905942 Test: Compiled Change-Id: Iad67621cfc76490c2dc471865a3f82cebf175440 --- neuralnetworks/1.0/types.hal | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/neuralnetworks/1.0/types.hal b/neuralnetworks/1.0/types.hal index a6453934cc..8779723d2f 100644 --- a/neuralnetworks/1.0/types.hal +++ b/neuralnetworks/1.0/types.hal @@ -1015,12 +1015,16 @@ enum DeviceStatus : int32_t { */ struct PerformanceInfo { /** - * Execution time in nanoseconds. + * Ratio of the time taken by the driver to execute the + * workload compared to the time the CPU would take for the + * same workload. A lower number is better. */ float execTime; /** - * Power usage in picoJoules. + * Ratio of the energy used by the driver compared to what + * the CPU would use for doing the same workload. A lower number + * is better. */ float powerUsage; }; From 0645aec1de74259ad37093d356f20c08497a9e6a Mon Sep 17 00:00:00 2001 From: Suresh Sivaraman Date: Thu, 21 Sep 2017 18:44:24 +0530 Subject: [PATCH 253/265] Added VTS tests for MediaCas - II Bug: 63914034 Bug: 65593293 Test: Build & test vts: > make vts -j64 > vts-tradefed run vts -m VtsHalCasV1_0Target Change-Id: If5a0e7cb3d520843ba45147a085c43b94027e584 --- cas/1.0/vts/functional/Android.bp | 8 +- .../functional/VtsHalCasV1_0TargetTest.cpp | 499 +++++++++++++++++- 2 files changed, 481 insertions(+), 26 deletions(-) diff --git a/cas/1.0/vts/functional/Android.bp b/cas/1.0/vts/functional/Android.bp index d601235d80..872bb2c55a 100644 --- a/cas/1.0/vts/functional/Android.bp +++ b/cas/1.0/vts/functional/Android.bp @@ -18,6 +18,12 @@ cc_test { name: "VtsHalCasV1_0TargetTest", defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalCasV1_0TargetTest.cpp"], - static_libs: ["android.hardware.cas@1.0"], + static_libs: [ + "android.hardware.cas@1.0", + "android.hardware.cas.native@1.0", + "android.hidl.allocator@1.0", + "android.hidl.memory@1.0", + "libhidlmemory", + ], } diff --git a/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp b/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp index f346bae982..062ee2038e 100644 --- a/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp +++ b/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp @@ -22,30 +22,192 @@ #include #include #include +#include +#include +#include +#include +#include #include #include +#include +#include +#include +#include -#include -#include - -// CA System Ids used for testing #define CLEAR_KEY_SYSTEM_ID 0xF6D8 #define INVALID_SYSTEM_ID 0 +#define WAIT_TIMEOUT 3000000000 + +#define PROVISION_STR \ + "{ " \ + " \"id\": 21140844, " \ + " \"name\": \"Test Title\", " \ + " \"lowercase_organization_name\": \"Android\", " \ + " \"asset_key\": { " \ + " \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\" " \ + " }, " \ + " \"cas_type\": 1, " \ + " \"track_types\": [ ] " \ + "} " using android::Condition; using android::hardware::cas::V1_0::ICas; using android::hardware::cas::V1_0::ICasListener; using android::hardware::cas::V1_0::IDescramblerBase; +using android::hardware::cas::native::V1_0::IDescrambler; +using android::hardware::cas::native::V1_0::SubSample; +using android::hardware::cas::native::V1_0::SharedBuffer; +using android::hardware::cas::native::V1_0::DestinationBuffer; +using android::hardware::cas::native::V1_0::BufferType; +using android::hardware::cas::native::V1_0::ScramblingControl; using android::hardware::cas::V1_0::IMediaCasService; using android::hardware::cas::V1_0::HidlCasPluginDescriptor; using android::hardware::Void; using android::hardware::hidl_vec; +using android::hardware::hidl_string; +using android::hardware::hidl_handle; +using android::hardware::hidl_memory; using android::hardware::Return; +using android::hardware::cas::V1_0::Status; +using android::hidl::allocator::V1_0::IAllocator; +using android::hidl::memory::V1_0::IMemory; +using android::hidl::memory::V1_0::IMapper; using android::Mutex; using android::sp; namespace { +const uint8_t kEcmBinaryBuffer[] = { + 0x00, 0x00, 0x01, 0xf0, 0x00, 0x50, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x27, 0x10, 0x02, 0x00, + 0x01, 0x77, 0x01, 0x42, 0x95, 0x6c, 0x0e, 0xe3, 0x91, 0xbc, 0xfd, 0x05, 0xb1, 0x60, 0x4f, + 0x17, 0x82, 0xa4, 0x86, 0x9b, 0x23, 0x56, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x27, 0x10, 0x02, 0x00, 0x01, 0x77, 0x01, 0x42, 0x95, 0x6c, 0xd7, 0x43, 0x62, 0xf8, 0x1c, + 0x62, 0x19, 0x05, 0xc7, 0x3a, 0x42, 0xcd, 0xfd, 0xd9, 0x13, 0x48, +}; + +const SubSample kSubSamples[] = {{162, 0}, {0, 184}, {0, 184}}; + +const uint8_t kInBinaryBuffer[] = { + 0x00, 0x00, 0x00, 0x01, 0x09, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0xc0, 0x1e, 0xdb, 0x01, + 0x40, 0x16, 0xec, 0x04, 0x40, 0x00, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x0f, 0x03, 0xc5, 0x8b, + 0xb8, 0x00, 0x00, 0x00, 0x01, 0x68, 0xca, 0x8c, 0xb2, 0x00, 0x00, 0x01, 0x06, 0x05, 0xff, 0xff, + 0x70, 0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee, + 0xef, 0x78, 0x32, 0x36, 0x34, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x31, 0x34, 0x32, + 0x20, 0x2d, 0x20, 0x48, 0x2e, 0x32, 0x36, 0x34, 0x2f, 0x4d, 0x50, 0x45, 0x47, 0x2d, 0x34, 0x20, + 0x41, 0x56, 0x43, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x20, 0x2d, 0x20, 0x43, 0x6f, 0x70, 0x79, + 0x6c, 0x65, 0x66, 0x74, 0x20, 0x32, 0x30, 0x30, 0x33, 0x2d, 0x32, 0x30, 0x31, 0x34, 0x20, 0x2d, + 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x69, 0x64, 0x65, + 0x6f, 0x6c, 0x61, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x78, 0x32, 0x36, 0x34, 0x2e, 0x68, 0x74, + 0x6d, 0x6c, 0x6e, 0x45, 0x21, 0x82, 0x38, 0xf0, 0x9d, 0x7d, 0x96, 0xe6, 0x94, 0xae, 0xe2, 0x87, + 0x8f, 0x04, 0x49, 0xe5, 0xf6, 0x8c, 0x8b, 0x9a, 0x10, 0x18, 0xba, 0x94, 0xe9, 0x22, 0x31, 0x04, + 0x7e, 0x60, 0x5b, 0xc4, 0x24, 0x00, 0x90, 0x62, 0x0d, 0xdc, 0x85, 0x74, 0x75, 0x78, 0xd0, 0x14, + 0x08, 0xcb, 0x02, 0x1d, 0x7d, 0x9d, 0x34, 0xe8, 0x81, 0xb9, 0xf7, 0x09, 0x28, 0x79, 0x29, 0x8d, + 0xe3, 0x14, 0xed, 0x5f, 0xca, 0xaf, 0xf4, 0x1c, 0x49, 0x15, 0xe1, 0x80, 0x29, 0x61, 0x76, 0x80, + 0x43, 0xf8, 0x58, 0x53, 0x40, 0xd7, 0x31, 0x6d, 0x61, 0x81, 0x41, 0xe9, 0x77, 0x9f, 0x9c, 0xe1, + 0x6d, 0xf2, 0xee, 0xd9, 0xc8, 0x67, 0xd2, 0x5f, 0x48, 0x73, 0xe3, 0x5c, 0xcd, 0xa7, 0x45, 0x58, + 0xbb, 0xdd, 0x28, 0x1d, 0x68, 0xfc, 0xb4, 0xc6, 0xf6, 0x92, 0xf6, 0x30, 0x03, 0xaa, 0xe4, 0x32, + 0xf6, 0x34, 0x51, 0x4b, 0x0f, 0x8c, 0xf9, 0xac, 0x98, 0x22, 0xfb, 0x49, 0xc8, 0xbf, 0xca, 0x8c, + 0x80, 0x86, 0x5d, 0xd7, 0xa4, 0x52, 0xb1, 0xd9, 0xa6, 0x04, 0x4e, 0xb3, 0x2d, 0x1f, 0xb8, 0x35, + 0xcc, 0x45, 0x6d, 0x9c, 0x20, 0xa7, 0xa4, 0x34, 0x59, 0x72, 0xe3, 0xae, 0xba, 0x49, 0xde, 0xd1, + 0xaa, 0xee, 0x3d, 0x77, 0xfc, 0x5d, 0xc6, 0x1f, 0x9d, 0xac, 0xc2, 0x15, 0x66, 0xb8, 0xe1, 0x54, + 0x4e, 0x74, 0x93, 0xdb, 0x9a, 0x24, 0x15, 0x6e, 0x20, 0xa3, 0x67, 0x3e, 0x5a, 0x24, 0x41, 0x5e, + 0xb0, 0xe6, 0x35, 0x87, 0x1b, 0xc8, 0x7a, 0xf9, 0x77, 0x65, 0xe0, 0x01, 0xf2, 0x4c, 0xe4, 0x2b, + 0xa9, 0x64, 0x96, 0x96, 0x0b, 0x46, 0xca, 0xea, 0x79, 0x0e, 0x78, 0xa3, 0x5f, 0x43, 0xfc, 0x47, + 0x6a, 0x12, 0xfa, 0xc4, 0x33, 0x0e, 0x88, 0x1c, 0x19, 0x3a, 0x00, 0xc3, 0x4e, 0xb5, 0xd8, 0xfa, + 0x8e, 0xf1, 0xbc, 0x3d, 0xb2, 0x7e, 0x50, 0x8d, 0x67, 0xc3, 0x6b, 0xed, 0xe2, 0xea, 0xa6, 0x1f, + 0x25, 0x24, 0x7c, 0x94, 0x74, 0x50, 0x49, 0xe3, 0xc6, 0x58, 0x2e, 0xfd, 0x28, 0xb4, 0xc6, 0x73, + 0xb1, 0x53, 0x74, 0x27, 0x94, 0x5c, 0xdf, 0x69, 0xb7, 0xa1, 0xd7, 0xf5, 0xd3, 0x8a, 0x2c, 0x2d, + 0xb4, 0x5e, 0x8a, 0x16, 0x14, 0x54, 0x64, 0x6e, 0x00, 0x6b, 0x11, 0x59, 0x8a, 0x63, 0x38, 0x80, + 0x76, 0xc3, 0xd5, 0x59, 0xf7, 0x3f, 0xd2, 0xfa, 0xa5, 0xca, 0x82, 0xff, 0x4a, 0x62, 0xf0, 0xe3, + 0x42, 0xf9, 0x3b, 0x38, 0x27, 0x8a, 0x89, 0xaa, 0x50, 0x55, 0x4b, 0x29, 0xf1, 0x46, 0x7c, 0x75, + 0xef, 0x65, 0xaf, 0x9b, 0x0d, 0x6d, 0xda, 0x25, 0x94, 0x14, 0xc1, 0x1b, 0xf0, 0xc5, 0x4c, 0x24, + 0x0e, 0x65, +}; + +const uint8_t kOutRefBinaryBuffer[] = { + 0x00, 0x00, 0x00, 0x01, 0x09, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0xc0, 0x1e, 0xdb, 0x01, + 0x40, 0x16, 0xec, 0x04, 0x40, 0x00, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x0f, 0x03, 0xc5, 0x8b, + 0xb8, 0x00, 0x00, 0x00, 0x01, 0x68, 0xca, 0x8c, 0xb2, 0x00, 0x00, 0x01, 0x06, 0x05, 0xff, 0xff, + 0x70, 0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee, + 0xef, 0x78, 0x32, 0x36, 0x34, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x31, 0x34, 0x32, + 0x20, 0x2d, 0x20, 0x48, 0x2e, 0x32, 0x36, 0x34, 0x2f, 0x4d, 0x50, 0x45, 0x47, 0x2d, 0x34, 0x20, + 0x41, 0x56, 0x43, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x20, 0x2d, 0x20, 0x43, 0x6f, 0x70, 0x79, + 0x6c, 0x65, 0x66, 0x74, 0x20, 0x32, 0x30, 0x30, 0x33, 0x2d, 0x32, 0x30, 0x31, 0x34, 0x20, 0x2d, + 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x69, 0x64, 0x65, + 0x6f, 0x6c, 0x61, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x78, 0x32, 0x36, 0x34, 0x2e, 0x68, 0x74, + 0x6d, 0x6c, 0x20, 0x2d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x20, 0x63, 0x61, + 0x62, 0x61, 0x63, 0x3d, 0x30, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x32, 0x20, 0x64, 0x65, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x3d, 0x31, 0x3a, 0x30, 0x3a, 0x30, 0x20, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, + 0x65, 0x3d, 0x30, 0x78, 0x31, 0x3a, 0x30, 0x78, 0x31, 0x31, 0x31, 0x20, 0x6d, 0x65, 0x3d, 0x68, + 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x6d, 0x65, 0x3d, 0x37, 0x20, 0x70, 0x73, 0x79, 0x3d, 0x31, + 0x20, 0x70, 0x73, 0x79, 0x5f, 0x72, 0x64, 0x3d, 0x31, 0x2e, 0x30, 0x30, 0x3a, 0x30, 0x2e, 0x30, + 0x30, 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x66, 0x3d, 0x31, 0x20, 0x6d, 0x65, + 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x31, 0x36, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61, + 0x5f, 0x6d, 0x65, 0x3d, 0x31, 0x20, 0x74, 0x72, 0x65, 0x6c, 0x6c, 0x69, 0x73, 0x3d, 0x31, 0x20, + 0x38, 0x78, 0x38, 0x64, 0x63, 0x74, 0x3d, 0x30, 0x20, 0x63, 0x71, 0x6d, 0x3d, 0x30, 0x20, 0x64, + 0x65, 0x61, 0x64, 0x7a, 0x6f, 0x6e, 0x65, 0x3d, 0x32, 0x31, 0x2c, 0x31, 0x31, 0x20, 0x66, 0x61, + 0x73, 0x74, 0x5f, 0x70, 0x73, 0x6b, 0x69, 0x70, 0x3d, 0x31, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, + 0x61, 0x5f, 0x71, 0x70, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x2d, 0x32, 0x20, 0x74, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3d, 0x36, 0x30, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x61, 0x68, + 0x65, 0x61, 0x64, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3d, 0x35, 0x20, 0x73, 0x6c, + 0x69, 0x63, 0x65, 0x64, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3d, 0x30, 0x20, 0x6e, + 0x72, 0x3d, 0x30, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x3d, 0x31, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x3d, 0x30, 0x20, 0x62, 0x6c, 0x75, 0x72, + 0x61, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x3d, 0x30, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x3d, 0x30, 0x20, + 0x62, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x3d, 0x30, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x70, 0x3d, 0x30, 0x20, 0x6b, 0x65, 0x79, 0x69, 0x6e, 0x74, 0x3d, 0x32, 0x35, 0x30, 0x20, 0x6b, + 0x65, 0x79, 0x69, 0x6e, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x3d, 0x32, 0x35, 0x20, 0x73, 0x63, 0x65, + 0x6e, 0x65, +}; + +class MediaCasListener : public ICasListener { + public: + virtual Return onEvent(int32_t event, int32_t arg, + const hidl_vec& data) override { + android::Mutex::Autolock autoLock(mMsgLock); + mEvent = event; + mEventArg = arg; + mEventData = data; + + mEventReceived = true; + mMsgCondition.signal(); + return Void(); + } + + void testEventEcho(sp& mediaCas, int32_t& event, int32_t& eventArg, + hidl_vec& eventData); + + private: + int32_t mEvent = -1; + int32_t mEventArg = -1; + bool mEventReceived = false; + hidl_vec mEventData; + android::Mutex mMsgLock; + android::Condition mMsgCondition; +}; + +void MediaCasListener::testEventEcho(sp& mediaCas, int32_t& event, int32_t& eventArg, + hidl_vec& eventData) { + mEventReceived = false; + auto returnStatus = mediaCas->sendEvent(event, eventArg, eventData); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + android::Mutex::Autolock autoLock(mMsgLock); + while (!mEventReceived) { + if (-ETIMEDOUT == mMsgCondition.waitRelative(mMsgLock, WAIT_TIMEOUT)) { + EXPECT_TRUE(false) << "event not received within timeout"; + return; + } + } + + EXPECT_EQ(mEvent, event); + EXPECT_EQ(mEventArg, eventArg); + EXPECT_TRUE(mEventData == eventData); +} + class MediaCasHidlTest : public ::testing::VtsHalHidlTargetTestBase { public: virtual void SetUp() override { @@ -59,17 +221,104 @@ class MediaCasHidlTest : public ::testing::VtsHalHidlTargetTestBase { static void description(const std::string& description) { RecordProperty("description", description); } + + sp mMediaCas; + sp mDescramblerBase; + sp mCasListener; + + ::testing::AssertionResult createCasPlugin(int32_t caSystemId); + ::testing::AssertionResult openCasSession(std::vector* sessionId); + ::testing::AssertionResult descrambleTestInputBuffer(const sp& descrambler, + Status* descrambleStatus, + hidl_memory* hidlInMemory); }; -class MediaCasListener : public ICasListener { - public: - virtual ::android::hardware::Return onEvent( - int32_t event, int32_t arg, const ::android::hardware::hidl_vec& data) override { - ALOGI("Info: received event: %d, arg: %d, size: %zu", event, arg, data.size()); - - return Void(); +::testing::AssertionResult MediaCasHidlTest::createCasPlugin(int32_t caSystemId) { + auto status = mService->isSystemIdSupported(caSystemId); + if (!status.isOk() || !status) { + return ::testing::AssertionFailure(); } -}; + status = mService->isDescramblerSupported(caSystemId); + if (!status.isOk() || !status) { + return ::testing::AssertionFailure(); + } + + mCasListener = new MediaCasListener(); + auto pluginStatus = mService->createPlugin(caSystemId, mCasListener); + if (!pluginStatus.isOk()) { + return ::testing::AssertionFailure(); + } + mMediaCas = pluginStatus; + if (mMediaCas == nullptr) { + return ::testing::AssertionFailure(); + } + + auto descramblerStatus = mService->createDescrambler(caSystemId); + if (!descramblerStatus.isOk()) { + return ::testing::AssertionFailure(); + } + mDescramblerBase = descramblerStatus; + return ::testing::AssertionResult(mDescramblerBase != nullptr); +} + +::testing::AssertionResult MediaCasHidlTest::openCasSession(std::vector* sessionId) { + Status sessionStatus; + auto returnVoid = mMediaCas->openSession([&](Status status, const hidl_vec& id) { + sessionStatus = status; + *sessionId = id; + }); + return ::testing::AssertionResult(returnVoid.isOk() && (Status::OK == sessionStatus)); +} + +::testing::AssertionResult MediaCasHidlTest::descrambleTestInputBuffer( + const sp& descrambler, Status* descrambleStatus, hidl_memory* hidlInMemory) { + hidl_vec hidlSubSamples; + hidlSubSamples.setToExternal(const_cast(kSubSamples), + (sizeof(kSubSamples) / sizeof(SubSample)), false /*own*/); + sp allocator = IAllocator::getService("ashmem"); + if (nullptr == allocator.get()) { + return ::testing::AssertionFailure(); + } + + bool allocateStatus; + auto returnStatus = + allocator->allocate(sizeof(kInBinaryBuffer), [&](bool status, hidl_memory const& mem) { + allocateStatus = status; + *hidlInMemory = mem; + }); + if (!returnStatus.isOk() || !allocateStatus) { + return ::testing::AssertionFailure(); + } + android::sp inMemory = mapMemory(*hidlInMemory); + if (nullptr == inMemory.get()) { + return ::testing::AssertionFailure(); + } + + uint8_t* ipBuffer = static_cast(static_cast(inMemory->getPointer())); + memcpy(ipBuffer, kInBinaryBuffer, sizeof(kInBinaryBuffer)); + + SharedBuffer srcBuffer = { + .heapBase = *hidlInMemory, .offset = (uint64_t)0, .size = sizeof(kInBinaryBuffer)}; + + DestinationBuffer dstBuffer; + dstBuffer.type = BufferType::SHARED_MEMORY; + dstBuffer.nonsecureMemory = srcBuffer; + + uint32_t outBytes; + hidl_string detailedError; + auto returnVoid = descrambler->descramble( + ScramblingControl::EVENKEY /*2*/, hidlSubSamples, srcBuffer, 0, dstBuffer, 0, + [&](Status status, uint32_t bytesWritten, const hidl_string& detailedErr) { + *descrambleStatus = status; + outBytes = bytesWritten; + detailedError = detailedErr; + }); + if (!returnVoid.isOk() || *descrambleStatus != Status::OK) { + ALOGI("descramble failed, trans=%s, status=%d, outBytes=%u, error=%s", + returnVoid.description().c_str(), *descrambleStatus, outBytes, detailedError.c_str()); + } + return ::testing::AssertionResult(returnVoid.isOk()); +} TEST_F(MediaCasHidlTest, EnumeratePlugins) { description("Test enumerate plugins"); @@ -87,17 +336,8 @@ TEST_F(MediaCasHidlTest, EnumeratePlugins) { sp casListener = new MediaCasListener(); for (size_t i = 0; i < descriptors.size(); i++) { int32_t caSystemId = descriptors[i].caSystemId; - bool status = mService->isSystemIdSupported(caSystemId); - ASSERT_EQ(status, true); - status = mService->isDescramblerSupported(caSystemId); - ASSERT_EQ(status, true); - - sp mediaCas = mService->createPlugin(caSystemId, casListener); - ASSERT_NE(mediaCas, nullptr); - - sp descramblerBase = mService->createDescrambler(caSystemId); - ASSERT_NE(descramblerBase, nullptr); + ASSERT_TRUE(createCasPlugin(caSystemId)); } } @@ -108,10 +348,14 @@ TEST_F(MediaCasHidlTest, TestInvalidSystemIdFails) { ASSERT_FALSE(mService->isSystemIdSupported(INVALID_SYSTEM_ID)); ASSERT_FALSE(mService->isDescramblerSupported(INVALID_SYSTEM_ID)); - sp mediaCas = mService->createPlugin(INVALID_SYSTEM_ID, casListener); + auto pluginStatus = mService->createPlugin(INVALID_SYSTEM_ID, casListener); + ASSERT_TRUE(pluginStatus.isOk()); + sp mediaCas = pluginStatus; EXPECT_EQ(mediaCas, nullptr); - sp descramblerBase = mService->createDescrambler(INVALID_SYSTEM_ID); + auto descramblerStatus = mService->createDescrambler(INVALID_SYSTEM_ID); + ASSERT_TRUE(descramblerStatus.isOk()); + sp descramblerBase = descramblerStatus; EXPECT_EQ(descramblerBase, nullptr); } @@ -120,7 +364,7 @@ TEST_F(MediaCasHidlTest, TestClearKeyPluginInstalled) { hidl_vec descriptors; EXPECT_TRUE(mService ->enumeratePlugins([&descriptors]( - hidl_vec const& _desc) { descriptors = _desc; }) + hidl_vec const& desc) { descriptors = desc; }) .isOk()); if (descriptors.size() == 0) { @@ -137,6 +381,211 @@ TEST_F(MediaCasHidlTest, TestClearKeyPluginInstalled) { ASSERT_TRUE(false) << "ClearKey plugin not installed"; } +TEST_F(MediaCasHidlTest, TestClearKeyApis) { + description("Test that valid call sequences succeed"); + + ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID)); + + auto returnStatus = mMediaCas->provision(hidl_string(PROVISION_STR)); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + hidl_vec hidlPvtData; + hidlPvtData.resize(256); + returnStatus = mMediaCas->setPrivateData(hidlPvtData); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + std::vector sessionId; + ASSERT_TRUE(openCasSession(&sessionId)); + returnStatus = mMediaCas->setSessionPrivateData(sessionId, hidlPvtData); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + std::vector streamSessionId; + ASSERT_TRUE(openCasSession(&streamSessionId)); + returnStatus = mMediaCas->setSessionPrivateData(streamSessionId, hidlPvtData); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + returnStatus = mDescramblerBase->setMediaCasSession(sessionId); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + returnStatus = mDescramblerBase->setMediaCasSession(streamSessionId); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + hidl_vec hidlNullPtr; + hidlNullPtr.setToExternal(static_cast(nullptr), 0); + returnStatus = mMediaCas->refreshEntitlements(3, hidlNullPtr); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + uint8_t refreshData[] = {0, 1, 2, 3}; + hidl_vec hidlRefreshData; + hidlRefreshData.setToExternal(static_cast(refreshData), sizeof(refreshData)); + returnStatus = mMediaCas->refreshEntitlements(10, hidlRefreshData); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + int32_t eventID = 1; + int32_t eventArg = 2; + mCasListener->testEventEcho(mMediaCas, eventID, eventArg, hidlNullPtr); + + eventID = 3; + eventArg = 4; + uint8_t eventData[] = {'e', 'v', 'e', 'n', 't', 'd', 'a', 't', 'a'}; + hidl_vec hidlEventData; + hidlEventData.setToExternal(static_cast(eventData), sizeof(eventData)); + mCasListener->testEventEcho(mMediaCas, eventID, eventArg, hidlEventData); + + uint8_t clearKeyEmmData[] = {'c', 'l', 'e', 'a', 'r', 'k', 'e', 'y', 'e', 'm', 'm'}; + hidl_vec hidlClearKeyEmm; + hidlClearKeyEmm.setToExternal(static_cast(clearKeyEmmData), sizeof(clearKeyEmmData)); + returnStatus = mMediaCas->processEmm(hidlClearKeyEmm); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + hidl_vec hidlEcm; + hidlEcm.setToExternal(const_cast(kEcmBinaryBuffer), sizeof(kEcmBinaryBuffer)); + returnStatus = mMediaCas->processEcm(sessionId, hidlEcm); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + returnStatus = mMediaCas->processEcm(streamSessionId, hidlEcm); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + sp descrambler; + descrambler = IDescrambler::castFrom(mDescramblerBase); + ASSERT_NE(descrambler, nullptr); + + Status descrambleStatus = Status::OK; + hidl_memory hidlDataMemory; + + ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &hidlDataMemory)); + EXPECT_EQ(Status::OK, descrambleStatus); + + android::sp outMemory = mapMemory(hidlDataMemory); + ASSERT_NE(nullptr, outMemory.get()); + uint8_t* opBuffer = static_cast(static_cast(outMemory->getPointer())); + + int compareResult = + memcmp(static_cast(opBuffer), static_cast(kOutRefBinaryBuffer), + sizeof(kOutRefBinaryBuffer)); + EXPECT_EQ(0, compareResult); +} + +TEST_F(MediaCasHidlTest, TestClearKeySessionClosedAfterRelease) { + description("Test that all sessions are closed after a MediaCas object is released"); + + ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID)); + + auto returnStatus = mMediaCas->provision(hidl_string(PROVISION_STR)); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + std::vector sessionId; + ASSERT_TRUE(openCasSession(&sessionId)); + std::vector streamSessionId; + ASSERT_TRUE(openCasSession(&streamSessionId)); + + returnStatus = mMediaCas->release(); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + returnStatus = mDescramblerBase->setMediaCasSession(sessionId); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus); + + returnStatus = mDescramblerBase->setMediaCasSession(streamSessionId); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus); +} + +TEST_F(MediaCasHidlTest, TestClearKeyErrors) { + description("Test that invalid call sequences fail with expected error codes"); + + ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID)); + + /* + * Test MediaCas error codes + */ + // Provision should fail with an invalid asset string + auto returnStatus = mMediaCas->provision(hidl_string("invalid asset string")); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::ERROR_CAS_NO_LICENSE, returnStatus); + + // Open a session, then close it so that it should become invalid + std::vector invalidSessionId; + ASSERT_TRUE(openCasSession(&invalidSessionId)); + returnStatus = mMediaCas->closeSession(invalidSessionId); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + // processEcm should fail with an invalid session id + hidl_vec hidlEcm; + hidlEcm.setToExternal(const_cast(kEcmBinaryBuffer), sizeof(kEcmBinaryBuffer)); + returnStatus = mMediaCas->processEcm(invalidSessionId, hidlEcm); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus); + + std::vector sessionId; + ASSERT_TRUE(openCasSession(&sessionId)); + + // processEcm should fail without provisioning + hidlEcm.setToExternal(const_cast(kEcmBinaryBuffer), sizeof(kEcmBinaryBuffer)); + returnStatus = mMediaCas->processEcm(sessionId, hidlEcm); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::ERROR_CAS_NOT_PROVISIONED, returnStatus); + + returnStatus = mMediaCas->provision(hidl_string(PROVISION_STR)); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + // processEcm should fail with ecm buffer that's too short + hidlEcm.setToExternal(const_cast(kEcmBinaryBuffer), 8); + returnStatus = mMediaCas->processEcm(sessionId, hidlEcm); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::BAD_VALUE, returnStatus); + + // processEcm should fail with ecm with bad descriptor count + uint8_t badDescriptor[sizeof(kEcmBinaryBuffer)]; + memcpy(badDescriptor, kEcmBinaryBuffer, sizeof(kEcmBinaryBuffer)); + badDescriptor[17] = 0x03; // change the descriptor count field to 3 (invalid) + hidlEcm.setToExternal(static_cast(badDescriptor), sizeof(badDescriptor)); + returnStatus = mMediaCas->processEcm(sessionId, hidlEcm); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::ERROR_CAS_UNKNOWN, returnStatus); + + /* + * Test MediaDescrambler error codes + */ + // setMediaCasSession should fail with an invalid session id + returnStatus = mDescramblerBase->setMediaCasSession(invalidSessionId); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus); + + // descramble should fail without a valid session + sp descrambler; + descrambler = IDescrambler::castFrom(mDescramblerBase); + ASSERT_NE(descrambler, nullptr); + + Status descrambleStatus = Status::OK; + hidl_memory hidlInMemory; + + ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &hidlInMemory)); + EXPECT_EQ(Status::ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED, descrambleStatus); + + // Now set a valid session, should still fail because no valid ecm is processed + returnStatus = mDescramblerBase->setMediaCasSession(sessionId); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &hidlInMemory)); + EXPECT_EQ(Status::ERROR_CAS_DECRYPT, descrambleStatus); +} + } // anonymous namespace int main(int argc, char** argv) { From 38cfeee30c4b6ff8d8feed57e721b5d0c0fdf4de Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Thu, 5 Oct 2017 13:30:14 -0700 Subject: [PATCH 254/265] Add neuralnetworks HAL to the current.txt Bug: 63905942 Test: None Change-Id: I7c247381e8fd97b91d11531d3db595408d8f1b74 --- current.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/current.txt b/current.txt index 52fbfd1527..1c67bc0b13 100644 --- a/current.txt +++ b/current.txt @@ -246,5 +246,10 @@ a432d6d9200248dc2126827bcd6cdea31dd65eff39b939f64585d27d915a5857 android.hardwar 619600109232ed64b827c8a11beed8070b1827ae464547d7aa146cf0473b4bca android.hardware.cas.native@1.0::IDescrambler 0a159f81359cd4f71bbe00972ee8403ea79351fb7c0cd48be72ebb3e424dbaef android.hardware.radio@1.0::types 09342041e17c429fce0034b9096d17849122111436a5f0053e7e59500e1cb89c android.hardware.media.omx@1.0::IOmxStore +246a56d37d57a47224562c9d077b4a2886ce6242b9311bd98a17325944c280d7 android.hardware.neuralnetworks@1.0::types +93eb3757ceaf21590fa4cd1d4a7dfe3b3794af5396100a6d25630879352abce9 android.hardware.neuralnetworks@1.0::IDevice +f66f9a38541bf92001d3adcce678cd7e3da2262124befb460b1c9aea9492813b android.hardware.neuralnetworks@1.0::IExecutionCallback +953607822954435874f4b81686440a604e2a88cdd2d9164c6293f3d5772510d7 android.hardware.neuralnetworks@1.0::IPreparedModel +73e03573494ba96f0e711ab7f1956c5b2d54c3da690cd7ecf4d6d0f287447730 android.hardware.neuralnetworks@1.0::IPreparedModelCallback f4945e397b5dea41bb64518dfde59be71245d8a125fd1e0acffeb57ac7b08fed android.hardware.thermal@1.1::IThermal c8bc853546dd55584611def2a9fa1d99f657e3366c976d2f60fe6b8aa6d2cb87 android.hardware.thermal@1.1::IThermalCallback From 926a8e7440a0c85d39dbf7143bfe03964363ddec Mon Sep 17 00:00:00 2001 From: Iris Chang Date: Thu, 14 Sep 2017 15:23:18 +0800 Subject: [PATCH 255/265] VTS: fix VtsHalKeymasterV3_0Target issue Failed cases: AttestationTest.RsaAttestation AttestationTest.EcAttestation Analysis: The verify_attestation_record() in Keymaster_hidl_hal_test.cpp calls parse_attestation_record() to set the value of att_challenge. It fails to compare att_challenge with challenge by memcmp. Because setToExternal() method uses buffer pointer to local variable (record), not use memcpy to copy into itself buffer in parse_attestation_record(). When it leaves the parse_attestation_record(), we will get the att_challenge which is null buffer to compare with challenge incorrectly. Fix: use memcpy to copy the buffer. Bug: 65039571 Test: build passed. VtsHalKeymasterV3_0Target -> PASSED: 106, FAILED: 0. Change-Id: I700a9242cc9a5f4cb196b62860823601e4088531 Merged-In: I700a9242cc9a5f4cb196b62860823601e4088531 (cherry picked from 54ca32a130a0450b444848046199d62876b55301) --- keymaster/3.0/vts/functional/attestation_record.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/keymaster/3.0/vts/functional/attestation_record.cpp b/keymaster/3.0/vts/functional/attestation_record.cpp index 5d96fff803..a428989de2 100644 --- a/keymaster/3.0/vts/functional/attestation_record.cpp +++ b/keymaster/3.0/vts/functional/attestation_record.cpp @@ -274,10 +274,12 @@ ErrorCode parse_attestation_record(const uint8_t* asn1_key_desc, size_t asn1_key *keymaster_security_level = static_cast(ASN1_ENUMERATED_get(record->keymaster_security_level)); - attestation_challenge->setToExternal(record->attestation_challenge->data, - record->attestation_challenge->length); - - unique_id->setToExternal(record->unique_id->data, record->unique_id->length); + auto& chall = record->attestation_challenge; + attestation_challenge->resize(chall->length); + memcpy(attestation_challenge->data(), chall->data, chall->length); + auto& uid = record->unique_id; + unique_id->resize(uid->length); + memcpy(unique_id->data(), uid->data, uid->length); ErrorCode error = extract_auth_list(record->software_enforced, software_enforced); if (error != ErrorCode::OK) return error; From 6d176aa77d6ad36174de843f9de4e979807566ce Mon Sep 17 00:00:00 2001 From: Suresh Sivaraman Date: Wed, 4 Oct 2017 14:37:36 +0530 Subject: [PATCH 256/265] Added VTS tests for requiresSecureDecoderComponent and release API Bug: 63914034 Bug: 65593293 Test: Build & test vts: > make vts -j64 > vts-tradefed run vts -m VtsHalCasV1_0Target Change-Id: I465735768239f2d53427a18e5ad1fa0069f6e35c --- .../vts/functional/VtsHalCasV1_0TargetTest.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp b/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp index 062ee2038e..8a19e2c08c 100644 --- a/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp +++ b/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp @@ -456,6 +456,8 @@ TEST_F(MediaCasHidlTest, TestClearKeyApis) { EXPECT_TRUE(returnStatus.isOk()); EXPECT_EQ(Status::OK, returnStatus); + EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("video/avc")); + sp descrambler; descrambler = IDescrambler::castFrom(mDescramblerBase); ASSERT_NE(descrambler, nullptr); @@ -474,6 +476,14 @@ TEST_F(MediaCasHidlTest, TestClearKeyApis) { memcmp(static_cast(opBuffer), static_cast(kOutRefBinaryBuffer), sizeof(kOutRefBinaryBuffer)); EXPECT_EQ(0, compareResult); + + returnStatus = mDescramblerBase->release(); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); + + returnStatus = mMediaCas->release(); + EXPECT_TRUE(returnStatus.isOk()); + EXPECT_EQ(Status::OK, returnStatus); } TEST_F(MediaCasHidlTest, TestClearKeySessionClosedAfterRelease) { @@ -584,6 +594,12 @@ TEST_F(MediaCasHidlTest, TestClearKeyErrors) { ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &hidlInMemory)); EXPECT_EQ(Status::ERROR_CAS_DECRYPT, descrambleStatus); + + // Verify that requiresSecureDecoderComponent handles empty mime + EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("")); + + // Verify that requiresSecureDecoderComponent handles invalid mime + EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("bad")); } } // anonymous namespace From 5bf4edfb9fb7b1e0893609058dcfc8ff67be17cb Mon Sep 17 00:00:00 2001 From: "I-Jui (Ray) Sung" Date: Fri, 6 Oct 2017 13:22:39 -0700 Subject: [PATCH 257/265] Refactor test harness for generated VTS tests Address comments in ag/2926388 Test: VtsHalNeuralnetworksV1_0TargetTest on Angler with sample driver Bug: 67597726 Change-Id: Ie3118dcbfb11c25dbc84d2becdefbbae868ff28f --- .../1.0/vts/functional/GeneratedTestHarness.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp index 735528b951..d740b5f53c 100644 --- a/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.0/vts/functional/GeneratedTestHarness.cpp @@ -46,11 +46,11 @@ using ::generated_tests::Int32Operands; using ::generated_tests::Quant8Operands; using ::generated_tests::compare; -template +template void copy_back_(MixedTyped* dst, const std::vector& ra, char* src) { MixedTyped& test = *dst; - for_each(test, [&ra, src](int index, std::vector& m) { - ASSERT_EQ(m.size(), ra[index].location.length / sizeof(ty)); + for_each(test, [&ra, src](int index, std::vector& m) { + ASSERT_EQ(m.size(), ra[index].location.length / sizeof(T)); char* begin = src + ra[index].location.offset; memcpy(m.data(), begin, ra[index].location.length); }); @@ -213,10 +213,8 @@ void Execute(const sp& device, std::function create_model, copy_back(&test, outputs_info, outputPtr); outputMemory->commit(); // Filter out don't cares - MixedTyped filtered_golden; - MixedTyped filtered_test; - filter(golden, &filtered_golden, is_ignored); - filter(test, &filtered_test, is_ignored); + MixedTyped filtered_golden = filter(golden, is_ignored); + MixedTyped filtered_test = filter(test, is_ignored); // We want "close-enough" results for float compare(filtered_golden, filtered_test); From 46cba442d25e16cce4d5f009f4700a88d53636b1 Mon Sep 17 00:00:00 2001 From: Kevin Rocard Date: Thu, 5 Oct 2017 18:47:02 -0700 Subject: [PATCH 258/265] Legacy wrapper: Use arbitrary limit on buffer size The legacy HAL wrapper prepareForWrite and prepareForRead used to return INVALID_ARGUMENTS if the computed buffer size just under SIZE_MAX. This meant that the limitation depended on the architecture (32 vs 64 bit size_t). This caused VTS test failure on 64 bits. Instead of dynamically calculating an arbitrary max size, choose a fixed one. This max buffer size has been chosen at 1GiB. It should be enough for the foreseeable future and not too close from the 4GiB max on 32 bit. Test: vts-tradefed run commandAndExit vts --module VtsHalAudioV2_0Target Bug: 67030516 Change-Id: I4cc3efda9bb66e6dae8b4e6785f52d9e51440aee Signed-off-by: Kevin Rocard --- audio/2.0/default/Stream.h | 7 +++++++ audio/2.0/default/StreamIn.cpp | 12 ++++-------- audio/2.0/default/StreamOut.cpp | 11 +++-------- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/audio/2.0/default/Stream.h b/audio/2.0/default/Stream.h index 82f05a77b4..e29af53184 100644 --- a/audio/2.0/default/Stream.h +++ b/audio/2.0/default/Stream.h @@ -49,6 +49,13 @@ using ::android::sp; struct Stream : public IStream, public ParametersUtil { explicit Stream(audio_stream_t* stream); + /** 1GiB is the maximum buffer size the HAL client is allowed to request. + * This value has been chosen to be under SIZE_MAX and still big enough + * for all audio use case. + * Keep private for 2.0, put in .hal in 2.1 + */ + static constexpr uint32_t MAX_BUFFER_SIZE = 2 << 30 /* == 1GiB */; + // Methods from ::android::hardware::audio::V2_0::IStream follow. Return getFrameSize() override; Return getFrameCount() override; diff --git a/audio/2.0/default/StreamIn.cpp b/audio/2.0/default/StreamIn.cpp index b81cbb924f..9c933a9201 100644 --- a/audio/2.0/default/StreamIn.cpp +++ b/audio/2.0/default/StreamIn.cpp @@ -347,14 +347,10 @@ Return StreamIn::prepareForReading(uint32_t frameSize, sendError(Result::INVALID_ARGUMENTS); return Void(); } - // A message queue asserts if it can not handle the requested buffer, - // thus the client has to guess the maximum size it can handle - // Choose an arbitrary margin for the overhead of a message queue - size_t metadataOverhead = 100000; - if (frameSize > - (std::numeric_limits::max() - metadataOverhead) / framesCount) { - ALOGE("Buffer too big: %u*%u bytes can not fit in a message queue", - frameSize, framesCount); + + if (frameSize > Stream::MAX_BUFFER_SIZE / framesCount) { + ALOGE("Buffer too big: %u*%u bytes > MAX_BUFFER_SIZE (%u)", frameSize, framesCount, + Stream::MAX_BUFFER_SIZE); sendError(Result::INVALID_ARGUMENTS); return Void(); } diff --git a/audio/2.0/default/StreamOut.cpp b/audio/2.0/default/StreamOut.cpp index 290d0b103c..22dcd0c994 100644 --- a/audio/2.0/default/StreamOut.cpp +++ b/audio/2.0/default/StreamOut.cpp @@ -323,14 +323,9 @@ Return StreamOut::prepareForWriting(uint32_t frameSize, sendError(Result::INVALID_ARGUMENTS); return Void(); } - // A message queue asserts if it can not handle the requested buffer, - // thus the client has to guess the maximum size it can handle - size_t metadataOverhead = - 100000; // Arbitrary margin for the overhead of a message queue - if (frameSize > - (std::numeric_limits::max() - metadataOverhead) / framesCount) { - ALOGE("Buffer too big: %u*%u bytes can not fit in a message queue", - frameSize, framesCount); + if (frameSize > Stream::MAX_BUFFER_SIZE / framesCount) { + ALOGE("Buffer too big: %u*%u bytes > MAX_BUFFER_SIZE (%u)", frameSize, framesCount, + Stream::MAX_BUFFER_SIZE); sendError(Result::INVALID_ARGUMENTS); return Void(); } From 704d5861a70cfe8c386980b5ea4649024db3f658 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Tue, 10 Oct 2017 13:03:18 -0700 Subject: [PATCH 259/265] cas-vts: use MemoryDealer to allocate shared memory cas hal can't (and doesn't need to) use hidl_memory allocated by hidl allocator. All real clients (MediaDescrambler jni, ACodec) are using MemoryDealer-allocated ashmem only. Modify the test to cover these cases. bug: 67603039 test: > make vts -j64 > vts-tradefed run vts -m VtsHalCasV1_0Target Change-Id: Ib9563abc1a14c34781a28d15c7766c6c160d288a --- cas/1.0/vts/functional/Android.bp | 3 + .../functional/VtsHalCasV1_0TargetTest.cpp | 69 +++++++++++-------- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/cas/1.0/vts/functional/Android.bp b/cas/1.0/vts/functional/Android.bp index 872bb2c55a..e1e09e9ce8 100644 --- a/cas/1.0/vts/functional/Android.bp +++ b/cas/1.0/vts/functional/Android.bp @@ -25,5 +25,8 @@ cc_test { "android.hidl.memory@1.0", "libhidlmemory", ], + shared_libs: [ + "libbinder", + ], } diff --git a/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp b/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp index 062ee2038e..4a6ccd7645 100644 --- a/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp +++ b/cas/1.0/vts/functional/VtsHalCasV1_0TargetTest.cpp @@ -25,12 +25,10 @@ #include #include #include -#include -#include +#include #include #include #include -#include #include #include @@ -69,9 +67,9 @@ using android::hardware::hidl_handle; using android::hardware::hidl_memory; using android::hardware::Return; using android::hardware::cas::V1_0::Status; -using android::hidl::allocator::V1_0::IAllocator; -using android::hidl::memory::V1_0::IMemory; -using android::hidl::memory::V1_0::IMapper; +using android::IMemory; +using android::IMemoryHeap; +using android::MemoryDealer; using android::Mutex; using android::sp; @@ -230,7 +228,7 @@ class MediaCasHidlTest : public ::testing::VtsHalHidlTargetTestBase { ::testing::AssertionResult openCasSession(std::vector* sessionId); ::testing::AssertionResult descrambleTestInputBuffer(const sp& descrambler, Status* descrambleStatus, - hidl_memory* hidlInMemory); + sp* hidlInMemory); }; ::testing::AssertionResult MediaCasHidlTest::createCasPlugin(int32_t caSystemId) { @@ -271,34 +269,48 @@ class MediaCasHidlTest : public ::testing::VtsHalHidlTargetTestBase { } ::testing::AssertionResult MediaCasHidlTest::descrambleTestInputBuffer( - const sp& descrambler, Status* descrambleStatus, hidl_memory* hidlInMemory) { + const sp& descrambler, Status* descrambleStatus, sp* inMemory) { hidl_vec hidlSubSamples; hidlSubSamples.setToExternal(const_cast(kSubSamples), (sizeof(kSubSamples) / sizeof(SubSample)), false /*own*/); - sp allocator = IAllocator::getService("ashmem"); - if (nullptr == allocator.get()) { + + sp dealer = new MemoryDealer(sizeof(kInBinaryBuffer), "vts-cas"); + if (nullptr == dealer.get()) { + ALOGE("couldn't get MemoryDealer!"); return ::testing::AssertionFailure(); } - bool allocateStatus; - auto returnStatus = - allocator->allocate(sizeof(kInBinaryBuffer), [&](bool status, hidl_memory const& mem) { - allocateStatus = status; - *hidlInMemory = mem; - }); - if (!returnStatus.isOk() || !allocateStatus) { + sp mem = dealer->allocate(sizeof(kInBinaryBuffer)); + if (nullptr == mem.get()) { + ALOGE("couldn't allocate IMemory!"); return ::testing::AssertionFailure(); } - android::sp inMemory = mapMemory(*hidlInMemory); - if (nullptr == inMemory.get()) { + *inMemory = mem; + + // build hidl_memory from memory heap + ssize_t offset; + size_t size; + sp heap = mem->getMemory(&offset, &size); + if (nullptr == heap.get()) { + ALOGE("couldn't get memory heap!"); return ::testing::AssertionFailure(); } - uint8_t* ipBuffer = static_cast(static_cast(inMemory->getPointer())); + native_handle_t* nativeHandle = native_handle_create(1, 0); + if (!nativeHandle) { + ALOGE("failed to create native handle!"); + return ::testing::AssertionFailure(); + } + nativeHandle->data[0] = heap->getHeapID(); + + uint8_t* ipBuffer = static_cast(static_cast(mem->pointer())); memcpy(ipBuffer, kInBinaryBuffer, sizeof(kInBinaryBuffer)); SharedBuffer srcBuffer = { - .heapBase = *hidlInMemory, .offset = (uint64_t)0, .size = sizeof(kInBinaryBuffer)}; + .heapBase = hidl_memory("ashmem", hidl_handle(nativeHandle), heap->getSize()), + .offset = (uint64_t) offset, + .size = (uint64_t) size + }; DestinationBuffer dstBuffer; dstBuffer.type = BufferType::SHARED_MEMORY; @@ -461,14 +473,13 @@ TEST_F(MediaCasHidlTest, TestClearKeyApis) { ASSERT_NE(descrambler, nullptr); Status descrambleStatus = Status::OK; - hidl_memory hidlDataMemory; + sp dataMemory; - ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &hidlDataMemory)); + ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); EXPECT_EQ(Status::OK, descrambleStatus); - android::sp outMemory = mapMemory(hidlDataMemory); - ASSERT_NE(nullptr, outMemory.get()); - uint8_t* opBuffer = static_cast(static_cast(outMemory->getPointer())); + ASSERT_NE(nullptr, dataMemory.get()); + uint8_t* opBuffer = static_cast(static_cast(dataMemory->pointer())); int compareResult = memcmp(static_cast(opBuffer), static_cast(kOutRefBinaryBuffer), @@ -572,9 +583,9 @@ TEST_F(MediaCasHidlTest, TestClearKeyErrors) { ASSERT_NE(descrambler, nullptr); Status descrambleStatus = Status::OK; - hidl_memory hidlInMemory; + sp dataMemory; - ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &hidlInMemory)); + ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); EXPECT_EQ(Status::ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED, descrambleStatus); // Now set a valid session, should still fail because no valid ecm is processed @@ -582,7 +593,7 @@ TEST_F(MediaCasHidlTest, TestClearKeyErrors) { EXPECT_TRUE(returnStatus.isOk()); EXPECT_EQ(Status::OK, returnStatus); - ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &hidlInMemory)); + ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); EXPECT_EQ(Status::ERROR_CAS_DECRYPT, descrambleStatus); } From ce607879baf84d5b3a8df95a609ad06204c56711 Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Tue, 10 Oct 2017 10:31:07 -0700 Subject: [PATCH 260/265] Audio VTS: Allow 4GB buffer prepareToWrite/Read to succeed on 64 bits Because on oc-dev the runtime image can not be modified and that this is not a bug but a test and implementation misalignment, allow prepareForWrite/Read(UINT32_MAX, UINT32_MAX) to succeed on oc-dev. MR1 will have a better fix where the HAL will always reject > 1GiB buffers independently of the architecture. Test: vts-tradefed run commandAndExit vts --module VtsHalAudioV2_0Target Bug: 67030516 Change-Id: I10a5ee3868c67c45ed5297d9c5c89129d762c7cd Merged-In: I4cc3efda9bb66e6dae8b4e6785f52d9e51440aee Signed-off-by: Kevin Rocard --- .../functional/AudioPrimaryHidlHalTest.cpp | 48 ++++++++++++------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/audio/2.0/vts/functional/AudioPrimaryHidlHalTest.cpp b/audio/2.0/vts/functional/AudioPrimaryHidlHalTest.cpp index 8ac8a297e6..3ee44f33ca 100644 --- a/audio/2.0/vts/functional/AudioPrimaryHidlHalTest.cpp +++ b/audio/2.0/vts/functional/AudioPrimaryHidlHalTest.cpp @@ -1057,27 +1057,34 @@ TEST_P(InputStreamTest, SetGain) { "InputStream::setGain"); } -static void testPrepareForReading(IStreamIn* stream, uint32_t frameSize, - uint32_t framesCount) { +static void testPrepareForReading(IStreamIn* stream, uint32_t frameSize, uint32_t framesCount, + bool allowSucceed) { Result res; - // Ignore output parameters as the call should fail + // Ignore output parameters. ASSERT_OK(stream->prepareForReading( frameSize, framesCount, [&res](auto r, auto&, auto&, auto&, auto&) { res = r; })); - EXPECT_RESULT(Result::INVALID_ARGUMENTS, res); + if (allowSucceed) { + auto status = { + Result::INVALID_ARGUMENTS, Result::OK, + }; + EXPECT_RESULT(status, res); + } else { + EXPECT_RESULT(Result::INVALID_ARGUMENTS, res); + }; } TEST_P(InputStreamTest, PrepareForReadingWithZeroBuffer) { doc::test( "Preparing a stream for reading with a 0 sized buffer should fail"); - testPrepareForReading(stream.get(), 0, 0); + testPrepareForReading(stream.get(), 0, 0, false /*allowSucceed*/); } TEST_P(InputStreamTest, PrepareForReadingWithHugeBuffer) { doc::test( "Preparing a stream for reading with a 2^32 sized buffer should fail"); - testPrepareForReading(stream.get(), 1, - std::numeric_limits::max()); + testPrepareForReading(stream.get(), 1, std::numeric_limits::max(), + false /*allowSucceed*/); } TEST_P(InputStreamTest, PrepareForReadingCheckOverflow) { @@ -1085,7 +1092,8 @@ TEST_P(InputStreamTest, PrepareForReadingCheckOverflow) { "Preparing a stream for reading with a overflowing sized buffer should " "fail"); auto uintMax = std::numeric_limits::max(); - testPrepareForReading(stream.get(), uintMax, uintMax); + // In O, the test fails for 32-bit HAL, and succeeds for 64-bit HAL. + testPrepareForReading(stream.get(), uintMax, uintMax, true /*allowSucceed*/); } TEST_P(InputStreamTest, GetInputFramesLost) { @@ -1125,27 +1133,34 @@ TEST_P(OutputStreamTest, setVolume) { "setVolume"); } -static void testPrepareForWriting(IStreamOut* stream, uint32_t frameSize, - uint32_t framesCount) { +static void testPrepareForWriting(IStreamOut* stream, uint32_t frameSize, uint32_t framesCount, + bool allowSucceed) { Result res; - // Ignore output parameters as the call should fail + // Ignore output parameters. ASSERT_OK(stream->prepareForWriting( frameSize, framesCount, [&res](auto r, auto&, auto&, auto&, auto&) { res = r; })); - EXPECT_RESULT(Result::INVALID_ARGUMENTS, res); + if (allowSucceed) { + auto status = { + Result::INVALID_ARGUMENTS, Result::OK, + }; + EXPECT_RESULT(status, res); + } else { + EXPECT_RESULT(Result::INVALID_ARGUMENTS, res); + }; } TEST_P(OutputStreamTest, PrepareForWriteWithZeroBuffer) { doc::test( "Preparing a stream for writing with a 0 sized buffer should fail"); - testPrepareForWriting(stream.get(), 0, 0); + testPrepareForWriting(stream.get(), 0, 0, false /*allowSucceed*/); } TEST_P(OutputStreamTest, PrepareForWriteWithHugeBuffer) { doc::test( "Preparing a stream for writing with a 2^32 sized buffer should fail"); - testPrepareForWriting(stream.get(), 1, - std::numeric_limits::max()); + testPrepareForWriting(stream.get(), 1, std::numeric_limits::max(), + false /*allowSucceed*/); } TEST_P(OutputStreamTest, PrepareForWritingCheckOverflow) { @@ -1153,7 +1168,8 @@ TEST_P(OutputStreamTest, PrepareForWritingCheckOverflow) { "Preparing a stream for writing with a overflowing sized buffer should " "fail"); auto uintMax = std::numeric_limits::max(); - testPrepareForWriting(stream.get(), uintMax, uintMax); + // In O, the test fails for 32-bit HAL, and succeeds for 64-bit HAL. + testPrepareForWriting(stream.get(), uintMax, uintMax, true /*allowSucceed*/); } struct Capability { From 3c01fef56c7f4f6b5e408622c06c0b790c57c90c Mon Sep 17 00:00:00 2001 From: Peng Xu Date: Tue, 10 Oct 2017 18:19:18 -0700 Subject: [PATCH 261/265] Enlarge buffer size for direct report testing This change is part of "Sensor direct report test - gralloc support". Bug: 67439052 Test: vts test no longer fail on sailfish device Change-Id: Id67a2a181b2d8847e2b1b9dbe46f5186e97e8563 Merged-In: Ibe1d076c24dc2cfe61dfd19aa5055c9075aa9e14 --- sensors/1.0/vts/functional/VtsHalSensorsV1_0TargetTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sensors/1.0/vts/functional/VtsHalSensorsV1_0TargetTest.cpp b/sensors/1.0/vts/functional/VtsHalSensorsV1_0TargetTest.cpp index a6f6852a83..e4736bcd0e 100644 --- a/sensors/1.0/vts/functional/VtsHalSensorsV1_0TargetTest.cpp +++ b/sensors/1.0/vts/functional/VtsHalSensorsV1_0TargetTest.cpp @@ -1224,7 +1224,7 @@ TEST_F(SensorsHidlTest, MagnetometerBatchingOperation) { void SensorsHidlTest::testDirectReportOperation( SensorType type, SharedMemType memType, RateLevel rate, const SensorEventsChecker &checker) { constexpr size_t kEventSize = static_cast(SensorsEventFormatOffset::TOTAL_LENGTH); - constexpr size_t kNEvent = 500; + constexpr size_t kNEvent = 4096; constexpr size_t kMemSize = kEventSize * kNEvent; constexpr float kNormalNominal = 50; From 15e945976b2d8a7047c2a8b87fd639c97423cf51 Mon Sep 17 00:00:00 2001 From: Erik Kline Date: Sat, 14 Oct 2017 18:29:09 +0900 Subject: [PATCH 262/265] tetheroffload VTS: fix stopOffload test conditions The tetheroffload HAL is somewhat...and over- and under-specified. A not unreasonable interpretation is that stopOffload() doesn't have return success unless offload was actually started (via a call to setUpstreamParameters()), and that after initOffload() and before setUpstreamParameters() not actual "offload" has been engaged. Precision in this matter is not required for the test case: OffloadControlHidlTestBase.AdditionalInitsWithoutStopReturnFalse But for the test case: OffloadControlHidlTestBase.AdditionalStopsWithInitReturnFalse we want to ensure the "matching" stopOffload call succeeds. For this test we add in a call to setUpstreamParameters() for good measure. Test: as follows prompt$ make vts -j30 BUILD_GOOGLE_VTS=true && \ vts-tradefed run commandAndExit vts \ --skip-all-system-status-check \ --primary-abi-only \ --skip-preconditions \ --module VtsHalTetherOffloadControlV1_0Target \ -l DEBUG Observed: 10-16 19:17:17 I/ResultReporter: Invocation finished in 1m 2s. PASSED: 38, FAILED: 0, MODULES: 1 of 1 Bug: 65270149 Bug: 65612227 Bug: 65612332 Change-Id: I924d41f5a20f07707e3d6991cb59d9c6b2b02339 --- .../VtsHalTetheroffloadControlV1_0TargetTest.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tetheroffload/control/1.0/vts/functional/VtsHalTetheroffloadControlV1_0TargetTest.cpp b/tetheroffload/control/1.0/vts/functional/VtsHalTetheroffloadControlV1_0TargetTest.cpp index 52dd026a87..c009af5d91 100644 --- a/tetheroffload/control/1.0/vts/functional/VtsHalTetheroffloadControlV1_0TargetTest.cpp +++ b/tetheroffload/control/1.0/vts/functional/VtsHalTetheroffloadControlV1_0TargetTest.cpp @@ -231,7 +231,6 @@ TEST_F(OffloadControlHidlTestBase, AdditionalInitsWithoutStopReturnFalse) { initOffload(false); initOffload(false); initOffload(false); - stopOffload(ExpectBoolean::True); // balance out initOffload(true) } // Check that calling stopOffload() without first having called initOffload() returns false. @@ -244,6 +243,14 @@ TEST_F(OffloadControlHidlTestBase, MultipleStopsWithoutInitReturnFalse) { // Check that calling stopOffload() after a complete init/stop cycle returns false. TEST_F(OffloadControlHidlTestBase, AdditionalStopsWithInitReturnFalse) { initOffload(true); + // Call setUpstreamParameters() so that "offload" can be reasonably said + // to be both requested and operational. + const hidl_string v4Addr("192.0.0.2"); + const hidl_string v4Gw("192.0.0.1"); + const vector v6Gws{hidl_string("fe80::db8:1"), hidl_string("fe80::db8:2")}; + const Return upstream = + control->setUpstreamParameters("rmnet_data0", v4Addr, v4Gw, v6Gws, ASSERT_TRUE_CALLBACK); + EXPECT_TRUE(upstream.isOk()); stopOffload(ExpectBoolean::True); // balance out initOffload(true) stopOffload(ExpectBoolean::False); stopOffload(ExpectBoolean::False); From a0698429dd47e2f029866765c6980bc8720a7acb Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Wed, 11 Oct 2017 15:38:25 +0530 Subject: [PATCH 263/265] bug fix: during fatal fails bypass freeNode() calls If test application undergoes a fatal failure bypass all the omx api calls till the application safely returns. Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Host \ -l INFO Bug: 63796949 Change-Id: If5a33672a31665db913e53c6f8ba8bea6cfd3ebd --- .../functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp | 4 ++++ .../functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp | 4 ++++ .../component/VtsHalMediaOmxV1_0TargetComponentTest.cpp | 4 ++++ .../functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 4 ++++ .../functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp index 9e185f2799..38cdcd6508 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp @@ -230,6 +230,10 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { virtual void TearDown() override { if (omxNode != nullptr) { + // If you have encountered a fatal failure, it is possible that + // freeNode() will not go through. Instead of hanging the app. + // let it pass through and report errors + if (::testing::Test::HasFatalFailure()) return; EXPECT_TRUE((omxNode->freeNode()).isOk()); omxNode = nullptr; } diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp index d872444933..953dc7507b 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp @@ -216,6 +216,10 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { virtual void TearDown() override { if (omxNode != nullptr) { + // If you have encountered a fatal failure, it is possible that + // freeNode() will not go through. Instead of hanging the app. + // let it pass through and report errors + if (::testing::Test::HasFatalFailure()) return; EXPECT_TRUE((omxNode->freeNode()).isOk()); omxNode = nullptr; } diff --git a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp index 401e54ab9f..d66136d212 100644 --- a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp +++ b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp @@ -191,6 +191,10 @@ class ComponentHidlTest : public ::testing::VtsHalHidlTargetTestBase { virtual void TearDown() override { if (omxNode != nullptr) { + // If you have encountered a fatal failure, it is possible that + // freeNode() will not go through. Instead of hanging the app. + // let it pass through and report errors + if (::testing::Test::HasFatalFailure()) return; EXPECT_TRUE((omxNode->freeNode()).isOk()); omxNode = nullptr; } diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index 667c2e1248..9b74a339c0 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -232,6 +232,10 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { virtual void TearDown() override { if (omxNode != nullptr) { + // If you have encountered a fatal failure, it is possible that + // freeNode() will not go through. Instead of hanging the app. + // let it pass through and report errors + if (::testing::Test::HasFatalFailure()) return; EXPECT_TRUE((omxNode->freeNode()).isOk()); omxNode = nullptr; } diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp index 743ff787a2..099658f8ae 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp @@ -243,6 +243,10 @@ class VideoEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { virtual void TearDown() override { if (omxNode != nullptr) { + // If you have encountered a fatal failure, it is possible that + // freeNode() will not go through. Instead of hanging the app. + // let it pass through and report errors + if (::testing::Test::HasFatalFailure()) return; EXPECT_TRUE((omxNode->freeNode()).isOk()); omxNode = nullptr; } From bc1c9295a35abf6f0d1838b065a57c74d7fe96a2 Mon Sep 17 00:00:00 2001 From: sqian Date: Mon, 16 Oct 2017 14:12:40 -0700 Subject: [PATCH 264/265] Add REQUEST_NOT_SUPPORTED / SIM_ABSENT for vts tests Bug: 65230472 Test: run vts Change-Id: I1fab6f49f04a04a7f1cd3b613fe7049f927171d1 --- current.txt | 1 + radio/1.0/IRadioResponse.hal | 11 ++++++++++ .../1.0/vts/functional/radio_hidl_hal_ims.cpp | 5 +++-- .../vts/functional/radio_hidl_hal_misc.cpp | 21 +++++++++++++------ .../1.0/vts/functional/radio_hidl_hal_stk.cpp | 9 +++++--- 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/current.txt b/current.txt index 1c67bc0b13..db34c37bd9 100644 --- a/current.txt +++ b/current.txt @@ -227,6 +227,7 @@ c26473e2e4a00af43e28a0ddf9002e5062a7d0940429e5efb6e5513a8abcb75c android.hardwar b056e1defab4071584214584057d0bc73a613081bf1152590549649d4582c13c android.hardware.wifi@1.1::IWifiChip # ABI preserving changes to HALs during Android O MR1 (Final Set) +2d833aeed0cd1d59437aca210be590a953cf32bcb6683cd63d089762a643fb49 android.hardware.radio@1.0::IRadioResponse 05aa3de6130a9788fdb6f4d3cc57c3ea90f067e77a5e09d6a772ec7f6bca33d2 android.hardware.radio@1.1::IRadioResponse # HALs released in Android O MR1 (Final Set) diff --git a/radio/1.0/IRadioResponse.hal b/radio/1.0/IRadioResponse.hal index 94b304a198..27945cb07f 100644 --- a/radio/1.0/IRadioResponse.hal +++ b/radio/1.0/IRadioResponse.hal @@ -1190,6 +1190,7 @@ interface IRadioResponse { * RadioError:REQUEST_NOT_SUPPORTED * RadioError:NO_RESOURCES * RadioError:CANCELLED + * RadioError:SIM_ABSENT */ oneway setSuppServiceNotificationsResponse(RadioResponseInfo info); @@ -1295,6 +1296,7 @@ interface IRadioResponse { * RadioError:INVALID_ARGUMENTS * RadioError:MODEM_ERR * RadioError:REQUEST_NOT_SUPPORTED + * RadioError:SIM_ABSENT */ oneway sendEnvelopeResponse(RadioResponseInfo info, string commandResponse); @@ -1312,6 +1314,7 @@ interface IRadioResponse { * RadioError:CANCELLED * RadioError:INVALID_MODEM_STATE * RadioError:REQUEST_NOT_SUPPORTED + * RadioError:SIM_ABSENT */ oneway sendTerminalResponseToSimResponse(RadioResponseInfo info); @@ -1329,6 +1332,7 @@ interface IRadioResponse { * RadioError:NO_RESOURCES * RadioError:CANCELLED * RadioError:REQUEST_NOT_SUPPORTED + * RadioError:SIM_ABSENT */ oneway handleStkCallSetupRequestFromSimResponse(RadioResponseInfo info); @@ -1425,6 +1429,7 @@ interface IRadioResponse { * RadioError:REQUEST_NOT_SUPPORTED * RadioError:NO_RESOURCES * RadioError:CANCELLED + * RadioError:SIM_ABSENT */ oneway setLocationUpdatesResponse(RadioResponseInfo info); @@ -1459,6 +1464,7 @@ interface IRadioResponse { * RadioError:OPERATION_NOT_ALLOWED * RadioError:NO_RESOURCES * RadioError:CANCELLED + * RadioError:SIM_ABSENT */ oneway setCdmaRoamingPreferenceResponse(RadioResponseInfo info); @@ -1477,6 +1483,7 @@ interface IRadioResponse { * RadioError:REQUEST_NOT_SUPPORTED * RadioError:NO_RESOURCES * RadioError:CANCELLED + * RadioError:SIM_ABSENT */ oneway getCdmaRoamingPreferenceResponse(RadioResponseInfo info, CdmaRoamingType type); @@ -1801,6 +1808,7 @@ interface IRadioResponse { * RadioError:REQUEST_NOT_SUPPORTED * RadioError:NO_RESOURCES * RadioError:CANCELLED + * RadioError:SIM_ABSENT */ oneway getCDMASubscriptionResponse(RadioResponseInfo info, string mdn, string hSid, string hNid, string min, string prl); @@ -1896,6 +1904,7 @@ interface IRadioResponse { * RadioError:REQUEST_NOT_SUPPORTED * RadioError:NO_RESOURCES * RadioError:CANCELLED + * RadioError:SIM_ABSENT */ oneway exitEmergencyCallbackModeResponse(RadioResponseInfo info); @@ -1991,6 +2000,7 @@ interface IRadioResponse { * RadioError:NO_RESOURCES * RadioError:CANCELLED * RadioError:REQUEST_NOT_SUPPORTED + * RadioError:SIM_ABSENT */ oneway getCdmaSubscriptionSourceResponse(RadioResponseInfo info, CdmaSubscriptionSource source); @@ -2008,6 +2018,7 @@ interface IRadioResponse { * RadioError:INVALID_MODEM_STATE * RadioError:INVALID_ARGUMENTS * RadioError:REQUEST_NOT_SUPPORTED + * RadioError:SIM_ABSENT */ oneway requestIsimAuthenticationResponse(RadioResponseInfo info, string response); diff --git a/radio/1.0/vts/functional/radio_hidl_hal_ims.cpp b/radio/1.0/vts/functional/radio_hidl_hal_ims.cpp index c1834c5692..aa9d9871c9 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_ims.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_ims.cpp @@ -155,7 +155,8 @@ TEST_F(RadioHidlTest, setSuppServiceNotifications) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - EXPECT_EQ(RadioError::NONE, radioRsp->rspInfo.error); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -173,7 +174,7 @@ TEST_F(RadioHidlTest, requestIsimAuthentication) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(CheckGeneralError()); + ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } diff --git a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp index 795af86a0c..6158f1aab9 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp @@ -265,7 +265,8 @@ TEST_F(RadioHidlTest, setLocationUpdates) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -282,7 +283,8 @@ TEST_F(RadioHidlTest, setCdmaRoamingPreference) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || - radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED); + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -299,7 +301,8 @@ TEST_F(RadioHidlTest, getCdmaRoamingPreference) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::NONE || - radioRsp->rspInfo.error == RadioError::MODEM_ERR); + radioRsp->rspInfo.error == RadioError::MODEM_ERR || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -381,7 +384,9 @@ TEST_F(RadioHidlTest, getCDMASubscription) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -414,7 +419,9 @@ TEST_F(RadioHidlTest, exitEmergencyCallbackMode) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -430,7 +437,9 @@ TEST_F(RadioHidlTest, getCdmaSubscriptionSource) { EXPECT_EQ(serial, radioRsp->rspInfo.serial); if (cardStatus.cardState == CardState::ABSENT) { - ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE); + ASSERT_TRUE(radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::REQUEST_NOT_SUPPORTED || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } diff --git a/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp b/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp index da46e88857..611867adb3 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_stk.cpp @@ -38,7 +38,8 @@ TEST_F(RadioHidlTest, sendEnvelope) { ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || radioRsp->rspInfo.error == RadioError::NONE || - radioRsp->rspInfo.error == RadioError::MODEM_ERR); + radioRsp->rspInfo.error == RadioError::MODEM_ERR || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -61,7 +62,8 @@ TEST_F(RadioHidlTest, sendTerminalResponseToSim) { std::cout << static_cast(radioRsp->rspInfo.error) << std::endl; ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || - radioRsp->rspInfo.error == RadioError::NONE); + radioRsp->rspInfo.error == RadioError::NONE || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } @@ -81,7 +83,8 @@ TEST_F(RadioHidlTest, handleStkCallSetupRequestFromSim) { if (cardStatus.cardState == CardState::ABSENT) { ASSERT_TRUE(CheckGeneralError() || radioRsp->rspInfo.error == RadioError::NONE || radioRsp->rspInfo.error == RadioError::MODEM_ERR || - radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS); + radioRsp->rspInfo.error == RadioError::INVALID_ARGUMENTS || + radioRsp->rspInfo.error == RadioError::SIM_ABSENT); } } From 536818d17a25f7c8751bf3f437f9a00d3f5cfba5 Mon Sep 17 00:00:00 2001 From: Sanket Padawe Date: Sun, 3 Sep 2017 22:32:43 -0700 Subject: [PATCH 265/265] Fix VTS test which turns off radio. Since the purpose of most of the test cases in current VTS is to check if proper errors are returned and there is no crash seen in vendor code, updating setRadioPower test case to turn on the radio instead of turning off. We want to avoid test cases which turn off radio or leads to modem shut down as those test cases affect other tests. Test: VTS Change-Id: I4fb9f18884f7ef21162015a0032c4431444f7025 Merged-In: I4fb9f18884f7ef21162015a0032c4431444f7025 Bug: 65230472 (cherry picked from commit 9a721b808743069fc26d6cf226595e2823e347a6) --- radio/1.0/vts/functional/radio_hidl_hal_misc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp index 87e7a40a1e..a3ae1e3eac 100644 --- a/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp +++ b/radio/1.0/vts/functional/radio_hidl_hal_misc.cpp @@ -70,7 +70,7 @@ TEST_F(RadioHidlTest, getOperator) { TEST_F(RadioHidlTest, setRadioPower) { int serial = GetRandomSerialNumber(); - radio->setRadioPower(serial, 0); + radio->setRadioPower(serial, 1); EXPECT_EQ(std::cv_status::no_timeout, wait()); EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type); EXPECT_EQ(serial, radioRsp->rspInfo.serial);