Merge "Add default config for new VHAL properties in Android T." into tm-dev
diff --git a/automotive/evs/aidl/vts/VtsHalEvsTargetTest.cpp b/automotive/evs/aidl/vts/VtsHalEvsTargetTest.cpp
index c709d40..7fcac38 100644
--- a/automotive/evs/aidl/vts/VtsHalEvsTargetTest.cpp
+++ b/automotive/evs/aidl/vts/VtsHalEvsTargetTest.cpp
@@ -430,8 +430,8 @@
         mActiveCameras.push_back(pCam);
 
         // Set up a frame receiver object which will fire up its own thread
-        std::shared_ptr<FrameHandler> frameHandler =
-                std::make_shared<FrameHandler>(pCam, cam, nullptr, FrameHandler::eAutoReturn);
+        std::shared_ptr<FrameHandler> frameHandler = ndk::SharedRefBase::make<FrameHandler>(
+                pCam, cam, nullptr, FrameHandler::eAutoReturn);
         EXPECT_NE(frameHandler, nullptr);
 
         // Start the camera's video stream
@@ -529,8 +529,8 @@
         ASSERT_TRUE(pCam->setMaxFramesInFlight(kBuffersToHold).isOk());
 
         // Set up a frame receiver object which will fire up its own thread.
-        std::shared_ptr<FrameHandler> frameHandler =
-                std::make_shared<FrameHandler>(pCam, cam, nullptr, FrameHandler::eNoAutoReturn);
+        std::shared_ptr<FrameHandler> frameHandler = ndk::SharedRefBase::make<FrameHandler>(
+                pCam, cam, nullptr, FrameHandler::eNoAutoReturn);
         EXPECT_NE(frameHandler, nullptr);
 
         // Start the camera's video stream
@@ -619,8 +619,8 @@
         mActiveCameras.push_back(pCam);
 
         // Set up a frame receiver object which will fire up its own thread.
-        std::shared_ptr<FrameHandler> frameHandler =
-                std::make_shared<FrameHandler>(pCam, cam, pDisplay, FrameHandler::eAutoReturn);
+        std::shared_ptr<FrameHandler> frameHandler = ndk::SharedRefBase::make<FrameHandler>(
+                pCam, cam, pDisplay, FrameHandler::eAutoReturn);
         EXPECT_NE(frameHandler, nullptr);
 
         // Activate the display
@@ -697,10 +697,10 @@
         mActiveCameras.push_back(pCam1);
 
         // Set up per-client frame receiver objects which will fire up its own thread
-        std::shared_ptr<FrameHandler> frameHandler0 =
-                std::make_shared<FrameHandler>(pCam0, cam, nullptr, FrameHandler::eAutoReturn);
-        std::shared_ptr<FrameHandler> frameHandler1 =
-                std::make_shared<FrameHandler>(pCam1, cam, nullptr, FrameHandler::eAutoReturn);
+        std::shared_ptr<FrameHandler> frameHandler0 = ndk::SharedRefBase::make<FrameHandler>(
+                pCam0, cam, nullptr, FrameHandler::eAutoReturn);
+        std::shared_ptr<FrameHandler> frameHandler1 = ndk::SharedRefBase::make<FrameHandler>(
+                pCam1, cam, nullptr, FrameHandler::eAutoReturn);
         EXPECT_NE(frameHandler0, nullptr);
         EXPECT_NE(frameHandler1, nullptr);
 
@@ -803,8 +803,8 @@
         }
 
         // Set up per-client frame receiver objects which will fire up its own thread
-        std::shared_ptr<FrameHandler> frameHandler =
-                std::make_shared<FrameHandler>(pCam, cam, nullptr, FrameHandler::eAutoReturn);
+        std::shared_ptr<FrameHandler> frameHandler = ndk::SharedRefBase::make<FrameHandler>(
+                pCam, cam, nullptr, FrameHandler::eAutoReturn);
         EXPECT_NE(frameHandler, nullptr);
 
         // Start the camera's video stream
@@ -903,10 +903,11 @@
         mActiveCameras.push_back(pSecondaryCam);
 
         // Set up per-client frame receiver objects which will fire up its own thread
-        std::shared_ptr<FrameHandler> frameHandlerPrimary = std::make_shared<FrameHandler>(
+        std::shared_ptr<FrameHandler> frameHandlerPrimary = ndk::SharedRefBase::make<FrameHandler>(
                 pPrimaryCam, cam, nullptr, FrameHandler::eAutoReturn);
-        std::shared_ptr<FrameHandler> frameHandlerSecondary = std::make_shared<FrameHandler>(
-                pSecondaryCam, cam, nullptr, FrameHandler::eAutoReturn);
+        std::shared_ptr<FrameHandler> frameHandlerSecondary =
+                ndk::SharedRefBase::make<FrameHandler>(pSecondaryCam, cam, nullptr,
+                                                       FrameHandler::eAutoReturn);
         EXPECT_NE(frameHandlerPrimary, nullptr);
         EXPECT_NE(frameHandlerSecondary, nullptr);
 
@@ -1075,10 +1076,11 @@
         }
 
         // Set up per-client frame receiver objects which will fire up its own thread
-        std::shared_ptr<FrameHandler> frameHandlerPrimary = std::make_shared<FrameHandler>(
+        std::shared_ptr<FrameHandler> frameHandlerPrimary = ndk::SharedRefBase::make<FrameHandler>(
                 pPrimaryCam, cam, nullptr, FrameHandler::eAutoReturn);
-        std::shared_ptr<FrameHandler> frameHandlerSecondary = std::make_shared<FrameHandler>(
-                pSecondaryCam, cam, nullptr, FrameHandler::eAutoReturn);
+        std::shared_ptr<FrameHandler> frameHandlerSecondary =
+                ndk::SharedRefBase::make<FrameHandler>(pSecondaryCam, cam, nullptr,
+                                                       FrameHandler::eAutoReturn);
         EXPECT_NE(frameHandlerPrimary, nullptr);
         EXPECT_NE(frameHandlerSecondary, nullptr);
 
@@ -1418,10 +1420,10 @@
         }
 
         // Set up a frame receiver object which will fire up its own thread.
-        std::shared_ptr<FrameHandler> frameHandler0 =
-                std::make_shared<FrameHandler>(pCam0, cam, nullptr, FrameHandler::eAutoReturn);
-        std::shared_ptr<FrameHandler> frameHandler1 =
-                std::make_shared<FrameHandler>(pCam1, cam, nullptr, FrameHandler::eAutoReturn);
+        std::shared_ptr<FrameHandler> frameHandler0 = ndk::SharedRefBase::make<FrameHandler>(
+                pCam0, cam, nullptr, FrameHandler::eAutoReturn);
+        std::shared_ptr<FrameHandler> frameHandler1 = ndk::SharedRefBase::make<FrameHandler>(
+                pCam1, cam, nullptr, FrameHandler::eAutoReturn);
         EXPECT_NE(frameHandler0, nullptr);
         EXPECT_NE(frameHandler1, nullptr);
 
@@ -1733,8 +1735,8 @@
         mActiveCameras.push_back(pCam);
 
         // Set up a frame receiver object which will fire up its own thread.
-        std::shared_ptr<FrameHandler> frameHandler =
-                std::make_shared<FrameHandler>(pCam, cam, pDisplay, FrameHandler::eAutoReturn);
+        std::shared_ptr<FrameHandler> frameHandler = ndk::SharedRefBase::make<FrameHandler>(
+                pCam, cam, pDisplay, FrameHandler::eAutoReturn);
         EXPECT_NE(frameHandler, nullptr);
 
         // Activate the display
@@ -1843,10 +1845,10 @@
         EXPECT_NE(pCam1, nullptr);
 
         // Set up per-client frame receiver objects which will fire up its own thread
-        std::shared_ptr<FrameHandler> frameHandler0 =
-                std::make_shared<FrameHandler>(pCam0, cam, nullptr, FrameHandler::eAutoReturn);
-        std::shared_ptr<FrameHandler> frameHandler1 =
-                std::make_shared<FrameHandler>(pCam1, cam, nullptr, FrameHandler::eAutoReturn);
+        std::shared_ptr<FrameHandler> frameHandler0 = ndk::SharedRefBase::make<FrameHandler>(
+                pCam0, cam, nullptr, FrameHandler::eAutoReturn);
+        std::shared_ptr<FrameHandler> frameHandler1 = ndk::SharedRefBase::make<FrameHandler>(
+                pCam1, cam, nullptr, FrameHandler::eAutoReturn);
         EXPECT_NE(frameHandler0, nullptr);
         EXPECT_NE(frameHandler1, nullptr);
 
@@ -2008,8 +2010,8 @@
         EXPECT_GE(delta, kBuffersToHold);
 
         // Set up a frame receiver object which will fire up its own thread.
-        std::shared_ptr<FrameHandler> frameHandler =
-                std::make_shared<FrameHandler>(pCam, cam, nullptr, FrameHandler::eNoAutoReturn);
+        std::shared_ptr<FrameHandler> frameHandler = ndk::SharedRefBase::make<FrameHandler>(
+                pCam, cam, nullptr, FrameHandler::eNoAutoReturn);
         EXPECT_NE(frameHandler, nullptr);
 
         // Start the camera's video stream
@@ -2101,7 +2103,7 @@
         EXPECT_NE(pUltrasonicsArray, nullptr);
 
         std::shared_ptr<FrameHandlerUltrasonics> frameHandler =
-                std::make_shared<FrameHandlerUltrasonics>(pUltrasonicsArray);
+                ndk::SharedRefBase::make<FrameHandlerUltrasonics>(pUltrasonicsArray);
         EXPECT_NE(frameHandler, nullptr);
 
         // Start stream.
@@ -2141,7 +2143,7 @@
         ASSERT_TRUE(pUltrasonicsArray->setMaxFramesInFlight(10).isOk());
 
         std::shared_ptr<FrameHandlerUltrasonics> frameHandler =
-                std::make_shared<FrameHandlerUltrasonics>(pUltrasonicsArray);
+                ndk::SharedRefBase::make<FrameHandlerUltrasonics>(pUltrasonicsArray);
         EXPECT_NE(frameHandler, nullptr);
 
         // Start stream.
diff --git a/automotive/vehicle/aidl/impl/default_config/include/DefaultConfig.h b/automotive/vehicle/aidl/impl/default_config/include/DefaultConfig.h
index f31ead3..fda0da9 100644
--- a/automotive/vehicle/aidl/impl/default_config/include/DefaultConfig.h
+++ b/automotive/vehicle/aidl/impl/default_config/include/DefaultConfig.h
@@ -1221,6 +1221,14 @@
                         },
                 .initialValue = {.stringValue = {"Test"}},
         },
+        {
+                .config =
+                        {
+                                .prop = ECHO_REVERSE_BYTES,
+                                .access = VehiclePropertyAccess::READ_WRITE,
+                                .changeMode = VehiclePropertyChangeMode::ON_CHANGE,
+                        },
+        },
 #ifdef ENABLE_VENDOR_CLUSTER_PROPERTY_FOR_TESTING
         // Vendor propetry for E2E ClusterHomeService testing.
         {
diff --git a/automotive/vehicle/aidl/impl/fake_impl/hardware/include/FakeVehicleHardware.h b/automotive/vehicle/aidl/impl/fake_impl/hardware/include/FakeVehicleHardware.h
index 1c076d3..e799a28 100644
--- a/automotive/vehicle/aidl/impl/fake_impl/hardware/include/FakeVehicleHardware.h
+++ b/automotive/vehicle/aidl/impl/fake_impl/hardware/include/FakeVehicleHardware.h
@@ -131,6 +131,8 @@
             const aidl::android::hardware::automotive::vehicle::VehiclePropValue& value);
     ValueResultType getUserHalProp(
             const aidl::android::hardware::automotive::vehicle::VehiclePropValue& value) const;
+    ValueResultType getEchoReverseBytes(
+            const aidl::android::hardware::automotive::vehicle::VehiclePropValue& value) const;
     bool isHvacPropAndHvacNotAvailable(int32_t propId);
 
     std::string dumpAllProperties();
diff --git a/automotive/vehicle/aidl/impl/fake_impl/hardware/src/FakeVehicleHardware.cpp b/automotive/vehicle/aidl/impl/fake_impl/hardware/src/FakeVehicleHardware.cpp
index 462506d..f8b64f2 100644
--- a/automotive/vehicle/aidl/impl/fake_impl/hardware/src/FakeVehicleHardware.cpp
+++ b/automotive/vehicle/aidl/impl/fake_impl/hardware/src/FakeVehicleHardware.cpp
@@ -23,6 +23,7 @@
 #include <FakeObd2Frame.h>
 #include <JsonFakeValueGenerator.h>
 #include <PropertyUtils.h>
+#include <TestPropertyUtils.h>
 #include <VehicleHalTypes.h>
 #include <VehicleUtils.h>
 #include <android-base/parsedouble.h>
@@ -335,6 +336,9 @@
                 result.value()->timestamp = elapsedRealtimeNano();
             }
             return result;
+        case ECHO_REVERSE_BYTES:
+            *isSpecialValue = true;
+            return getEchoReverseBytes(value);
         default:
             // Do nothing.
             break;
@@ -343,6 +347,22 @@
     return nullptr;
 }
 
+FakeVehicleHardware::ValueResultType FakeVehicleHardware::getEchoReverseBytes(
+        const VehiclePropValue& value) const {
+    auto readResult = mServerSidePropStore->readValue(value);
+    if (!readResult.ok()) {
+        return readResult;
+    }
+    auto& gotValue = readResult.value();
+    gotValue->timestamp = elapsedRealtimeNano();
+    std::vector<uint8_t> byteValues = gotValue->value.byteValues;
+    size_t byteSize = byteValues.size();
+    for (size_t i = 0; i < byteSize; i++) {
+        gotValue->value.byteValues[i] = byteValues[byteSize - 1 - i];
+    }
+    return std::move(gotValue);
+}
+
 VhalResult<void> FakeVehicleHardware::maybeSetSpecialValue(const VehiclePropValue& value,
                                                            bool* isSpecialValue) {
     *isSpecialValue = false;
diff --git a/automotive/vehicle/aidl/impl/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp b/automotive/vehicle/aidl/impl/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
index 6259f96..7a7fb37 100644
--- a/automotive/vehicle/aidl/impl/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
+++ b/automotive/vehicle/aidl/impl/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
@@ -276,6 +276,11 @@
             continue;
         }
 
+        if (config.config.prop == ECHO_REVERSE_BYTES) {
+            // Ignore ECHO_REVERSE_BYTES, it has special logic.
+            continue;
+        }
+
         int propId = config.config.prop;
         if (isGlobalProp(propId)) {
             if (config.initialValue == RawPropValues{}) {
@@ -1487,6 +1492,24 @@
     ASSERT_EQ(3.402823466E+38f, value.value.floatValues[2]);
 }
 
+TEST_F(FakeVehicleHardwareTest, testGetEchoReverseBytes) {
+    ASSERT_EQ(setValue(VehiclePropValue{
+                      .prop = ECHO_REVERSE_BYTES,
+                      .value =
+                              {
+                                      .byteValues = {0x01, 0x02, 0x03, 0x04},
+                              },
+              }),
+              StatusCode::OK);
+
+    auto result = getValue(VehiclePropValue{
+            .prop = ECHO_REVERSE_BYTES,
+    });
+
+    ASSERT_TRUE(result.ok()) << "failed to get ECHO_REVERSE_BYTES value: " << getStatus(result);
+    ASSERT_EQ(result.value().value.byteValues, std::vector<uint8_t>({0x04, 0x03, 0x02, 0x01}));
+}
+
 }  // namespace fake
 }  // namespace vehicle
 }  // namespace automotive
diff --git a/automotive/vehicle/aidl/impl/utils/test/include/TestPropertyUtils.h b/automotive/vehicle/aidl/impl/utils/test/include/TestPropertyUtils.h
index 4213501..d512713 100644
--- a/automotive/vehicle/aidl/impl/utils/test/include/TestPropertyUtils.h
+++ b/automotive/vehicle/aidl/impl/utils/test/include/TestPropertyUtils.h
@@ -76,6 +76,16 @@
         toInt(testpropertyutils_impl::VehicleArea::GLOBAL) |
         toInt(testpropertyutils_impl::VehiclePropertyType::STRING);
 
+// This property is used for testing LargeParcelable marshalling/unmarhsalling end to end.
+// It acts as an regular property that stores the property value when setting and return the value
+// when getting, except that all the byteValues used in the setValue response would be filled in
+// the reverse order.
+// 0x21702a12
+constexpr int32_t ECHO_REVERSE_BYTES = 0x2a12 |
+                                       toInt(testpropertyutils_impl::VehiclePropertyGroup::VENDOR) |
+                                       toInt(testpropertyutils_impl::VehicleArea::GLOBAL) |
+                                       toInt(testpropertyutils_impl::VehiclePropertyType::BYTES);
+
 // This property is used for test purpose. End to end tests use this property to test set and get
 // method for MIXED type properties.
 constexpr int32_t kMixedTypePropertyForTest =