Merge "Merge Android 14 QPR3 to AOSP main" into main
diff --git a/media/eco/Android.bp b/media/eco/Android.bp
index 7fcb676..2a9e2a8 100644
--- a/media/eco/Android.bp
+++ b/media/eco/Android.bp
@@ -17,15 +17,16 @@
     unstable: true,
     backend: {
         cpp: {
+            enabled: false,
+        },
+        ndk: {
             enabled: true,
+            apps_enabled: false,
             additional_shared_libraries: [
                 "libmedia_ecoservice_ecodata",
                 "libbinder_ndk",
             ],
         },
-        ndk: {
-            enabled: false,
-        },
         java: {
             enabled: false,
         },
@@ -49,7 +50,6 @@
 
     shared_libs: [
         "libbase",
-        "libbinder",
         "libbinder_ndk",
         "liblog",
         "libutils",
@@ -90,10 +90,9 @@
     ],
     whole_static_libs: [
         "libmedia_ecoservice_ecodata",
-        "libmedia_ecoservice_aidl-cpp",
+        "libmedia_ecoservice_aidl-ndk",
     ],
     shared_libs: [
-        "libbinder",
         "libbinder_ndk",
         "libcutils",
         "liblog",
@@ -101,7 +100,6 @@
         "libcodec2_hidl@1.0",
     ],
     export_shared_lib_headers: [
-        "libbinder",
         "libbinder_ndk",
     ],
 
diff --git a/media/eco/ECOData.cpp b/media/eco/ECOData.cpp
index 3d7b533..4010112 100644
--- a/media/eco/ECOData.cpp
+++ b/media/eco/ECOData.cpp
@@ -19,7 +19,8 @@
 
 #include "eco/ECOData.h"
 
-#include <binder/Parcel.h>
+#include <android/binder_parcel.h>
+#include <android/binder_parcel_utils.h>
 #include <inttypes.h>
 #include <utils/Errors.h>
 #include <utils/Log.h>
@@ -29,81 +30,76 @@
 #include "eco/ECODataKey.h"
 #include "eco/ECOUtils.h"
 
+namespace aidl {
 namespace android {
 namespace media {
 namespace eco {
 
 using namespace ::android;
 
-status_t ECOData::readFromParcel(const Parcel* parcel) {
+binder_status_t ECOData::readFromParcel(const AParcel* parcel) {
     if (parcel == nullptr) {
         ALOGE("readFromParcel failed. Parcel pointer can not be null");
         return BAD_VALUE;
     }
 
     // Reads the data type and time.
-    RETURN_STATUS_IF_ERROR(parcel->readInt32(&mDataType));
-    RETURN_STATUS_IF_ERROR(parcel->readInt64(&mDataTimeUs));
+    RETURN_STATUS_IF_ERROR(AParcel_readInt32(parcel, &mDataType));
+    RETURN_STATUS_IF_ERROR(AParcel_readInt64(parcel, &mDataTimeUs));
 
     // Reads the number of items.
     uint32_t numOfItems = 0;
-    RETURN_STATUS_IF_ERROR(parcel->readUint32(&numOfItems));
+    RETURN_STATUS_IF_ERROR(AParcel_readUint32(parcel, &numOfItems));
 
     // Reads the key-value pairs one by one.
     for (size_t i = 0; i < numOfItems; ++i) {
         // Reads the name of the key.
-        const char* name = parcel->readCString();
-        if (name == NULL) {
-            ALOGE("Failed reading name for the key. Parsing aborted.");
-            return NAME_NOT_FOUND;
-        }
+        std::string name;
+        AParcel_readString(parcel, &name, ndk::AParcel_stdStringAllocator);
 
         int32_t type;
-        RETURN_STATUS_IF_ERROR(parcel->readInt32(&type));
+        RETURN_STATUS_IF_ERROR(AParcel_readInt32(parcel, &type));
         switch (static_cast<ValueType>(type)) {
         case kTypeInt32: {
             int32_t value32;
-            RETURN_STATUS_IF_ERROR(parcel->readInt32(&value32));
-            setInt32(std::string(name), value32);
+            RETURN_STATUS_IF_ERROR(AParcel_readInt32(parcel, &value32));
+            setInt32(name, value32);
             break;
         }
         case kTypeInt64: {
             int64_t value64;
-            RETURN_STATUS_IF_ERROR(parcel->readInt64(&value64));
-            setInt64(std::string(name), value64);
+            RETURN_STATUS_IF_ERROR(AParcel_readInt64(parcel, &value64));
+            setInt64(name, value64);
             break;
         }
         case kTypeSize: {
             int32_t valueSize;
-            RETURN_STATUS_IF_ERROR(parcel->readInt32(&valueSize));
-            setInt32(std::string(name), valueSize);
+            RETURN_STATUS_IF_ERROR(AParcel_readInt32(parcel, &valueSize));
+            setInt32(name, valueSize);
             break;
         }
         case kTypeFloat: {
             float valueFloat;
-            RETURN_STATUS_IF_ERROR(parcel->readFloat(&valueFloat));
-            setFloat(std::string(name), valueFloat);
+            RETURN_STATUS_IF_ERROR(AParcel_readFloat(parcel, &valueFloat));
+            setFloat(name, valueFloat);
             break;
         }
         case kTypeDouble: {
             double valueDouble;
-            RETURN_STATUS_IF_ERROR(parcel->readDouble(&valueDouble));
-            setDouble(std::string(name), valueDouble);
+            RETURN_STATUS_IF_ERROR(AParcel_readDouble(parcel, &valueDouble));
+            setDouble(name, valueDouble);
             break;
         }
         case kTypeString: {
-            const char* valueStr = parcel->readCString();
-            if (valueStr == NULL) {
-                ALOGE("Failed reading name for the key. Parsing aborted.");
-                return NAME_NOT_FOUND;
-            }
-            setString(std::string(name), valueStr);
+            std::string valueString;
+            AParcel_readString(parcel, &valueString, ndk::AParcel_stdStringAllocator);
+            setString(name, valueString);
             break;
         }
         case kTypeInt8: {
             int8_t value8;
-            RETURN_STATUS_IF_ERROR(parcel->readByte(&value8));
-            setInt8(std::string(name), value8);
+            RETURN_STATUS_IF_ERROR(AParcel_readByte(parcel, &value8));
+            setInt8(name, value8);
             break;
         }
         default: {
@@ -115,54 +111,57 @@
     return NO_ERROR;
 }
 
-status_t ECOData::writeToParcel(Parcel* parcel) const {
+binder_status_t ECOData::writeToParcel(AParcel* parcel) const {
     if (parcel == nullptr) {
         ALOGE("writeToParcel failed. Parcel pointer can not be null");
         return BAD_VALUE;
     }
 
     // Writes out the data type and time.
-    RETURN_STATUS_IF_ERROR(parcel->writeInt32(mDataType));
-    RETURN_STATUS_IF_ERROR(parcel->writeInt64(mDataTimeUs));
+    RETURN_STATUS_IF_ERROR(AParcel_writeInt32(parcel, mDataType));
+    RETURN_STATUS_IF_ERROR(AParcel_writeInt64(parcel, mDataTimeUs));
 
     // Writes out number of items.
-    RETURN_STATUS_IF_ERROR(parcel->writeUint32(int32_t(mKeyValueStore.size())));
+    RETURN_STATUS_IF_ERROR(AParcel_writeUint32(parcel, int32_t(mKeyValueStore.size())));
 
     // Writes out the key-value pairs one by one.
     for (const auto& it : mKeyValueStore) {
         // Writes out the key.
-        RETURN_STATUS_IF_ERROR(parcel->writeCString(it.first.c_str()));
+        RETURN_STATUS_IF_ERROR(AParcel_writeString(parcel, it.first.c_str(),
+                                                   static_cast<int32_t>(it.first.size())));
 
         // Writes out the data type.
         const ECODataValueType& value = it.second;
-        RETURN_STATUS_IF_ERROR(parcel->writeInt32(static_cast<int32_t>(value.index())));
+        RETURN_STATUS_IF_ERROR(AParcel_writeInt32(parcel, static_cast<int32_t>(value.index())));
         switch (static_cast<ValueType>(value.index())) {
         case kTypeInt32:
-            RETURN_STATUS_IF_ERROR(parcel->writeInt32(std::get<int32_t>(it.second)));
+            RETURN_STATUS_IF_ERROR(AParcel_writeInt32(parcel, std::get<int32_t>(it.second)));
             break;
 
         case kTypeInt64:
-            RETURN_STATUS_IF_ERROR(parcel->writeInt64(std::get<int64_t>(it.second)));
+            RETURN_STATUS_IF_ERROR(AParcel_writeInt64(parcel, std::get<int64_t>(it.second)));
             break;
 
         case kTypeSize:
-            RETURN_STATUS_IF_ERROR(parcel->writeUint32(std::get<size_t>(it.second)));
+            RETURN_STATUS_IF_ERROR(AParcel_writeUint32(parcel, std::get<size_t>(it.second)));
             break;
 
         case kTypeFloat:
-            RETURN_STATUS_IF_ERROR(parcel->writeFloat(std::get<float>(it.second)));
+            RETURN_STATUS_IF_ERROR(AParcel_writeFloat(parcel, std::get<float>(it.second)));
             break;
 
         case kTypeDouble:
-            RETURN_STATUS_IF_ERROR(parcel->writeDouble(std::get<double>(it.second)));
+            RETURN_STATUS_IF_ERROR(AParcel_writeDouble(parcel, std::get<double>(it.second)));
             break;
 
         case kTypeString:
-            RETURN_STATUS_IF_ERROR(parcel->writeCString(std::get<std::string>(it.second).c_str()));
+            RETURN_STATUS_IF_ERROR(AParcel_writeString(
+                    parcel, std::get<std::string>(it.second).c_str(),
+                    static_cast<int32_t>(std::get<std::string>(it.second).size())));
             break;
 
         case kTypeInt8:
-            RETURN_STATUS_IF_ERROR(parcel->writeByte(std::get<int8_t>(it.second)));
+            RETURN_STATUS_IF_ERROR(AParcel_writeByte(parcel, std::get<int8_t>(it.second)));
             break;
 
         default:
@@ -423,3 +422,4 @@
 }  // namespace eco
 }  // namespace media
 }  // namespace android
+}  // namespace aidl
diff --git a/media/eco/ECODebug.cpp b/media/eco/ECODebug.cpp
index 5ed08ab..4b82025 100644
--- a/media/eco/ECODebug.cpp
+++ b/media/eco/ECODebug.cpp
@@ -16,6 +16,8 @@
 
 #include "eco/ECODebug.h"
 
+#include <utils/Log.h>
+
 namespace android {
 namespace media {
 namespace eco {
diff --git a/media/eco/ECOService.cpp b/media/eco/ECOService.cpp
index 434485f..557e24a 100644
--- a/media/eco/ECOService.cpp
+++ b/media/eco/ECOService.cpp
@@ -42,9 +42,9 @@
     updateLogLevel();
 }
 
-/*virtual*/ ::android::binder::Status ECOService::obtainSession(
+/*virtual*/ ::ndk::ScopedAStatus ECOService::obtainSession(
         int32_t width, int32_t height, bool isCameraRecording,
-        ::android::sp<::android::media::eco::IECOSession>* _aidl_return) {
+        std::shared_ptr<::android::media::eco::IECOSession>* _aidl_return) {
     ECOLOGI("ECOService::obtainSession w: %d, h: %d, isCameraRecording: %d", width, height,
             isCameraRecording);
 
@@ -72,18 +72,19 @@
     // invalid sessions.
     SanitizeSession([&](MapIterType iter) {
         if (iter->first == newCfg) {
-            sp<ECOSession> session = iter->second.promote();
+            std::shared_ptr<ECOSession> session = iter->second.lock();
             foundSession = true;
             *_aidl_return = session;
         }
     });
 
     if (foundSession) {
-        return binder::Status::ok();
+        return ndk::ScopedAStatus::ok();
     }
 
     // Create a new session and add it to the record.
-    sp<ECOSession> newSession = ECOSession::createECOSession(width, height, isCameraRecording);
+    std::shared_ptr<ECOSession> newSession =
+            ECOSession::createECOSession(width, height, isCameraRecording);
     if (newSession == nullptr) {
         ECOLOGE("ECOService failed to create ECOSession w: %d, h: %d, isCameraRecording: %d", width,
                 height, isCameraRecording);
@@ -94,36 +95,36 @@
     mSessionConfigToSessionMap[newCfg] = newSession;
     ECOLOGD("session count after is %zu", mSessionConfigToSessionMap.size());
 
-    return binder::Status::ok();
+    return ndk::ScopedAStatus::ok();
 }
 
-/*virtual*/ ::android::binder::Status ECOService::getNumOfSessions(int32_t* _aidl_return) {
+/*virtual*/ ::ndk::ScopedAStatus ECOService::getNumOfSessions(int32_t* _aidl_return) {
     Mutex::Autolock lock(mServiceLock);
     SanitizeSession(std::function<void(MapIterType it)>());  // empty callback
     *_aidl_return = mSessionConfigToSessionMap.size();
-    return binder::Status::ok();
+    return ndk::ScopedAStatus::ok();
 }
 
-/*virtual*/ ::android::binder::Status ECOService::getSessions(
-        ::std::vector<::android::sp<::android::IBinder>>* _aidl_return) {
+/*virtual*/ ::ndk::ScopedAStatus ECOService::getSessions(
+        std::vector<::ndk::SpAIBinder>* _aidl_return) {
     // Clear all the entries in the vector.
     _aidl_return->clear();
 
     Mutex::Autolock lock(mServiceLock);
     SanitizeSession([&](MapIterType iter) {
-        sp<ECOSession> session = iter->second.promote();
-        _aidl_return->push_back(IInterface::asBinder(session));
+        std::shared_ptr<ECOSession> session = iter->second.lock();
+        _aidl_return->push_back(session->asBinder());
     });
-    return binder::Status::ok();
+    return ndk::ScopedAStatus::ok();
 }
 
-inline bool isEmptySession(const android::wp<ECOSession>& entry) {
-    sp<ECOSession> session = entry.promote();
+inline bool isEmptySession(const std::weak_ptr<ECOSession>& entry) {
+    std::shared_ptr<ECOSession> session = entry.lock();
     return session == nullptr;
 }
 
 void ECOService::SanitizeSession(
-        const std::function<void(std::unordered_map<SessionConfig, wp<ECOSession>,
+        const std::function<void(std::unordered_map<SessionConfig, std::weak_ptr<ECOSession>,
                                                     SessionConfigHash>::iterator it)>& callback) {
     for (auto it = mSessionConfigToSessionMap.begin(), end = mSessionConfigToSessionMap.end();
          it != end;) {
@@ -138,15 +139,15 @@
     }
 }
 
-/*virtual*/ void ECOService::binderDied(const wp<IBinder>& /*who*/) {}
+/*virtual*/ void ECOService::binderDied(const std::weak_ptr<AIBinder>& /*who*/) {}
 
-status_t ECOService::dump(int fd, const Vector<String16>& args) {
+status_t ECOService::dump(int fd, const std::vector<std::string>& args) {
     Mutex::Autolock lock(mServiceLock);
     dprintf(fd, "\n== ECO Service info: ==\n\n");
     dprintf(fd, "Number of ECOServices: %zu\n", mSessionConfigToSessionMap.size());
     for (auto it = mSessionConfigToSessionMap.begin(), end = mSessionConfigToSessionMap.end();
          it != end; it++) {
-        sp<ECOSession> session = it->second.promote();
+        std::shared_ptr<ECOSession> session = std::shared_ptr<ECOSession>(it->second);
         if (session != nullptr) {
             session->dump(fd, args);
         }
diff --git a/media/eco/ECOServiceStatsProvider.cpp b/media/eco/ECOServiceStatsProvider.cpp
index 90f1a23..683b7a1 100644
--- a/media/eco/ECOServiceStatsProvider.cpp
+++ b/media/eco/ECOServiceStatsProvider.cpp
@@ -16,18 +16,18 @@
 
 //#define LOG_NDEBUG 0
 #define LOG_TAG "ECOServiceStatsProvider"
+#include <android/binder_manager.h>
 #include <eco/ECOServiceStatsProvider.h>
-
-#include <binder/IServiceManager.h>
 #include <utils/Timers.h>
 
 namespace android {
 namespace media {
 namespace eco {
 
-ECOServiceStatsProvider::ECOServiceStatsProvider(
-    int32_t width, int32_t height, bool isCameraRecording,
-    android::sp<IECOSession>& session, const char* name)
+ECOServiceStatsProvider::ECOServiceStatsProvider(int32_t width, int32_t height,
+                                                 bool isCameraRecording,
+                                                 std::shared_ptr<IECOSession>& session,
+                                                 const char* name)
       : BnECOServiceStatsProvider(),
         mWidth(width),
         mHeight(height),
@@ -38,32 +38,32 @@
             __func__, mWidth, mHeight, isCameraRecording, name);
 }
 
-Status ECOServiceStatsProvider::getType(int32_t* _aidl_return) {
+ScopedAStatus ECOServiceStatsProvider::getType(int32_t* _aidl_return) {
     *_aidl_return = STATS_PROVIDER_TYPE_VIDEO_ENCODER;
-    return Status::ok();
+    return ScopedAStatus::ok();
 }
 
-Status ECOServiceStatsProvider::getName(::android::String16* _aidl_return) {
-    *_aidl_return = String16(mProviderName);
-    return Status::ok();
+ScopedAStatus ECOServiceStatsProvider::getName(std::string* _aidl_return) {
+    *_aidl_return = std::string(mProviderName);
+    return ScopedAStatus::ok();
 }
 
-Status ECOServiceStatsProvider::getECOSession(android::sp<::android::IBinder>* _aidl_return) {
-    *_aidl_return = IInterface::asBinder(mECOSession);
-    return Status::ok();
+ScopedAStatus ECOServiceStatsProvider::getECOSession(::ndk::SpAIBinder* _aidl_return) {
+    *_aidl_return = mECOSession->asBinder();
+    return ScopedAStatus::ok();
 }
 
-Status ECOServiceStatsProvider::isCameraRecording(bool* _aidl_return) {
+ScopedAStatus ECOServiceStatsProvider::isCameraRecording(bool* _aidl_return) {
     *_aidl_return = mIsCameraRecording;
-    return Status::ok();
+    return ScopedAStatus::ok();
 }
 
-void ECOServiceStatsProvider::binderDied(const wp<IBinder>& /* who */) {}
+void ECOServiceStatsProvider::binderDied(const std::weak_ptr<AIBinder>& /* who */) {}
 
 bool ECOServiceStatsProvider::updateStats(const ECOData& data) {
     bool ret = false;
     if (mECOSession) {
-        Status status = mECOSession->pushNewStats(data, &ret);
+        ScopedAStatus status = mECOSession->pushNewStats(data, &ret);
         return ret;
     }
     return ret;
@@ -73,7 +73,7 @@
     bool ret = false;
     if (mECOSession) {
         ECOData providerConfig(ECOData::DATA_TYPE_STATS_PROVIDER_CONFIG, systemTime() / 1000);
-        mECOSession->addStatsProvider(this, providerConfig, &ret);
+        mECOSession->addStatsProvider(fromBinder(asBinder()), providerConfig, &ret);
         return ret;
     }
     return ret;
@@ -82,28 +82,27 @@
 bool ECOServiceStatsProvider::removeProvider() {
     bool ret = false;
     if (mECOSession) {
-        mECOSession->removeStatsProvider(this, &ret);
+        mECOSession->removeStatsProvider(fromBinder(asBinder()), &ret);
         return ret;
     }
     return ret;
 }
 
-android::sp<ECOServiceStatsProvider> ECOServiceStatsProvider::create(
-    int32_t width, int32_t height, bool isCameraRecording, const char* name) {
-
-    android::sp<android::IServiceManager> sm = android::defaultServiceManager();
-    android::sp<android::IBinder> binder = sm->getService(String16("media.ecoservice"));
-
-    if (binder == nullptr) {
+std::shared_ptr<ECOServiceStatsProvider> ECOServiceStatsProvider::create(int32_t width,
+                                                                         int32_t height,
+                                                                         bool isCameraRecording,
+                                                                         const char* name) {
+    std::shared_ptr<IECOService> service = IECOService::fromBinder(
+            ndk::SpAIBinder(AServiceManager_waitForService("media.ecoservice")));
+    if (service == nullptr) {
         ALOGE("Failed to connect to ecoservice");
         return nullptr;
     }
 
-    android::sp<IECOService> service = android::interface_cast<IECOService>(binder);
     ALOGI("Connected to ecoservice");
 
     // Obtain the ECOSession and add the listener to the service.
-    android::sp<IECOSession> session = nullptr;
+    std::shared_ptr<IECOSession> session = nullptr;
 
     service->obtainSession(width, height, isCameraRecording, &session);
 
@@ -113,7 +112,8 @@
     }
     ALOGI("Obtained an ECO session");
 
-    return new ECOServiceStatsProvider(width, height, isCameraRecording, session, name);
+    return ndk::SharedRefBase::make<ECOServiceStatsProvider>(width, height, isCameraRecording,
+                                                             session, name);
 }
 
 float ECOServiceStatsProvider::getFramerate(int64_t currTimestamp) {
diff --git a/media/eco/ECOSession.cpp b/media/eco/ECOSession.cpp
index db85571..ca90b0c 100644
--- a/media/eco/ECOSession.cpp
+++ b/media/eco/ECOSession.cpp
@@ -41,8 +41,8 @@
 namespace media {
 namespace eco {
 
-using android::binder::Status;
-using android::sp;
+using ::aidl::android::media::eco::ECODataKeyValueIterator;
+using ndk::ScopedAStatus;
 
 #define RETURN_IF_ERROR(expr)         \
     {                                 \
@@ -53,7 +53,8 @@
     }
 
 // static
-sp<ECOSession> ECOSession::createECOSession(int32_t width, int32_t height, bool isCameraRecording) {
+std::shared_ptr<ECOSession> ECOSession::createECOSession(int32_t width, int32_t height,
+                                                         bool isCameraRecording) {
     // Only support up to 1080P.
     // TODO: Support the same resolution as in EAF.
     if (width <= 0 || height <= 0 || width > 5120 || height > 5120 ||
@@ -62,7 +63,7 @@
                 height, isCameraRecording);
         return nullptr;
     }
-    return new ECOSession(width, height, isCameraRecording);
+    return ndk::SharedRefBase::make<ECOSession>(width, height, isCameraRecording);
 }
 
 ECOSession::ECOSession(int32_t width, int32_t height, bool isCameraRecording)
@@ -124,7 +125,7 @@
             // Check if there is any session info available.
             ECOData sessionInfo = generateLatestSessionInfoEcoData();
             if (!sessionInfo.isEmpty()) {
-                Status status = mListener->onNewInfo(sessionInfo);
+                ScopedAStatus status = mListener->onNewInfo(sessionInfo);
                 if (!status.isOk()) {
                     ECOLOGE("%s: Failed to publish info: %s due to binder error", __FUNCTION__,
                             sessionInfo.debugString().c_str());
@@ -237,7 +238,7 @@
     }
 
     if (mListener != nullptr) {
-        Status status = mListener->onNewInfo(info);
+        ScopedAStatus status = mListener->onNewInfo(info);
         if (!status.isOk()) {
             ECOLOGE("%s: Failed to publish info: %s due to binder error", __FUNCTION__,
                     info.debugString().c_str());
@@ -354,7 +355,7 @@
     }
 
     if (needToNotifyListener && mListener != nullptr) {
-        Status status = mListener->onNewInfo(info);
+        ScopedAStatus status = mListener->onNewInfo(info);
         if (!status.isOk()) {
             ECOLOGE("%s: Failed to publish info: %s due to binder error", __FUNCTION__,
                     info.debugString().c_str());
@@ -364,17 +365,17 @@
     }
 }
 
-Status ECOSession::getIsCameraRecording(bool* _aidl_return) {
+ScopedAStatus ECOSession::getIsCameraRecording(bool* _aidl_return) {
     std::scoped_lock<std::mutex> lock(mSessionLock);
     *_aidl_return = mIsCameraRecording;
-    return binder::Status::ok();
+    return ndk::ScopedAStatus::ok();
 }
 
-Status ECOSession::addStatsProvider(
-        const sp<::android::media::eco::IECOServiceStatsProvider>& provider,
+ScopedAStatus ECOSession::addStatsProvider(
+        const std::shared_ptr<::android::media::eco::IECOServiceStatsProvider>& provider,
         const ::android::media::eco::ECOData& config, bool* status) {
-    ::android::String16 name;
-    Status result = provider->getName(&name);
+    std::string name;
+    ScopedAStatus result = provider->getName(&name);
     if (!result.isOk()) {
         // This binder transaction failure may due to permission issue.
         *status = false;
@@ -382,7 +383,7 @@
         return STATUS_ERROR(ERROR_PERMISSION_DENIED, "Failed to get provider name");
     }
 
-    ECOLOGV("Try to add stats provider name: %s uid: %d pid %d", ::android::String8(name).c_str(),
+    ECOLOGV("Try to add stats provider name: %s uid: %d pid %d", name.c_str(),
             AIBinder_getCallingUid(), AIBinder_getCallingPid());
 
     if (provider == nullptr) {
@@ -394,11 +395,10 @@
     std::scoped_lock<std::mutex> lock(mSessionLock);
 
     if (mProvider != nullptr) {
-        ::android::String16 name;
+        std::string name;
         mProvider->getName(&name);
-        String8 errorMsg = String8::format(
-                "ECOService 1.0 only supports one stats provider, current provider: %s",
-                ::android::String8(name).c_str());
+        std::string errorMsg =
+                "ECOService 1.0 only supports one stats provider, current provider: " + name;
         ECOLOGE("%s", errorMsg.c_str());
         *status = false;
         return STATUS_ERROR(ERROR_ALREADY_EXISTS, errorMsg.c_str());
@@ -414,14 +414,15 @@
     mProvider = provider;
     mProviderName = name;
     *status = true;
-    return binder::Status::ok();
+    return ndk::ScopedAStatus::ok();
 }
 
-Status ECOSession::removeStatsProvider(
-        const sp<::android::media::eco::IECOServiceStatsProvider>& provider, bool* status) {
+ScopedAStatus ECOSession::removeStatsProvider(
+        const std::shared_ptr<::android::media::eco::IECOServiceStatsProvider>& provider,
+        bool* status) {
     std::scoped_lock<std::mutex> lock(mSessionLock);
     // Check if the provider is the same as current provider for the session.
-    if (IInterface::asBinder(provider) != IInterface::asBinder(mProvider)) {
+    if (provider->asBinder() != mProvider->asBinder()) {
         *status = false;
         ECOLOGE("Failed to remove provider");
         return STATUS_ERROR(ERROR_ILLEGAL_ARGUMENT, "Provider does not match");
@@ -429,17 +430,17 @@
 
     mProvider = nullptr;
     *status = true;
-    return binder::Status::ok();
+    return ndk::ScopedAStatus::ok();
 }
 
-Status ECOSession::addInfoListener(
-        const sp<::android::media::eco::IECOServiceInfoListener>& listener,
+ScopedAStatus ECOSession::addInfoListener(
+        const std::shared_ptr<::android::media::eco::IECOServiceInfoListener>& listener,
         const ::android::media::eco::ECOData& config, bool* status) {
     ALOGV("%s: Add listener %p", __FUNCTION__, listener.get());
     std::scoped_lock<std::mutex> lock(mSessionLock);
 
-    ::android::String16 name;
-    Status result = listener->getName(&name);
+    std::string name;
+    ScopedAStatus result = listener->getName(&name);
     if (!result.isOk()) {
         // This binder transaction failure may due to permission issue.
         *status = false;
@@ -483,7 +484,7 @@
         return STATUS_ERROR(ERROR_ILLEGAL_ARGUMENT, "listener config is not valid");
     }
 
-    ECOLOGD("Info listener name: %s uid: %d pid %d", ::android::String8(name).c_str(),
+    ECOLOGD("Info listener name: %s uid: %d pid %d", name.c_str(),
             AIBinder_getCallingUid(), AIBinder_getCallingPid());
 
     mListener = listener;
@@ -492,14 +493,15 @@
     mWorkerWaitCV.notify_all();
 
     *status = true;
-    return binder::Status::ok();
+    return ndk::ScopedAStatus::ok();
 }
 
-Status ECOSession::removeInfoListener(
-        const sp<::android::media::eco::IECOServiceInfoListener>& listener, bool* _aidl_return) {
+ScopedAStatus ECOSession::removeInfoListener(
+        const std::shared_ptr<::android::media::eco::IECOServiceInfoListener>& listener,
+        bool* _aidl_return) {
     std::scoped_lock<std::mutex> lock(mSessionLock);
     // Check if the listener is the same as current listener for the session.
-    if (IInterface::asBinder(listener) != IInterface::asBinder(mListener)) {
+    if (listener->asBinder() != mListener->asBinder()) {
         *_aidl_return = false;
         ECOLOGE("Failed to remove listener");
         return STATUS_ERROR(ERROR_ILLEGAL_ARGUMENT, "Listener does not match");
@@ -508,47 +510,44 @@
     mListener = nullptr;
     mNewListenerAdded = false;
     *_aidl_return = true;
-    return binder::Status::ok();
+    return ndk::ScopedAStatus::ok();
 }
 
-Status ECOSession::pushNewStats(const ::android::media::eco::ECOData& stats, bool* _aidl_return) {
+ScopedAStatus ECOSession::pushNewStats(const ::android::media::eco::ECOData& stats,
+                                       bool* _aidl_return) {
     ECOLOGV("ECOSession get new stats type: %s", stats.getDataTypeString().c_str());
     std::unique_lock<std::mutex> lock(mStatsQueueLock);
     mStatsQueue.push_back(stats);
     mWorkerWaitCV.notify_all();
     *_aidl_return = true;
-    return binder::Status::ok();
+    return ndk::ScopedAStatus::ok();
 }
 
-Status ECOSession::getWidth(int32_t* _aidl_return) {
+ScopedAStatus ECOSession::getWidth(int32_t* _aidl_return) {
     std::scoped_lock<std::mutex> lock(mSessionLock);
     *_aidl_return = mWidth;
-    return binder::Status::ok();
+    return ndk::ScopedAStatus::ok();
 }
 
-Status ECOSession::getHeight(int32_t* _aidl_return) {
+ScopedAStatus ECOSession::getHeight(int32_t* _aidl_return) {
     std::scoped_lock<std::mutex> lock(mSessionLock);
     *_aidl_return = mHeight;
-    return binder::Status::ok();
+    return ndk::ScopedAStatus::ok();
 }
 
-Status ECOSession::getNumOfListeners(int32_t* _aidl_return) {
+ScopedAStatus ECOSession::getNumOfListeners(int32_t* _aidl_return) {
     std::scoped_lock<std::mutex> lock(mSessionLock);
     *_aidl_return = (mListener == nullptr ? 0 : 1);
-    return binder::Status::ok();
+    return ndk::ScopedAStatus::ok();
 }
 
-Status ECOSession::getNumOfProviders(int32_t* _aidl_return) {
+ScopedAStatus ECOSession::getNumOfProviders(int32_t* _aidl_return) {
     std::scoped_lock<std::mutex> lock(mSessionLock);
     *_aidl_return = (mProvider == nullptr ? 0 : 1);
-    return binder::Status::ok();
+    return ndk::ScopedAStatus::ok();
 }
 
-/*virtual*/ void ECOSession::binderDied(const wp<IBinder>& /*who*/) {
-    ECOLOGV("binderDied");
-}
-
-status_t ECOSession::dump(int fd, const Vector<String16>& /*args*/) {
+status_t ECOSession::dump(int fd, const std::vector<std::string>& /*args*/) {
     std::scoped_lock<std::mutex> lock(mSessionLock);
     dprintf(fd, "\n== Session Info: ==\n\n");
     dprintf(fd,
@@ -557,10 +556,10 @@
             mWidth, mHeight, mIsCameraRecording, mTargetBitrateBps, mCodecType, mCodecProfile,
             mCodecLevel);
     if (mProvider != nullptr) {
-        dprintf(fd, "Provider: %s \n", ::android::String8(mProviderName).c_str());
+        dprintf(fd, "Provider: %s \n", mProviderName.c_str());
     }
     if (mListener != nullptr) {
-        dprintf(fd, "Listener: %s \n", ::android::String8(mListenerName).c_str());
+        dprintf(fd, "Listener: %s \n", mListenerName.c_str());
     }
     dprintf(fd, "\n===================\n\n");
 
diff --git a/media/eco/ECOUtils.cpp b/media/eco/ECOUtils.cpp
index ab82252..93372bb 100644
--- a/media/eco/ECOUtils.cpp
+++ b/media/eco/ECOUtils.cpp
@@ -50,12 +50,6 @@
     return data;
 }
 
-bool copyKeyValue(const ECOData& src, ECOData* dst) {
-    if (src.isEmpty() || dst == nullptr) return false;
-    dst->mKeyValueStore = src.mKeyValueStore;
-    return true;
-}
-
 }  // namespace eco
 }  // namespace media
 }  // namespace android
\ No newline at end of file
diff --git a/media/eco/aidl/android/media/eco/ECOData.aidl b/media/eco/aidl/android/media/eco/ECOData.aidl
index 162cd89..c34a57d 100644
--- a/media/eco/aidl/android/media/eco/ECOData.aidl
+++ b/media/eco/aidl/android/media/eco/ECOData.aidl
@@ -17,4 +17,4 @@
 package android.media.eco;
 
 /** @hide */
-parcelable ECOData cpp_header "eco/ECOData.h";
\ No newline at end of file
+parcelable ECOData ndk_header "eco/ECOData.h";
diff --git a/media/eco/aidl/android/media/eco/IECOServiceInfoListener.aidl b/media/eco/aidl/android/media/eco/IECOServiceInfoListener.aidl
index bf5bd88..12dc649 100644
--- a/media/eco/aidl/android/media/eco/IECOServiceInfoListener.aidl
+++ b/media/eco/aidl/android/media/eco/IECOServiceInfoListener.aidl
@@ -17,7 +17,6 @@
 package android.media.eco;
 
 import android.media.eco.ECOData;
-import android.os.IBinder;
 
 /**
  * Binder interface for ECO service information listener.
@@ -60,4 +59,4 @@
      * Handle the new info from ECOSession. This should only be called by ECOSession.
      */
     oneway void onNewInfo(in ECOData newInfo);
-}
\ No newline at end of file
+}
diff --git a/media/eco/aidl/android/media/eco/IECOServiceStatsProvider.aidl b/media/eco/aidl/android/media/eco/IECOServiceStatsProvider.aidl
index 6e2f9c3..32f23be 100644
--- a/media/eco/aidl/android/media/eco/IECOServiceStatsProvider.aidl
+++ b/media/eco/aidl/android/media/eco/IECOServiceStatsProvider.aidl
@@ -16,7 +16,6 @@
 
 package android.media.eco;
 
-import android.os.IBinder;
 
 /**
 * An interface for providers that provides various statistics to ECO service.
diff --git a/media/eco/include/eco/ECOData.h b/media/eco/include/eco/ECOData.h
index 737235a..a06f0e6 100644
--- a/media/eco/include/eco/ECOData.h
+++ b/media/eco/include/eco/ECOData.h
@@ -17,13 +17,15 @@
 #ifndef ANDROID_MEDIA_ECO_DATA_H_
 #define ANDROID_MEDIA_ECO_DATA_H_
 
-#include <binder/Parcel.h>
-#include <binder/Parcelable.h>
+#include <android/binder_auto_utils.h>
+#include <android/binder_parcel.h>
+#include <android/binder_status.h>
 
 #include <string>
 #include <unordered_map>
 #include <variant>
 
+namespace aidl {
 namespace android {
 namespace media {
 namespace eco {
@@ -71,7 +73,7 @@
 *   // Set encoding bitrate.
 *   data->setInt32("stats-encoder-target-bitrate-bps", 22000000);
 */
-class ECOData : public Parcelable {
+class ECOData {
 public:
     using ECODataValueType =
             std::variant<int32_t, int64_t, size_t, float, double, std::string, int8_t>;
@@ -130,8 +132,8 @@
     /**
     * Serialization over Binder
     */
-    status_t readFromParcel(const Parcel* parcel) override;
-    status_t writeToParcel(Parcel* parcel) const override;
+    binder_status_t readFromParcel(const AParcel* parcel);
+    binder_status_t writeToParcel(AParcel* parcel) const;
 
     /* Returns the type of the data. */
     int32_t getDataType() const;
@@ -191,6 +193,12 @@
 
     template <typename T>
     ECODataStatus findValue(const std::string& key, T* out) const;
+
+    static bool copyKeyValue(const ECOData& src, ECOData* dst) {
+        if (src.isEmpty() || dst == nullptr) return false;
+        dst->mKeyValueStore = src.mKeyValueStore;
+        return true;
+    }
 };
 
 // A simple ECOData iterator that will iterate over all the key value paris in ECOData.
@@ -217,5 +225,6 @@
 }  // namespace eco
 }  // namespace media
 }  // namespace android
+}  // namespace aidl
 
 #endif  // ANDROID_MEDIA_ECO_DATA_H_
diff --git a/media/eco/include/eco/ECODataKey.h b/media/eco/include/eco/ECODataKey.h
index c70c328..bcae6c9 100644
--- a/media/eco/include/eco/ECODataKey.h
+++ b/media/eco/include/eco/ECODataKey.h
@@ -17,8 +17,8 @@
 #define ANDROID_MEDIA_ECO_DATA_KEY_H_
 
 #include <android-base/unique_fd.h>
-#include <binder/Parcel.h>
-#include <binder/Parcelable.h>
+#include <android/binder_auto_utils.h>
+#include <android/binder_parcel.h>
 #include <stdint.h>
 #include <sys/mman.h>
 
diff --git a/media/eco/include/eco/ECODebug.h b/media/eco/include/eco/ECODebug.h
index ff0e8b5..520a013 100644
--- a/media/eco/include/eco/ECODebug.h
+++ b/media/eco/include/eco/ECODebug.h
@@ -25,6 +25,8 @@
 namespace android {
 namespace media {
 namespace eco {
+using aidl::android::media::eco::ECOData;
+using aidl::android::media::eco::ECODataStatus;
 
 static const char* kDisableEcoServiceProperty = "vendor.media.ecoservice.disable";
 static const char* kDebugLogsLevelProperty = "vendor.media.ecoservice.log.level";
@@ -52,14 +54,10 @@
 void updateLogLevel();
 
 // Convenience methods for constructing binder::Status objects for error returns
-#define STATUS_ERROR(errorCode, errorString)  \
-    binder::Status::fromServiceSpecificError( \
-            errorCode, String8::format("%s:%d: %s", __FUNCTION__, __LINE__, errorString))
+#define STATUS_ERROR(errorCode, errorString) ndk::ScopedAStatus::fromServiceSpecificError(errorCode)
 
 #define STATUS_ERROR_FMT(errorCode, errorString, ...) \
-    binder::Status::fromServiceSpecificError(         \
-            errorCode,                                \
-            String8::format("%s:%d: " errorString, __FUNCTION__, __LINE__, __VA_ARGS__))
+    ndk::ScopedAStatus::fromServiceSpecificError(errorCode)
 
 }  // namespace eco
 }  // namespace media
diff --git a/media/eco/include/eco/ECOService.h b/media/eco/include/eco/ECOService.h
index d0d732a..f528949 100644
--- a/media/eco/include/eco/ECOService.h
+++ b/media/eco/include/eco/ECOService.h
@@ -17,8 +17,10 @@
 #ifndef ANDROID_MEDIA_ECO_SERVICE_H_
 #define ANDROID_MEDIA_ECO_SERVICE_H_
 
-#include <android/media/eco/BnECOService.h>
-#include <binder/IServiceManager.h>
+#include <aidl/android/media/eco/BnECOService.h>
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
+#include <utils/Log.h>
 #include <utils/Mutex.h>
 
 #include <list>
@@ -30,9 +32,11 @@
 namespace media {
 namespace eco {
 
-using android::sp;
-using android::binder::Status;
+using aidl::android::media::eco::BnECOService;
+using aidl::android::media::eco::ECOData;
+using aidl::android::media::eco::ECODataStatus;
 using android::media::eco::ECOSession;
+using ndk::ScopedAStatus;
 
 /**
  * ECO (Encoder Camera Optimization) service.
@@ -50,36 +54,36 @@
  * ECOServiceStatsProvider and ECOServiceInfoListener should remove themselves from ECOSession.
  * Then ECOService will safely destroy the ECOSession.
  */
-class ECOService : public BnECOService,
-                   public virtual IBinder::DeathRecipient {
+class ECOService : public BnECOService {
+    using ::ndk::ICInterface::dump;
 
 public:
     ECOService();
 
     virtual ~ECOService() = default;
 
-    virtual Status obtainSession(int32_t width, int32_t height, bool isCameraRecording,
-                                 sp<IECOSession>* _aidl_return);
+    virtual ScopedAStatus obtainSession(int32_t width, int32_t height, bool isCameraRecording,
+                                        std::shared_ptr<IECOSession>* _aidl_return);
 
-    virtual Status getNumOfSessions(int32_t* _aidl_return);
+    virtual ScopedAStatus getNumOfSessions(int32_t* _aidl_return);
 
-    virtual Status getSessions(::std::vector<sp<IBinder>>* _aidl_return);
+    virtual ScopedAStatus getSessions(std::vector<::ndk::SpAIBinder>* _aidl_return);
 
     static status_t instantiate() {
-        bool allowIsolated = false;
-        int dumpFlags = IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT;
-        sp<IServiceManager> sm(defaultServiceManager());
-        return sm->addService(String16(getServiceName()), new ECOService(), allowIsolated,
-                              dumpFlags);
+        std::shared_ptr<ECOService> service = ::ndk::SharedRefBase::make<ECOService>();
+        binder_status_t status =
+                AServiceManager_addService(service->asBinder().get(), getServiceName());
+        ABinderProcess_startThreadPool();
+        return (status == EX_NONE) ? STATUS_OK : STATUS_UNKNOWN_ERROR;
     }
 
     // Implementation of BinderService<T>
     static char const* getServiceName() { return "media.ecoservice"; }
 
     // IBinder::DeathRecipient implementation
-    virtual void binderDied(const wp<IBinder>& who);
+    virtual void binderDied(const std::weak_ptr<AIBinder>& who);
 
-    virtual status_t dump(int fd, const Vector<String16>& args);
+    virtual status_t dump(int fd, const std::vector<std::string>& args);
 
 private:
     // Lock guarding ECO service state
@@ -114,10 +118,11 @@
     };
 
     // Map from SessionConfig to session.
-    std::unordered_map<SessionConfig, wp<ECOSession>, SessionConfigHash> mSessionConfigToSessionMap;
+    std::unordered_map<SessionConfig, std::weak_ptr<ECOSession>, SessionConfigHash>
+            mSessionConfigToSessionMap;
 
-    using MapIterType =
-            std::unordered_map<SessionConfig, wp<ECOSession>, SessionConfigHash>::iterator;
+    using MapIterType = std::unordered_map<SessionConfig, std::weak_ptr<ECOSession>,
+                                           SessionConfigHash>::iterator;
 
     // A helpful function to traverse the mSessionConfigToSessionMap, remove the entry that
     // does not exist any more and call |callback| when the entry is valid.
diff --git a/media/eco/include/eco/ECOServiceInfoListener.h b/media/eco/include/eco/ECOServiceInfoListener.h
index 86d379f..448bab2 100644
--- a/media/eco/include/eco/ECOServiceInfoListener.h
+++ b/media/eco/include/eco/ECOServiceInfoListener.h
@@ -17,8 +17,8 @@
 #ifndef ANDROID_MEDIA_ECO_SERVICE_INFO_LISTENER_H_
 #define ANDROID_MEDIA_ECO_SERVICE_INFO_LISTENER_H_
 
-#include <android/media/eco/BnECOServiceInfoListener.h>
-#include <android/media/eco/IECOSession.h>
+#include <aidl/android/media/eco/BnECOServiceInfoListener.h>
+#include <aidl/android/media/eco/IECOSession.h>
 
 #include <condition_variable>
 #include <memory>
@@ -31,27 +31,28 @@
 namespace media {
 namespace eco {
 
-using ::android::binder::Status;
+using aidl::android::media::eco::BnECOServiceInfoListener;
+using aidl::android::media::eco::ECOData;
+using aidl::android::media::eco::ECODataStatus;
+using ::ndk::ScopedAStatus;
 
 /**
  * ECOServiceInfoListener interface class.
  */
-class ECOServiceInfoListener : public BnECOServiceInfoListener,
-                               public virtual IBinder::DeathRecipient {
-
+class ECOServiceInfoListener : public BnECOServiceInfoListener {
 public:
     // Create a ECOServiceInfoListener with specifed width, height and isCameraRecording.
     ECOServiceInfoListener(int32_t width, int32_t height, bool isCameraRecording);
 
     virtual ~ECOServiceInfoListener() {}
 
-    virtual Status getType(int32_t* _aidl_return) = 0;
-    virtual Status getName(::android::String16* _aidl_return) = 0;
-    virtual Status getECOSession(::android::sp<::android::IBinder>* _aidl_return) = 0;
-    virtual Status onNewInfo(const ::android::media::eco::ECOData& newInfo) = 0;
+    virtual ScopedAStatus getType(int32_t* _aidl_return) = 0;
+    virtual ScopedAStatus getName(std::string* _aidl_return) = 0;
+    virtual ScopedAStatus getECOSession(::ndk::SpAIBinder* _aidl_return) = 0;
+    virtual ScopedAStatus onNewInfo(const ::android::media::eco::ECOData& newInfo) = 0;
 
     // IBinder::DeathRecipient implementation.
-    virtual void binderDied(const wp<IBinder>& who);
+    virtual void binderDied(const std::weak_ptr<AIBinder>& who);
 
 private:
 };
diff --git a/media/eco/include/eco/ECOServiceStatsProvider.h b/media/eco/include/eco/ECOServiceStatsProvider.h
index c81f0b8..b7cf4f2 100644
--- a/media/eco/include/eco/ECOServiceStatsProvider.h
+++ b/media/eco/include/eco/ECOServiceStatsProvider.h
@@ -17,9 +17,10 @@
 #ifndef ANDROID_MEDIA_ECO_SERVICE_STATS_PROVIDER_H_
 #define ANDROID_MEDIA_ECO_SERVICE_STATS_PROVIDER_H_
 
-#include <android/media/eco/BnECOServiceStatsProvider.h>
-#include <android/media/eco/IECOSession.h>
-#include <android/media/eco/IECOService.h>
+#include <aidl/android/media/eco/BnECOServiceStatsProvider.h>
+#include <aidl/android/media/eco/IECOService.h>
+#include <aidl/android/media/eco/IECOSession.h>
+#include <utils/Log.h>
 
 #include <condition_variable>
 #include <memory>
@@ -33,39 +34,43 @@
 namespace media {
 namespace eco {
 
-using ::android::binder::Status;
+using aidl::android::media::eco::BnECOServiceStatsProvider;
+using aidl::android::media::eco::ECOData;
+using aidl::android::media::eco::ECODataStatus;
+using aidl::android::media::eco::IECOService;
+using aidl::android::media::eco::IECOSession;
+using ::ndk::ScopedAStatus;
 
 /**
  * ECOServiceStatsProvider interface class.
  */
-class ECOServiceStatsProvider : public BnECOServiceStatsProvider,
-                                public virtual IBinder::DeathRecipient {
-
+class ECOServiceStatsProvider : public BnECOServiceStatsProvider {
 public:
+    ECOServiceStatsProvider(int32_t width, int32_t height, bool isCameraRecording,
+                            std::shared_ptr<IECOSession>& session, const char* name);
     virtual ~ECOServiceStatsProvider() {}
 
-    virtual Status getType(int32_t* _aidl_return);
-    virtual Status getName(::android::String16* _aidl_return);
-    virtual Status getECOSession(::android::sp<::android::IBinder>* _aidl_return);
-    virtual Status isCameraRecording(bool* _aidl_return);
+    virtual ScopedAStatus getType(int32_t* _aidl_return);
+    virtual ScopedAStatus getName(std::string* _aidl_return);
+    virtual ScopedAStatus getECOSession(::ndk::SpAIBinder* _aidl_return);
+    virtual ScopedAStatus isCameraRecording(bool* _aidl_return);
 
     // IBinder::DeathRecipient implementation
-    virtual void binderDied(const wp<IBinder>& who);
+    virtual void binderDied(const std::weak_ptr<AIBinder>& who);
 
     bool updateStats(const ECOData& data);
     bool addProvider();
     bool removeProvider();
     float getFramerate(int64_t currTimestamp);
-    static android::sp<ECOServiceStatsProvider> create(
-        int32_t width, int32_t height, bool isCameraRecording, const char* name);
+    static std::shared_ptr<ECOServiceStatsProvider> create(int32_t width, int32_t height,
+                                                           bool isCameraRecording,
+                                                           const char* name);
 
 private:
-    ECOServiceStatsProvider(int32_t width, int32_t height, bool isCameraRecording,
-                            android::sp<IECOSession>& session, const char* name);
     int32_t mWidth = 0;
     int32_t mHeight = 0;
     bool mIsCameraRecording = false;
-    android::sp<IECOSession> mECOSession = nullptr;
+    std::shared_ptr<IECOSession> mECOSession = nullptr;
     const char* mProviderName = nullptr;
     int64_t mLastFrameTimestamp = 0;
 };
diff --git a/media/eco/include/eco/ECOSession.h b/media/eco/include/eco/ECOSession.h
index 9fb0bdc..57965a7 100644
--- a/media/eco/include/eco/ECOSession.h
+++ b/media/eco/include/eco/ECOSession.h
@@ -17,8 +17,9 @@
 #ifndef ANDROID_MEDIA_ECO_SESSION_H_
 #define ANDROID_MEDIA_ECO_SESSION_H_
 
-#include <android/media/eco/BnECOSession.h>
-#include <android/media/eco/IECOServiceStatsProvider.h>
+#include <aidl/android/media/eco/BnECOSession.h>
+#include <aidl/android/media/eco/IECOServiceInfoListener.h>
+#include <aidl/android/media/eco/IECOServiceStatsProvider.h>
 
 #include <condition_variable>
 #include <deque>
@@ -36,8 +37,12 @@
 namespace media {
 namespace eco {
 
-using ::android::binder::Status;
-
+using aidl::android::media::eco::BnECOSession;
+using aidl::android::media::eco::ECOData;
+using aidl::android::media::eco::ECODataStatus;
+using aidl::android::media::eco::IECOServiceInfoListener;
+using aidl::android::media::eco::IECOServiceStatsProvider;
+using ::ndk::ScopedAStatus;
 /**
  * ECO Session.
  *
@@ -46,37 +51,40 @@
  * it only supports resolution of up to 720P and only for camera recording use case. Also, it only
  * supports encoder as the provider and camera as listener.
  */
-class ECOSession : public BnECOSession,
-                   public virtual IBinder::DeathRecipient {
+class ECOSession : public BnECOSession {
+    using ::ndk::ICInterface::dump;
 
 public:
+    // Only the  ECOService could create ECOSession.
+    ECOSession(int32_t width, int32_t height, bool isCameraRecording);
+
     virtual ~ECOSession();
 
-    virtual Status addStatsProvider(const sp<IECOServiceStatsProvider>& provider,
-                                    const ECOData& statsConfig, /*out*/ bool* status);
+    virtual ScopedAStatus addStatsProvider(
+            const std::shared_ptr<IECOServiceStatsProvider>& provider, const ECOData& statsConfig,
+            /*out*/ bool* status);
 
-    virtual Status removeStatsProvider(const sp<IECOServiceStatsProvider>&, bool*);
+    virtual ScopedAStatus removeStatsProvider(const std::shared_ptr<IECOServiceStatsProvider>&,
+                                              bool*);
 
-    virtual Status addInfoListener(const sp<IECOServiceInfoListener>&,
-                                   const ECOData& listenerConfig,
-                                   /*out*/ bool* status);
+    virtual ScopedAStatus addInfoListener(const std::shared_ptr<IECOServiceInfoListener>&,
+                                          const ECOData& listenerConfig,
+                                          /*out*/ bool* status);
 
-    virtual Status removeInfoListener(const sp<IECOServiceInfoListener>&, bool*);
+    virtual ScopedAStatus removeInfoListener(const std::shared_ptr<IECOServiceInfoListener>&,
+                                             bool*);
 
-    virtual Status pushNewStats(const ECOData&, bool*);
+    virtual ScopedAStatus pushNewStats(const ECOData&, bool*);
 
-    virtual Status getWidth(int32_t* _aidl_return);
+    virtual ScopedAStatus getWidth(int32_t* _aidl_return);
 
-    virtual Status getHeight(int32_t* _aidl_return);
+    virtual ScopedAStatus getHeight(int32_t* _aidl_return);
 
-    virtual Status getIsCameraRecording(bool*);
+    virtual ScopedAStatus getIsCameraRecording(bool*);
 
-    virtual Status getNumOfListeners(int32_t*);
+    virtual ScopedAStatus getNumOfListeners(int32_t*);
 
-    virtual Status getNumOfProviders(int32_t*);
-
-    // IBinder::DeathRecipient implementation
-    virtual void binderDied(const wp<IBinder>& who);
+    virtual ScopedAStatus getNumOfProviders(int32_t*);
 
     // Grant permission to EcoSessionTest to run test.
     friend class EcoSessionTest;
@@ -85,14 +93,11 @@
     friend class ECOService;
 
 protected:
-    static android::sp<ECOSession> createECOSession(int32_t width, int32_t height,
-                                                    bool isCameraRecording);
+    static std::shared_ptr<ECOSession> createECOSession(int32_t width, int32_t height,
+                                                        bool isCameraRecording);
 
 private:
-    // Only the  ECOService could create ECOSession.
-    ECOSession(int32_t width, int32_t height, bool isCameraRecording);
-
-    virtual status_t dump(int fd, const Vector<String16>& args);
+    virtual status_t dump(int fd, const std::vector<std::string>& args);
 
     // Start the main thread for processing the stats and pushing info to listener.
     static void startThread(ECOSession* session);
@@ -133,11 +138,11 @@
     } QpCondition;
     QpCondition mListenerQpCondition;
 
-    android::sp<IECOServiceInfoListener> mListener;
-    String16 mListenerName;
+    std::shared_ptr<IECOServiceInfoListener> mListener;
+    std::string mListenerName;
 
-    android::sp<IECOServiceStatsProvider> mProvider;
-    String16 mProviderName;
+    std::shared_ptr<IECOServiceStatsProvider> mProvider;
+    std::string mProviderName;
 
     // Main thread for processing the events from provider.
     std::thread mThread;
diff --git a/media/eco/include/eco/ECOUtils.h b/media/eco/include/eco/ECOUtils.h
index e5bbfcc..1a266c9 100644
--- a/media/eco/include/eco/ECOUtils.h
+++ b/media/eco/include/eco/ECOUtils.h
@@ -28,6 +28,8 @@
 namespace android {
 namespace media {
 namespace eco {
+using aidl::android::media::eco::ECOData;
+using aidl::android::media::eco::ECODataStatus;
 
 #define RETURN_STATUS_IF_ERROR(expr)  \
     {                                 \
@@ -121,8 +123,6 @@
     ECOData toEcoData(ECOData::ECODatatype dataType);
 };
 
-bool copyKeyValue(const ECOData& src, ECOData* dst);
-
 }  // namespace eco
 }  // namespace media
 }  // namespace android
diff --git a/media/eco/tests/Android.bp b/media/eco/tests/Android.bp
index 99c93cd..54ca426 100644
--- a/media/eco/tests/Android.bp
+++ b/media/eco/tests/Android.bp
@@ -10,8 +10,8 @@
         "-Wall",
         "-Werror",
     ],
+
     shared_libs: [
-        "libbinder",
         "libbinder_ndk",
         "libcutils",
         "libutils",
diff --git a/media/eco/tests/EcoDataTest.cpp b/media/eco/tests/EcoDataTest.cpp
index f93b692..835e4f7 100644
--- a/media/eco/tests/EcoDataTest.cpp
+++ b/media/eco/tests/EcoDataTest.cpp
@@ -20,8 +20,8 @@
 #define LOG_TAG "ECODataTest"
 
 #include <android-base/unique_fd.h>
-#include <binder/Parcel.h>
-#include <binder/Parcelable.h>
+#include <android/binder_parcel.h>
+#include <android/binder_status.h>
 #include <cutils/ashmem.h>
 #include <gtest/gtest.h>
 #include <math.h>
@@ -35,6 +35,8 @@
 namespace android {
 namespace media {
 namespace eco {
+using aidl::android::media::eco::ECOData;
+using aidl::android::media::eco::ECODataStatus;
 
 TEST(EcoDataTest, TestConstructor1) {
     std::unique_ptr<ECOData> data = std::make_unique<ECOData>();
@@ -302,16 +304,16 @@
         sourceData->set(it->first, it->second);
     }
 
-    std::unique_ptr<Parcel> parcel = std::make_unique<Parcel>();
-    EXPECT_TRUE(sourceData->writeToParcel(parcel.get()) == NO_ERROR);
+    AParcel* parcel = AParcel_create();
+    EXPECT_TRUE(sourceData->writeToParcel(parcel) == STATUS_OK);
 
     // Rewind the data position of the parcel for this test. Otherwise, the following read will not
     // start from the beginning.
-    parcel->setDataPosition(0);
+    AParcel_setDataPosition(parcel, 0);
 
     // Reads the parcel back into a new ECOData
     std::unique_ptr<ECOData> dstData = std::make_unique<ECOData>();
-    EXPECT_TRUE(dstData->readFromParcel(parcel.get()) == NO_ERROR);
+    EXPECT_TRUE(dstData->readFromParcel(parcel) == STATUS_OK);
 
     // Checks the data type, time and number of entries.
     EXPECT_EQ(sourceData->getNumOfEntries(), dstData->getNumOfEntries());
@@ -331,8 +333,7 @@
 
     std::unique_ptr<ECOData> sourceData = std::make_unique<ECOData>(kDataType, kDataTimeUs);
 
-    std::unique_ptr<Parcel> parcel = std::make_unique<Parcel>();
-    EXPECT_TRUE(sourceData->writeToParcel(nullptr) != NO_ERROR);
+    EXPECT_TRUE(sourceData->writeToParcel(nullptr) != STATUS_OK);
 }
 
 TEST(EcoDataTest, TestReadInvalidParcel) {
@@ -348,20 +349,21 @@
         sourceData->set(it->first, it->second);
     }
 
-    std::unique_ptr<Parcel> parcel = std::make_unique<Parcel>();
-    EXPECT_TRUE(sourceData->writeToParcel(parcel.get()) == NO_ERROR);
+    AParcel* parcel = AParcel_create();
+    EXPECT_TRUE(sourceData->writeToParcel(parcel) == STATUS_OK);
 
     // Corrupt the parcel by write random data to the beginning.
-    parcel->setDataPosition(4);
-    parcel->writeCString("invalid-data");
+    AParcel_setDataPosition(parcel, 4);
+    char* invalid_string = (char*)"invalid-data";
+    AParcel_writeString(parcel, invalid_string, strlen(invalid_string));
 
-    parcel->setDataPosition(0);
+    AParcel_setDataPosition(parcel, 0);
 
     // Reads the parcel back into a new ECOData
     std::unique_ptr<ECOData> dstData = std::make_unique<ECOData>();
-    EXPECT_TRUE(dstData->readFromParcel(parcel.get()) != NO_ERROR);
+    EXPECT_TRUE(dstData->readFromParcel(parcel) != STATUS_OK);
 }
 
 }  // namespace eco
 }  // namespace media
-}  // namespace android
\ No newline at end of file
+}  // namespace android
diff --git a/media/eco/tests/EcoServiceTest.cpp b/media/eco/tests/EcoServiceTest.cpp
index df54c53..8a8bbbf 100644
--- a/media/eco/tests/EcoServiceTest.cpp
+++ b/media/eco/tests/EcoServiceTest.cpp
@@ -20,9 +20,9 @@
 #define LOG_TAG "ECOServiceTest"
 
 #include <android-base/unique_fd.h>
-#include <binder/Parcel.h>
-#include <binder/Parcelable.h>
-#include <binder/IServiceManager.h>
+#include <android/binder_auto_utils.h>
+#include <android/binder_manager.h>
+#include <android/binder_parcel.h>
 #include <cutils/ashmem.h>
 #include <gtest/gtest.h>
 #include <math.h>
@@ -40,9 +40,7 @@
 namespace media {
 namespace eco {
 
-using ::android::IBinder;
-using android::sp;
-using ::android::binder::Status;
+using ::ndk::ScopedAStatus;
 
 namespace {
 
@@ -58,106 +56,101 @@
 public:
     EcoServiceTest() { ALOGD("EcoServiceTest created"); }
 
-    sp<IECOService> createService() {
-        android::sp<android::IServiceManager> sm = android::defaultServiceManager();
-        assert(sm != 0);
-        android::sp<android::IBinder> binder = sm->getService(String16("media.ecoservice"));
-
-        if (binder == 0) {
+    std::shared_ptr<IECOService> createService() {
+        mECOService = IECOService::fromBinder(
+                ndk::SpAIBinder(AServiceManager_waitForService("media.ecoservice")));
+        if (mECOService == nullptr) {
             ALOGE("Failed to connect to ecoservice");
             return nullptr;
-        } else {
-            ALOGD("Successfully connect to ecoservice");
         }
 
-        mECOService = android::interface_cast<IECOService>(binder);
         return mECOService;
     }
 
     ~EcoServiceTest() { ALOGD("EcoServiceTest destroyed"); }
 
 private:
-    sp<IECOService> mECOService = nullptr;
+    std::shared_ptr<IECOService> mECOService = nullptr;
 };
 
 TEST_F(EcoServiceTest, NormalObtainSessionWithInvalidWidth) {
-    sp<IECOService> service = createService();
+    std::shared_ptr<IECOService> service = createService();
     EXPECT_TRUE(service != nullptr);
 
     // Provider obtains the session from the service.
-    sp<IECOSession> session = nullptr;
+    std::shared_ptr<IECOSession> session = nullptr;
 
     service->obtainSession(-1 /* width */, kTestHeight, kIsCameraRecording, &session);
     EXPECT_FALSE(session);
 }
 
 TEST_F(EcoServiceTest, NormalObtainSessionWithInvalidHeight) {
-    sp<IECOService> service = createService();
+    std::shared_ptr<IECOService> service = createService();
 
     // Provider obtains the session from the service.
-    sp<IECOSession> session = nullptr;
+    std::shared_ptr<IECOSession> session = nullptr;
 
     service->obtainSession(kTestWidth, -1 /* height */, kIsCameraRecording, &session);
     EXPECT_FALSE(session);
 }
 
 TEST_F(EcoServiceTest, NormalObtainSessionWithCameraRecordingFalse) {
-    sp<IECOService> service = createService();
+    std::shared_ptr<IECOService> service = createService();
 
     // Provider obtains the session from the service.
-    sp<IECOSession> session = nullptr;
+    std::shared_ptr<IECOSession> session = nullptr;
 
     service->obtainSession(kTestWidth, kTestHeight, false /* isCameraRecording */, &session);
     EXPECT_TRUE(session);
 }
 
 TEST_F(EcoServiceTest, NormalObtainSingleSession) {
-    sp<IECOService> service = createService();
+    std::shared_ptr<IECOService> service = createService();
     EXPECT_TRUE(service != nullptr);
 
     // Provider obtains the session from the service.
-    sp<IECOSession> session = nullptr;
+    std::shared_ptr<IECOSession> session = nullptr;
 
     service->obtainSession(kTestWidth, kTestHeight, kIsCameraRecording, &session);
     EXPECT_TRUE(session);
 }
 
 TEST_F(EcoServiceTest, NormalObtainSessionTwice) {
-    sp<IECOService> service = createService();
+    std::shared_ptr<IECOService> service = createService();
     EXPECT_TRUE(service != nullptr);
 
     // Provider obtains the session from the service.
-    sp<IECOSession> session1 = nullptr;
+    std::shared_ptr<IECOSession> session1 = nullptr;
 
     service->obtainSession(kTestWidth, kTestHeight, kIsCameraRecording, &session1);
     EXPECT_TRUE(session1);
 
-    sp<IECOSession> session2 = nullptr;
+    std::shared_ptr<IECOSession> session2 = nullptr;
 
     service->obtainSession(kTestWidth, kTestHeight, kIsCameraRecording, &session2);
     EXPECT_TRUE(session2);
 
     // The two session instances should be the same.
-    EXPECT_TRUE(IInterface::asBinder(session1) == IInterface::asBinder(session2));
+    EXPECT_TRUE(session1->asBinder() == session2->asBinder());
 }
 
 TEST_F(EcoServiceTest, ObtainTwoSessions) {
-    sp<IECOService> service = createService();
+    std::shared_ptr<IECOService> service = createService();
     EXPECT_TRUE(service != nullptr);
 
     // Provider obtains the session from the service.
-    sp<IECOSession> session1 = nullptr;
+    std::shared_ptr<IECOSession> session1 = nullptr;
 
     service->obtainSession(kTestWidth, kTestHeight, kIsCameraRecording, &session1);
     EXPECT_TRUE(session1);
 
-    sp<IECOSession> session2 = nullptr;
+    std::shared_ptr<IECOSession> session2 = nullptr;
 
     service->obtainSession(kTestWidth - 1, kTestHeight - 1, kIsCameraRecording, &session2);
     EXPECT_TRUE(session2);
 
     // The two session instances must not be the same.
-    EXPECT_TRUE(IInterface::asBinder(session1) != IInterface::asBinder(session2));
+    EXPECT_TRUE(session1->asBinder() != session2->asBinder());
 
     // Check the session number.
     int32_t count = 0;
@@ -165,16 +158,16 @@
     EXPECT_EQ(count, 2);
 
     // Get the list of sessions from service.
-    std::vector<sp<IBinder>> sessionList;
+    std::vector<::ndk::SpAIBinder> sessionList;
     service->getSessions(&sessionList);
     bool foundFirstSession = false, foundSecondSession = false;
 
-    for (std::vector<sp<IBinder>>::iterator it = sessionList.begin(); it != sessionList.end();
+    for (std::vector<::ndk::SpAIBinder>::iterator it = sessionList.begin(); it != sessionList.end();
          ++it) {
-        if (IInterface::asBinder(session1) == it->get()) {
+        if (session1->asBinder() == it->get()) {
             foundFirstSession = true;
         }
-        if (IInterface::asBinder(session2) == it->get()) {
+        if (session2->asBinder() == it->get()) {
             foundSecondSession = true;
         }
     }
@@ -185,18 +178,19 @@
 }
 
 TEST_F(EcoServiceTest, TestNormalFlowWithOneListenerAndOneProvider) {
-    sp<IECOService> service = createService();
+    std::shared_ptr<IECOService> service = createService();
     EXPECT_TRUE(service != nullptr);
 
     // Provider obtains the session from the service.
-    sp<IECOSession> session = nullptr;
+    std::shared_ptr<IECOSession> session = nullptr;
 
     service->obtainSession(kTestWidth, kTestHeight, kIsCameraRecording, &session);
     EXPECT_TRUE(session);
 
     // Create provider and add it to the session.
-    sp<FakeECOServiceStatsProvider> fakeProvider = new FakeECOServiceStatsProvider(
-            kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate);
+    std::shared_ptr<FakeECOServiceStatsProvider> fakeProvider =
+            ndk::SharedRefBase::make<FakeECOServiceStatsProvider>(kTestWidth, kTestHeight,
+                                                                  kIsCameraRecording, kFrameRate);
     fakeProvider->setECOSession(session);
 
     ECOData providerConfig(ECOData::DATA_TYPE_STATS_PROVIDER_CONFIG,
@@ -205,11 +199,12 @@
     providerConfig.setInt32(KEY_PROVIDER_TYPE,
                             ECOServiceStatsProvider::STATS_PROVIDER_TYPE_VIDEO_ENCODER);
     bool res;
-    Status status = session->addStatsProvider(fakeProvider, providerConfig, &res);
+    ScopedAStatus status = session->addStatsProvider(fakeProvider, providerConfig, &res);
 
     // Create listener and add it to the session.
-    sp<FakeECOServiceInfoListener> fakeListener =
-            new FakeECOServiceInfoListener(kTestWidth, kTestHeight, kIsCameraRecording);
+    std::shared_ptr<FakeECOServiceInfoListener> fakeListener =
+            ndk::SharedRefBase::make<FakeECOServiceInfoListener>(kTestWidth, kTestHeight,
+                                                                 kIsCameraRecording);
     fakeListener->setECOSession(session);
 
     // Create the listener config.
diff --git a/media/eco/tests/EcoSessionTest.cpp b/media/eco/tests/EcoSessionTest.cpp
index 5c8826f..4c496ea 100644
--- a/media/eco/tests/EcoSessionTest.cpp
+++ b/media/eco/tests/EcoSessionTest.cpp
@@ -20,8 +20,8 @@
 #define LOG_TAG "ECOSessionTest"
 
 #include <android-base/unique_fd.h>
-#include <binder/Parcel.h>
-#include <binder/Parcelable.h>
+#include <android/binder_auto_utils.h>
+#include <android/binder_parcel.h>
 #include <cutils/ashmem.h>
 #include <gtest/gtest.h>
 #include <math.h>
@@ -39,8 +39,7 @@
 namespace media {
 namespace eco {
 
-using android::sp;
-using ::android::binder::Status;
+using ::ndk::ScopedAStatus;
 
 static constexpr uint32_t kTestWidth = 1280;
 static constexpr uint32_t kTestHeight = 720;
@@ -54,14 +53,15 @@
 public:
     EcoSessionTest() { ALOGD("EcoSessionTest created"); }
 
-    sp<ECOSession> createSession(int32_t width, int32_t height, bool isCameraRecording) {
+    std::shared_ptr<ECOSession> createSession(int32_t width, int32_t height,
+                                              bool isCameraRecording) {
         mSession = ECOSession::createECOSession(width, height, isCameraRecording);
         if (mSession == nullptr) return nullptr;
         return mSession;
     }
 
 private:
-    sp<ECOSession> mSession = nullptr;
+    std::shared_ptr<ECOSession> mSession = nullptr;
 };
 
 TEST_F(EcoSessionTest, TestConstructorWithInvalidParameters) {
@@ -91,106 +91,121 @@
 }
 
 TEST_F(EcoSessionTest, TestAddProviderWithoutSpecifyEcoDataType) {
-    sp<ECOSession> ecoSession = createSession(kTestWidth, kTestHeight, kIsCameraRecording);
+    std::shared_ptr<ECOSession> ecoSession =
+            createSession(kTestWidth, kTestHeight, kIsCameraRecording);
     EXPECT_TRUE(ecoSession);
 
-    sp<FakeECOServiceStatsProvider> fakeProvider = new FakeECOServiceStatsProvider(
-            kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
+    std::shared_ptr<FakeECOServiceStatsProvider> fakeProvider =
+            ndk::SharedRefBase::make<FakeECOServiceStatsProvider>(
+                    kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
 
     ECOData providerConfig;
     bool res;
-    Status status = ecoSession->addStatsProvider(fakeProvider, providerConfig, &res);
+    ScopedAStatus status = ecoSession->addStatsProvider(fakeProvider, providerConfig, &res);
     EXPECT_FALSE(status.isOk());
 }
 
 TEST_F(EcoSessionTest, TestAddProviderWithWrongEcoDataType) {
-    sp<ECOSession> ecoSession = createSession(kTestWidth, kTestHeight, kIsCameraRecording);
+    std::shared_ptr<ECOSession> ecoSession =
+            createSession(kTestWidth, kTestHeight, kIsCameraRecording);
     EXPECT_TRUE(ecoSession);
 
-    sp<FakeECOServiceStatsProvider> fakeProvider = new FakeECOServiceStatsProvider(
-            kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
+    std::shared_ptr<FakeECOServiceStatsProvider> fakeProvider =
+            ndk::SharedRefBase::make<FakeECOServiceStatsProvider>(
+                    kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
 
     ECOData providerConfig(ECOData::DATA_TYPE_INFO_LISTENER_CONFIG,
                            systemTime(SYSTEM_TIME_BOOTTIME));
     bool res;
-    Status status = ecoSession->addStatsProvider(fakeProvider, providerConfig, &res);
+    ScopedAStatus status = ecoSession->addStatsProvider(fakeProvider, providerConfig, &res);
     EXPECT_FALSE(status.isOk());
 }
 
 TEST_F(EcoSessionTest, TestAddNormalProvider) {
-    sp<ECOSession> ecoSession = createSession(kTestWidth, kTestHeight, kIsCameraRecording);
+    std::shared_ptr<ECOSession> ecoSession =
+            createSession(kTestWidth, kTestHeight, kIsCameraRecording);
     EXPECT_TRUE(ecoSession);
 
-    sp<FakeECOServiceStatsProvider> fakeProvider = new FakeECOServiceStatsProvider(
-            kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
+    std::shared_ptr<FakeECOServiceStatsProvider> fakeProvider =
+            ndk::SharedRefBase::make<FakeECOServiceStatsProvider>(
+                    kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
 
     ECOData providerConfig(ECOData::DATA_TYPE_STATS_PROVIDER_CONFIG,
                            systemTime(SYSTEM_TIME_BOOTTIME));
     bool res;
-    Status status = ecoSession->addStatsProvider(fakeProvider, providerConfig, &res);
+    ScopedAStatus status = ecoSession->addStatsProvider(fakeProvider, providerConfig, &res);
     EXPECT_TRUE(status.isOk());
 }
 
 // Add two providers and expect failure as ECOService1.0 only supports one provider and one
 // listener.
 TEST_F(EcoSessionTest, TestAddTwoProvider) {
-    sp<ECOSession> ecoSession = createSession(kTestWidth, kTestHeight, kIsCameraRecording);
+    std::shared_ptr<ECOSession> ecoSession =
+            createSession(kTestWidth, kTestHeight, kIsCameraRecording);
     EXPECT_TRUE(ecoSession);
 
-    sp<FakeECOServiceStatsProvider> fakeProvider1 = new FakeECOServiceStatsProvider(
-            kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
+    std::shared_ptr<FakeECOServiceStatsProvider> fakeProvider1 =
+            ndk::SharedRefBase::make<FakeECOServiceStatsProvider>(
+                    kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
 
     ECOData providerConfig(ECOData::DATA_TYPE_STATS_PROVIDER_CONFIG,
                            systemTime(SYSTEM_TIME_BOOTTIME));
     bool res;
-    Status status = ecoSession->addStatsProvider(fakeProvider1, providerConfig, &res);
+    ScopedAStatus status = ecoSession->addStatsProvider(fakeProvider1, providerConfig, &res);
     EXPECT_TRUE(status.isOk());
 
-    sp<FakeECOServiceStatsProvider> fakeProvider2 = new FakeECOServiceStatsProvider(
-            kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
+    std::shared_ptr<FakeECOServiceStatsProvider> fakeProvider2 =
+            ndk::SharedRefBase::make<FakeECOServiceStatsProvider>(
+                    kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
     status = ecoSession->addStatsProvider(fakeProvider2, providerConfig, &res);
     EXPECT_FALSE(status.isOk());
 }
 
 TEST_F(EcoSessionTest, TestAddListenerWithDifferentHeight) {
-    sp<ECOSession> ecoSession = createSession(kTestWidth, kTestHeight, kIsCameraRecording);
+    std::shared_ptr<ECOSession> ecoSession =
+            createSession(kTestWidth, kTestHeight, kIsCameraRecording);
     EXPECT_TRUE(ecoSession);
 
-    sp<FakeECOServiceInfoListener> fakeListener = new FakeECOServiceInfoListener(
-            kTestWidth - 1, kTestHeight, kIsCameraRecording, ecoSession);
+    std::shared_ptr<FakeECOServiceInfoListener> fakeListener =
+            ndk::SharedRefBase::make<FakeECOServiceInfoListener>(kTestWidth - 1, kTestHeight,
+                                                                 kIsCameraRecording, ecoSession);
 
     ECOData ListenerConfig(ECOData::DATA_TYPE_INFO_LISTENER_CONFIG,
                            systemTime(SYSTEM_TIME_BOOTTIME));
     bool res;
-    Status status = ecoSession->addInfoListener(fakeListener, ListenerConfig, &res);
+    ScopedAStatus status = ecoSession->addInfoListener(fakeListener, ListenerConfig, &res);
     EXPECT_FALSE(status.isOk());
 }
 
 TEST_F(EcoSessionTest, TestAddListenerWithDifferentWidth) {
-    sp<ECOSession> ecoSession = createSession(kTestWidth, kTestHeight, kIsCameraRecording);
+    std::shared_ptr<ECOSession> ecoSession =
+            createSession(kTestWidth, kTestHeight, kIsCameraRecording);
     EXPECT_TRUE(ecoSession);
 
-    sp<FakeECOServiceInfoListener> fakeListener = new FakeECOServiceInfoListener(
-            kTestWidth, kTestHeight - 1, kIsCameraRecording, ecoSession);
+    std::shared_ptr<FakeECOServiceInfoListener> fakeListener =
+            ndk::SharedRefBase::make<FakeECOServiceInfoListener>(kTestWidth, kTestHeight - 1,
+                                                                 kIsCameraRecording, ecoSession);
 
     ECOData ListenerConfig(ECOData::DATA_TYPE_INFO_LISTENER_CONFIG,
                            systemTime(SYSTEM_TIME_BOOTTIME));
     bool res;
-    Status status = ecoSession->addInfoListener(fakeListener, ListenerConfig, &res);
+    ScopedAStatus status = ecoSession->addInfoListener(fakeListener, ListenerConfig, &res);
     EXPECT_FALSE(status.isOk());
 }
 
 TEST_F(EcoSessionTest, TestAddListenerWithCameraRecordingFalse) {
-    sp<ECOSession> ecoSession = createSession(kTestWidth, kTestHeight, kIsCameraRecording);
+    std::shared_ptr<ECOSession> ecoSession =
+            createSession(kTestWidth, kTestHeight, kIsCameraRecording);
     EXPECT_TRUE(ecoSession);
 
-    sp<FakeECOServiceInfoListener> fakeListener = new FakeECOServiceInfoListener(
-            kTestWidth, kTestHeight, !kIsCameraRecording, ecoSession);
+    std::shared_ptr<FakeECOServiceInfoListener> fakeListener =
+            ndk::SharedRefBase::make<FakeECOServiceInfoListener>(kTestWidth, kTestHeight,
+                                                                 !kIsCameraRecording, ecoSession);
 
     ECOData ListenerConfig(ECOData::DATA_TYPE_INFO_LISTENER_CONFIG,
                            systemTime(SYSTEM_TIME_BOOTTIME));
     bool res;
-    Status status = ecoSession->addInfoListener(fakeListener, ListenerConfig, &res);
+    ScopedAStatus status = ecoSession->addInfoListener(fakeListener, ListenerConfig, &res);
     EXPECT_FALSE(status.isOk());
 }
 
@@ -202,22 +217,25 @@
     static constexpr int kServiceWaitTimeMs = 10;
 
     // Create the session.
-    sp<ECOSession> ecoSession = createSession(kTestWidth, kTestHeight, kIsCameraRecording);
+    std::shared_ptr<ECOSession> ecoSession =
+            createSession(kTestWidth, kTestHeight, kIsCameraRecording);
 
     // Add provider.
-    sp<FakeECOServiceStatsProvider> fakeProvider = new FakeECOServiceStatsProvider(
-            kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
+    std::shared_ptr<FakeECOServiceStatsProvider> fakeProvider =
+            ndk::SharedRefBase::make<FakeECOServiceStatsProvider>(
+                    kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
     ECOData providerConfig(ECOData::DATA_TYPE_STATS_PROVIDER_CONFIG,
                            systemTime(SYSTEM_TIME_BOOTTIME));
     providerConfig.setString(KEY_PROVIDER_NAME, "FakeECOServiceStatsProvider");
     providerConfig.setInt32(KEY_PROVIDER_TYPE,
                             ECOServiceStatsProvider::STATS_PROVIDER_TYPE_VIDEO_ENCODER);
     bool res;
-    Status status = ecoSession->addStatsProvider(fakeProvider, providerConfig, &res);
+    ScopedAStatus status = ecoSession->addStatsProvider(fakeProvider, providerConfig, &res);
 
     // Create listener.
-    sp<FakeECOServiceInfoListener> fakeListener =
-            new FakeECOServiceInfoListener(kTestWidth, kTestHeight, kIsCameraRecording, ecoSession);
+    std::shared_ptr<FakeECOServiceInfoListener> fakeListener =
+            ndk::SharedRefBase::make<FakeECOServiceInfoListener>(kTestWidth, kTestHeight,
+                                                                 kIsCameraRecording, ecoSession);
 
     // Create the listener config.
     ECOData listenerConfig(ECOData::DATA_TYPE_INFO_LISTENER_CONFIG,
@@ -410,16 +428,18 @@
 }
 
 TEST_F(EcoSessionTest, TestRemoveMatchProvider) {
-    sp<ECOSession> ecoSession = createSession(kTestWidth, kTestHeight, kIsCameraRecording);
+    std::shared_ptr<ECOSession> ecoSession =
+            createSession(kTestWidth, kTestHeight, kIsCameraRecording);
     EXPECT_TRUE(ecoSession);
 
-    sp<FakeECOServiceStatsProvider> fakeProvider1 = new FakeECOServiceStatsProvider(
-            kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
+    std::shared_ptr<FakeECOServiceStatsProvider> fakeProvider1 =
+            ndk::SharedRefBase::make<FakeECOServiceStatsProvider>(
+                    kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
 
     ECOData providerConfig(ECOData::DATA_TYPE_STATS_PROVIDER_CONFIG,
                            systemTime(SYSTEM_TIME_BOOTTIME));
     bool res;
-    Status status = ecoSession->addStatsProvider(fakeProvider1, providerConfig, &res);
+    ScopedAStatus status = ecoSession->addStatsProvider(fakeProvider1, providerConfig, &res);
     EXPECT_TRUE(res);
     EXPECT_TRUE(status.isOk());
 
@@ -429,21 +449,24 @@
 }
 
 TEST_F(EcoSessionTest, TestRemoveMisMatchProvider) {
-    sp<ECOSession> ecoSession = createSession(kTestWidth, kTestHeight, kIsCameraRecording);
+    std::shared_ptr<ECOSession> ecoSession =
+            createSession(kTestWidth, kTestHeight, kIsCameraRecording);
     EXPECT_TRUE(ecoSession);
 
-    sp<FakeECOServiceStatsProvider> fakeProvider1 = new FakeECOServiceStatsProvider(
-            kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
+    std::shared_ptr<FakeECOServiceStatsProvider> fakeProvider1 =
+            ndk::SharedRefBase::make<FakeECOServiceStatsProvider>(
+                    kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
 
     ECOData providerConfig(ECOData::DATA_TYPE_STATS_PROVIDER_CONFIG,
                            systemTime(SYSTEM_TIME_BOOTTIME));
     bool res;
-    Status status = ecoSession->addStatsProvider(fakeProvider1, providerConfig, &res);
+    ScopedAStatus status = ecoSession->addStatsProvider(fakeProvider1, providerConfig, &res);
     EXPECT_TRUE(res);
     EXPECT_TRUE(status.isOk());
 
-    sp<FakeECOServiceStatsProvider> fakeProvider2 = new FakeECOServiceStatsProvider(
-            kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
+    std::shared_ptr<FakeECOServiceStatsProvider> fakeProvider2 =
+            ndk::SharedRefBase::make<FakeECOServiceStatsProvider>(
+                    kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
 
     status = ecoSession->removeStatsProvider(fakeProvider2, &res);
     EXPECT_FALSE(res);
@@ -451,12 +474,14 @@
 }
 
 TEST_F(EcoSessionTest, TestRemoveMatchListener) {
-    sp<ECOSession> ecoSession = createSession(kTestWidth, kTestHeight, kIsCameraRecording);
+    std::shared_ptr<ECOSession> ecoSession =
+            createSession(kTestWidth, kTestHeight, kIsCameraRecording);
     EXPECT_TRUE(ecoSession);
 
     // Create listener.
-    sp<FakeECOServiceInfoListener> fakeListener =
-            new FakeECOServiceInfoListener(kTestWidth, kTestHeight, kIsCameraRecording, ecoSession);
+    std::shared_ptr<FakeECOServiceInfoListener> fakeListener =
+            ndk::SharedRefBase::make<FakeECOServiceInfoListener>(kTestWidth, kTestHeight,
+                                                                 kIsCameraRecording, ecoSession);
 
     // Create the listener config.
     ECOData listenerConfig(ECOData::DATA_TYPE_INFO_LISTENER_CONFIG,
@@ -469,7 +494,7 @@
     listenerConfig.setInt32(KEY_LISTENER_QP_CHANGE_THRESHOLD, 5);
 
     bool res;
-    Status status = ecoSession->addInfoListener(fakeListener, listenerConfig, &res);
+    ScopedAStatus status = ecoSession->addInfoListener(fakeListener, listenerConfig, &res);
 
     status = ecoSession->removeInfoListener(fakeListener, &res);
     EXPECT_TRUE(res);
@@ -477,12 +502,14 @@
 }
 
 TEST_F(EcoSessionTest, TestRemoveMisMatchListener) {
-    sp<ECOSession> ecoSession = createSession(kTestWidth, kTestHeight, kIsCameraRecording);
+    std::shared_ptr<ECOSession> ecoSession =
+            createSession(kTestWidth, kTestHeight, kIsCameraRecording);
     EXPECT_TRUE(ecoSession);
 
     // Create listener.
-    sp<FakeECOServiceInfoListener> fakeListener =
-            new FakeECOServiceInfoListener(kTestWidth, kTestHeight, kIsCameraRecording, ecoSession);
+    std::shared_ptr<FakeECOServiceInfoListener> fakeListener =
+            ndk::SharedRefBase::make<FakeECOServiceInfoListener>(kTestWidth, kTestHeight,
+                                                                 kIsCameraRecording, ecoSession);
 
     // Create the listener config.
     ECOData listenerConfig(ECOData::DATA_TYPE_INFO_LISTENER_CONFIG,
@@ -495,11 +522,12 @@
     listenerConfig.setInt32(KEY_LISTENER_QP_CHANGE_THRESHOLD, 5);
 
     bool res;
-    Status status = ecoSession->addInfoListener(fakeListener, listenerConfig, &res);
+    ScopedAStatus status = ecoSession->addInfoListener(fakeListener, listenerConfig, &res);
 
     // Create listener.
-    sp<FakeECOServiceInfoListener> fakeListener2 =
-            new FakeECOServiceInfoListener(kTestWidth, kTestHeight, kIsCameraRecording, ecoSession);
+    std::shared_ptr<FakeECOServiceInfoListener> fakeListener2 =
+            ndk::SharedRefBase::make<FakeECOServiceInfoListener>(kTestWidth, kTestHeight,
+                                                                 kIsCameraRecording, ecoSession);
 
     status = ecoSession->removeInfoListener(fakeListener2, &res);
     EXPECT_FALSE(res);
@@ -513,18 +541,20 @@
     static constexpr int kServiceWaitTimeMs = 10;
 
     // Create the session.
-    sp<ECOSession> ecoSession = createSession(kTestWidth, kTestHeight, kIsCameraRecording);
+    std::shared_ptr<ECOSession> ecoSession =
+            createSession(kTestWidth, kTestHeight, kIsCameraRecording);
 
     // Add provider.
-    sp<FakeECOServiceStatsProvider> fakeProvider = new FakeECOServiceStatsProvider(
-            kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
+    std::shared_ptr<FakeECOServiceStatsProvider> fakeProvider =
+            ndk::SharedRefBase::make<FakeECOServiceStatsProvider>(
+                    kTestWidth, kTestHeight, kIsCameraRecording, kFrameRate, ecoSession);
     ECOData providerConfig(ECOData::DATA_TYPE_STATS_PROVIDER_CONFIG,
                            systemTime(SYSTEM_TIME_BOOTTIME));
     providerConfig.setString(KEY_PROVIDER_NAME, "FakeECOServiceStatsProvider");
     providerConfig.setInt32(KEY_PROVIDER_TYPE,
                             ECOServiceStatsProvider::STATS_PROVIDER_TYPE_VIDEO_ENCODER);
     bool res;
-    Status status = ecoSession->addStatsProvider(fakeProvider, providerConfig, &res);
+    ScopedAStatus status = ecoSession->addStatsProvider(fakeProvider, providerConfig, &res);
 
     // Inject the session stats into the ECOSession through fakeProvider.
     SimpleEncoderConfig sessionEncoderConfig("google-avc", CodecTypeAVC, AVCProfileHigh, AVCLevel52,
@@ -546,8 +576,9 @@
     // =======================================================================================
     // Create and add the listener to the ECOSession. Expect to receive the session infor right
     // after addInfoListener.
-    sp<FakeECOServiceInfoListener> fakeListener =
-            new FakeECOServiceInfoListener(kTestWidth, kTestHeight, kIsCameraRecording, ecoSession);
+    std::shared_ptr<FakeECOServiceInfoListener> fakeListener =
+            ndk::SharedRefBase::make<FakeECOServiceInfoListener>(kTestWidth, kTestHeight,
+                                                                 kIsCameraRecording, ecoSession);
 
     // Create the listener config.
     ECOData listenerConfig(ECOData::DATA_TYPE_INFO_LISTENER_CONFIG,
diff --git a/media/eco/tests/FakeECOServiceInfoListener.cpp b/media/eco/tests/FakeECOServiceInfoListener.cpp
index 10a6851..8a58f7d 100644
--- a/media/eco/tests/FakeECOServiceInfoListener.cpp
+++ b/media/eco/tests/FakeECOServiceInfoListener.cpp
@@ -20,8 +20,7 @@
 #include "FakeECOServiceInfoListener.h"
 
 #include <android-base/unique_fd.h>
-#include <binder/Parcel.h>
-#include <binder/Parcelable.h>
+#include <android/binder_parcel.h>
 #include <cutils/ashmem.h>
 #include <gtest/gtest.h>
 #include <math.h>
@@ -35,7 +34,7 @@
 
 FakeECOServiceInfoListener::FakeECOServiceInfoListener(int32_t width, int32_t height,
                                                        bool isCameraRecording,
-                                                       android::sp<IECOSession> session)
+                                                       std::shared_ptr<IECOSession> session)
       : mWidth(width),
         mHeight(height),
         mIsCameraRecording(isCameraRecording),
@@ -55,28 +54,29 @@
     ALOGD("FakeECOServiceInfoListener destructor");
 }
 
-Status FakeECOServiceInfoListener::getType(int32_t* /*_aidl_return*/) {
-    return binder::Status::ok();
+ndk::ScopedAStatus FakeECOServiceInfoListener::getType(int32_t* /*_aidl_return*/) {
+    return ndk::ScopedAStatus::ok();
 }
 
-Status FakeECOServiceInfoListener::getName(::android::String16* _aidl_return) {
-    *_aidl_return = String16("FakeECOServiceInfoListener");
-    return binder::Status::ok();
+ndk::ScopedAStatus FakeECOServiceInfoListener::getName(std::string* _aidl_return) {
+    *_aidl_return = std::string("FakeECOServiceInfoListener");
+    return ndk::ScopedAStatus::ok();
 }
 
-Status FakeECOServiceInfoListener::getECOSession(sp<::android::IBinder>* _aidl_return) {
-    *_aidl_return = IInterface::asBinder(mECOSession);
-    return binder::Status::ok();
+ndk::ScopedAStatus FakeECOServiceInfoListener::getECOSession(::ndk::SpAIBinder* _aidl_return) {
+    *_aidl_return = mECOSession->asBinder();
+    return ndk::ScopedAStatus::ok();
 }
 
-Status FakeECOServiceInfoListener::onNewInfo(const ::android::media::eco::ECOData& newInfo) {
+ndk::ScopedAStatus FakeECOServiceInfoListener::onNewInfo(
+        const ::android::media::eco::ECOData& newInfo) {
     ALOGD("FakeECOServiceInfoListener get new info");
     mInfoAvaiableCallback(newInfo);
-    return binder::Status::ok();
+    return ndk::ScopedAStatus::ok();
 }
 
 // IBinder::DeathRecipient implementation
-void FakeECOServiceInfoListener::binderDied(const wp<IBinder>& /*who*/) {}
+void FakeECOServiceInfoListener::binderDied(const std::weak_ptr<AIBinder>& /*who*/) {}
 
 }  // namespace eco
 }  // namespace media
diff --git a/media/eco/tests/FakeECOServiceInfoListener.h b/media/eco/tests/FakeECOServiceInfoListener.h
index 7c23275..f49bd60 100644
--- a/media/eco/tests/FakeECOServiceInfoListener.h
+++ b/media/eco/tests/FakeECOServiceInfoListener.h
@@ -16,11 +16,11 @@
 
 // A fake ECOServiceInfoListener for testing ECOService and ECOSession.
 
+#include <aidl/android/media/eco/BnECOServiceInfoListener.h>
+#include <aidl/android/media/eco/IECOSession.h>
 #include <android-base/unique_fd.h>
-#include <android/media/eco/BnECOServiceInfoListener.h>
-#include <android/media/eco/IECOSession.h>
-#include <binder/Parcel.h>
-#include <binder/Parcelable.h>
+#include <android/binder_auto_utils.h>
+#include <android/binder_parcel.h>
 #include <cutils/ashmem.h>
 #include <gtest/gtest.h>
 #include <math.h>
@@ -35,8 +35,11 @@
 namespace media {
 namespace eco {
 
-using ::android::sp;
-using ::android::binder::Status;
+using aidl::android::media::eco::BnECOServiceInfoListener;
+using aidl::android::media::eco::ECOData;
+using aidl::android::media::eco::ECODataStatus;
+using aidl::android::media::eco::IECOSession;
+using ::ndk::ScopedAStatus;
 
 /**
  * A fake ECOServiceInfoListener.
@@ -51,18 +54,18 @@
             std::function<void(const ::android::media::eco::ECOData& newInfo)>;
 
     FakeECOServiceInfoListener(int32_t width, int32_t height, bool isCameraRecording,
-                               sp<IECOSession> session);
+                               std::shared_ptr<IECOSession> session);
 
     FakeECOServiceInfoListener(int32_t width, int32_t height, bool isCameraRecording);
 
-    void setECOSession(android::sp<IECOSession> session) { mECOSession = session; }
+    void setECOSession(std::shared_ptr<IECOSession> session) { mECOSession = session; }
 
     virtual ~FakeECOServiceInfoListener();
 
-    virtual Status getType(int32_t* _aidl_return);
-    virtual Status getName(::android::String16* _aidl_return);
-    virtual Status getECOSession(::android::sp<::android::IBinder>* _aidl_return);
-    virtual Status onNewInfo(const ::android::media::eco::ECOData& newInfo);
+    virtual ScopedAStatus getType(int32_t* _aidl_return);
+    virtual ScopedAStatus getName(std::string* _aidl_return);
+    virtual ScopedAStatus getECOSession(::ndk::SpAIBinder* _aidl_return);
+    virtual ScopedAStatus onNewInfo(const ::android::media::eco::ECOData& newInfo);
 
     // Helper callback to send the info to the test.
     void setInfoAvailableCallback(InfoAvailableCallback callback) {
@@ -70,13 +73,13 @@
     }
 
     // IBinder::DeathRecipient implementation
-    virtual void binderDied(const wp<IBinder>& who);
+    virtual void binderDied(const std::weak_ptr<AIBinder>& who);
 
 private:
     int32_t mWidth;
     int32_t mHeight;
     bool mIsCameraRecording;
-    android::sp<IECOSession> mECOSession;
+    std::shared_ptr<IECOSession> mECOSession;
     InfoAvailableCallback mInfoAvaiableCallback;
 };
 
diff --git a/media/eco/tests/FakeECOServiceStatsProvider.cpp b/media/eco/tests/FakeECOServiceStatsProvider.cpp
index 4bf0ca4..9410889 100644
--- a/media/eco/tests/FakeECOServiceStatsProvider.cpp
+++ b/media/eco/tests/FakeECOServiceStatsProvider.cpp
@@ -20,8 +20,8 @@
 #include "FakeECOServiceStatsProvider.h"
 
 #include <android-base/unique_fd.h>
-#include <binder/Parcel.h>
-#include <binder/Parcelable.h>
+#include <android/binder_auto_utils.h>
+#include <android/binder_parcel.h>
 #include <cutils/ashmem.h>
 #include <gtest/gtest.h>
 #include <math.h>
@@ -35,7 +35,7 @@
 
 FakeECOServiceStatsProvider::FakeECOServiceStatsProvider(int32_t width, int32_t height,
                                                          bool isCameraRecording, float frameRate,
-                                                         android::sp<IECOSession> session)
+                                                         std::shared_ptr<IECOSession> session)
       : mWidth(width),
         mHeight(height),
         mIsCameraRecording(isCameraRecording),
@@ -63,18 +63,18 @@
     ALOGD("FakeECOServiceStatsProvider destructor");
 }
 
-Status FakeECOServiceStatsProvider::getType(int32_t* /*_aidl_return*/) {
-    return binder::Status::ok();
+ndk::ScopedAStatus FakeECOServiceStatsProvider::getType(int32_t* /*_aidl_return*/) {
+    return ndk::ScopedAStatus::ok();
 }
 
-Status FakeECOServiceStatsProvider::getName(::android::String16* _aidl_return) {
-    *_aidl_return = String16("FakeECOServiceStatsProvider");
-    return binder::Status::ok();
+ndk::ScopedAStatus FakeECOServiceStatsProvider::getName(std::string* _aidl_return) {
+    *_aidl_return = std::string("FakeECOServiceStatsProvider");
+    return ndk::ScopedAStatus::ok();
 }
 
-Status FakeECOServiceStatsProvider::getECOSession(sp<::android::IBinder>* _aidl_return) {
-    *_aidl_return = IInterface::asBinder(mECOSession);
-    return binder::Status::ok();
+ndk::ScopedAStatus FakeECOServiceStatsProvider::getECOSession(::ndk::SpAIBinder* _aidl_return) {
+    *_aidl_return = mECOSession->asBinder();
+    return ndk::ScopedAStatus::ok();
 }
 
 bool FakeECOServiceStatsProvider::injectSessionStats(const ECOData& stats) {
@@ -94,7 +94,7 @@
 }
 
 // IBinder::DeathRecipient implementation
-void FakeECOServiceStatsProvider::binderDied(const wp<IBinder>& /*who*/) {}
+void FakeECOServiceStatsProvider::binderDied(const std::weak_ptr<AIBinder>& /*who*/) {}
 
 }  // namespace eco
 }  // namespace media
diff --git a/media/eco/tests/FakeECOServiceStatsProvider.h b/media/eco/tests/FakeECOServiceStatsProvider.h
index bf14a53..6dfd3a6 100644
--- a/media/eco/tests/FakeECOServiceStatsProvider.h
+++ b/media/eco/tests/FakeECOServiceStatsProvider.h
@@ -16,10 +16,10 @@
 
 // A fake ECOServiceStatsProvider for testing ECOService and ECOSession.
 
+#include <aidl/android/media/eco/BnECOServiceStatsProvider.h>
 #include <android-base/unique_fd.h>
-#include <android/media/eco/BnECOServiceStatsProvider.h>
-#include <binder/Parcel.h>
-#include <binder/Parcelable.h>
+#include <android/binder_auto_utils.h>
+#include <android/binder_parcel.h>
 #include <cutils/ashmem.h>
 #include <gtest/gtest.h>
 #include <math.h>
@@ -42,8 +42,7 @@
 namespace media {
 namespace eco {
 
-using ::android::sp;
-using ::android::binder::Status;
+using ::ndk::ScopedAStatus;
 
 /**
  * A fake ECOServiceStatsProvider.
@@ -54,12 +53,12 @@
 class FakeECOServiceStatsProvider : public BnECOServiceStatsProvider {
 public:
     FakeECOServiceStatsProvider(int32_t width, int32_t height, bool isCameraRecording,
-                                float frameRate, android::sp<IECOSession> session);
+                                float frameRate, std::shared_ptr<IECOSession> session);
 
     FakeECOServiceStatsProvider(int32_t width, int32_t height, bool isCameraRecording,
                                 float frameRate);
 
-    void setECOSession(android::sp<IECOSession> session) { mECOSession = session; }
+    void setECOSession(std::shared_ptr<IECOSession> session) { mECOSession = session; }
 
     // Helper function to inject session stats to the FakeECOServiceStatsProvider so provider
     // could push to the service.
@@ -77,12 +76,12 @@
 
     virtual ~FakeECOServiceStatsProvider();
 
-    virtual Status getType(int32_t* _aidl_return);
-    virtual Status getName(::android::String16* _aidl_return);
-    virtual Status getECOSession(::android::sp<::android::IBinder>* _aidl_return);
+    virtual ScopedAStatus getType(int32_t* _aidl_return);
+    virtual ScopedAStatus getName(std::string* _aidl_return);
+    virtual ScopedAStatus getECOSession(::ndk::SpAIBinder* _aidl_return);
 
     // IBinder::DeathRecipient implementation
-    virtual void binderDied(const wp<IBinder>& who);
+    virtual void binderDied(const std::weak_ptr<AIBinder>& who);
 
 private:
     int32_t mWidth;
@@ -91,7 +90,7 @@
     float mFrameRate;
     uint32_t mFrameNumber;
 
-    android::sp<IECOSession> mECOSession;
+    std::shared_ptr<IECOSession> mECOSession;
 };
 
 }  // namespace eco