Add init() to avoid crash when creating ref in constructor.

This reverts commit 50899fb2696d2bb98a4807a237e124f566293f57.

Bug: 195717690
Fix: 195717690
Test: atest VtsHalTvTunerTargetTest
Change-Id: Icae435f1166e6cf2e2f235979e3d1d37d182d517
diff --git a/tv/tuner/aidl/default/Demux.cpp b/tv/tuner/aidl/default/Demux.cpp
index bdc3849..3937c6a 100644
--- a/tv/tuner/aidl/default/Demux.cpp
+++ b/tv/tuner/aidl/default/Demux.cpp
@@ -31,7 +31,7 @@
 
 #define WAIT_TIMEOUT 3000000000
 
-Demux::Demux(int32_t demuxId, Tuner* tuner) {
+Demux::Demux(int32_t demuxId, std::shared_ptr<Tuner> tuner) {
     mDemuxId = demuxId;
     mTuner = tuner;
 }
@@ -75,8 +75,8 @@
                 static_cast<int32_t>(Result::INVALID_ARGUMENT));
     }
 
-    std::shared_ptr<Filter> filter =
-            ndk::SharedRefBase::make<Filter>(in_type, filterId, in_bufferSize, in_cb, this);
+    std::shared_ptr<Filter> filter = ndk::SharedRefBase::make<Filter>(
+            in_type, filterId, in_bufferSize, in_cb, this->ref<Demux>());
     if (!filter->createFilterMQ()) {
         *_aidl_return = nullptr;
         return ::ndk::ScopedAStatus::fromServiceSpecificError(
@@ -110,7 +110,7 @@
 ::ndk::ScopedAStatus Demux::openTimeFilter(std::shared_ptr<ITimeFilter>* _aidl_return) {
     ALOGV("%s", __FUNCTION__);
 
-    mTimeFilter = ndk::SharedRefBase::make<TimeFilter>(this);
+    mTimeFilter = ndk::SharedRefBase::make<TimeFilter>(this->ref<Demux>());
 
     *_aidl_return = mTimeFilter;
     return ::ndk::ScopedAStatus::ok();
@@ -201,7 +201,8 @@
     set<int64_t>::iterator it;
     switch (in_type) {
         case DvrType::PLAYBACK:
-            mDvrPlayback = ndk::SharedRefBase::make<Dvr>(in_type, in_bufferSize, in_cb, this);
+            mDvrPlayback = ndk::SharedRefBase::make<Dvr>(in_type, in_bufferSize, in_cb,
+                                                         this->ref<Demux>());
             if (!mDvrPlayback->createDvrMQ()) {
                 mDvrPlayback = nullptr;
                 *_aidl_return = mDvrPlayback;
@@ -222,7 +223,8 @@
             *_aidl_return = mDvrPlayback;
             return ::ndk::ScopedAStatus::ok();
         case DvrType::RECORD:
-            mDvrRecord = ndk::SharedRefBase::make<Dvr>(in_type, in_bufferSize, in_cb, this);
+            mDvrRecord = ndk::SharedRefBase::make<Dvr>(in_type, in_bufferSize, in_cb,
+                                                       this->ref<Demux>());
             if (!mDvrRecord->createDvrMQ()) {
                 mDvrRecord = nullptr;
                 *_aidl_return = mDvrRecord;
diff --git a/tv/tuner/aidl/default/Demux.h b/tv/tuner/aidl/default/Demux.h
index 4cfcaab..4d9b7fe 100644
--- a/tv/tuner/aidl/default/Demux.h
+++ b/tv/tuner/aidl/default/Demux.h
@@ -50,7 +50,7 @@
 
 class Demux : public BnDemux {
   public:
-    Demux(int32_t demuxId, Tuner* tuner);
+    Demux(int32_t demuxId, std::shared_ptr<Tuner> tuner);
     ~Demux();
 
     ::ndk::ScopedAStatus setFrontendDataSource(int32_t in_frontendId) override;
@@ -95,7 +95,7 @@
 
   private:
     // Tuner service
-    Tuner* mTuner;
+    std::shared_ptr<Tuner> mTuner;
 
     // Frontend source
     std::shared_ptr<Frontend> mFrontend;
diff --git a/tv/tuner/aidl/default/Dvr.cpp b/tv/tuner/aidl/default/Dvr.cpp
index 7c9c44c..9eadb8c 100644
--- a/tv/tuner/aidl/default/Dvr.cpp
+++ b/tv/tuner/aidl/default/Dvr.cpp
@@ -31,7 +31,8 @@
 
 #define WAIT_TIMEOUT 3000000000
 
-Dvr::Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr<IDvrCallback>& cb, Demux* demux) {
+Dvr::Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr<IDvrCallback>& cb,
+         std::shared_ptr<Demux> demux) {
     mType = type;
     mBufferSize = bufferSize;
     mCallback = cb;
diff --git a/tv/tuner/aidl/default/Dvr.h b/tv/tuner/aidl/default/Dvr.h
index 2e96449..68933ae 100644
--- a/tv/tuner/aidl/default/Dvr.h
+++ b/tv/tuner/aidl/default/Dvr.h
@@ -57,7 +57,8 @@
 
 class Dvr : public BnDvr {
   public:
-    Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr<IDvrCallback>& cb, Demux* demux);
+    Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr<IDvrCallback>& cb,
+        std::shared_ptr<Demux> demux);
     ~Dvr();
 
     ::ndk::ScopedAStatus getQueueDesc(
@@ -87,7 +88,7 @@
 
   private:
     // Demux service
-    Demux* mDemux;
+    std::shared_ptr<Demux> mDemux;
 
     DvrType mType;
     uint32_t mBufferSize;
diff --git a/tv/tuner/aidl/default/Filter.cpp b/tv/tuner/aidl/default/Filter.cpp
index 681eb04..77ca2ee 100644
--- a/tv/tuner/aidl/default/Filter.cpp
+++ b/tv/tuner/aidl/default/Filter.cpp
@@ -37,7 +37,7 @@
 Filter::Filter() {}
 
 Filter::Filter(DemuxFilterType type, int64_t filterId, uint32_t bufferSize,
-               const std::shared_ptr<IFilterCallback>& cb, Demux* demux) {
+               const std::shared_ptr<IFilterCallback>& cb, std::shared_ptr<Demux> demux) {
     mType = type;
     mFilterId = filterId;
     mBufferSize = bufferSize;
diff --git a/tv/tuner/aidl/default/Filter.h b/tv/tuner/aidl/default/Filter.h
index 1dbba45..30eb24b 100644
--- a/tv/tuner/aidl/default/Filter.h
+++ b/tv/tuner/aidl/default/Filter.h
@@ -54,7 +54,7 @@
     Filter();
 
     Filter(DemuxFilterType type, int64_t filterId, uint32_t bufferSize,
-           const std::shared_ptr<IFilterCallback>& cb, Demux* demux);
+           const std::shared_ptr<IFilterCallback>& cb, std::shared_ptr<Demux> demux);
 
     ~Filter();
 
@@ -97,7 +97,7 @@
 
   private:
     // Demux service
-    Demux* mDemux;
+    std::shared_ptr<Demux> mDemux;
     // Dvr reference once the filter is attached to any
     std::shared_ptr<Dvr> mDvr = nullptr;
     /**
diff --git a/tv/tuner/aidl/default/Frontend.cpp b/tv/tuner/aidl/default/Frontend.cpp
index 78d8279..438f897 100644
--- a/tv/tuner/aidl/default/Frontend.cpp
+++ b/tv/tuner/aidl/default/Frontend.cpp
@@ -28,7 +28,7 @@
 namespace tv {
 namespace tuner {
 
-Frontend::Frontend(FrontendType type, int32_t id, Tuner* tuner) {
+Frontend::Frontend(FrontendType type, int32_t id, std::shared_ptr<Tuner> tuner) {
     mType = type;
     mId = id;
     mTuner = tuner;
diff --git a/tv/tuner/aidl/default/Frontend.h b/tv/tuner/aidl/default/Frontend.h
index a98cc92..3c602cf 100644
--- a/tv/tuner/aidl/default/Frontend.h
+++ b/tv/tuner/aidl/default/Frontend.h
@@ -33,7 +33,7 @@
 
 class Frontend : public BnFrontend {
   public:
-    Frontend(FrontendType type, int32_t id, Tuner* tuner);
+    Frontend(FrontendType type, int32_t id, std::shared_ptr<Tuner> tuner);
 
     ::ndk::ScopedAStatus setCallback(
             const std::shared_ptr<IFrontendCallback>& in_callback) override;
@@ -59,7 +59,7 @@
     virtual ~Frontend();
     bool supportsSatellite();
     std::shared_ptr<IFrontendCallback> mCallback;
-    Tuner* mTuner;
+    std::shared_ptr<Tuner> mTuner;
     FrontendType mType = FrontendType::UNDEFINED;
     int32_t mId = 0;
     bool mIsLocked = false;
diff --git a/tv/tuner/aidl/default/TimeFilter.cpp b/tv/tuner/aidl/default/TimeFilter.cpp
index 3b1edd2..dde7be3 100644
--- a/tv/tuner/aidl/default/TimeFilter.cpp
+++ b/tv/tuner/aidl/default/TimeFilter.cpp
@@ -30,7 +30,7 @@
 
 TimeFilter::TimeFilter() {}
 
-TimeFilter::TimeFilter(Demux* demux) {
+TimeFilter::TimeFilter(std::shared_ptr<Demux> demux) {
     mDemux = demux;
 }
 
diff --git a/tv/tuner/aidl/default/TimeFilter.h b/tv/tuner/aidl/default/TimeFilter.h
index 44e941c..ff35c47 100644
--- a/tv/tuner/aidl/default/TimeFilter.h
+++ b/tv/tuner/aidl/default/TimeFilter.h
@@ -35,7 +35,7 @@
 class TimeFilter : public BnTimeFilter {
   public:
     TimeFilter();
-    TimeFilter(Demux* demux);
+    TimeFilter(std::shared_ptr<Demux> demux);
     ~TimeFilter();
 
     ::ndk::ScopedAStatus setTimeStamp(int64_t in_timeStamp) override;
@@ -45,7 +45,7 @@
     ::ndk::ScopedAStatus close() override;
 
   private:
-    Demux* mDemux;
+    std::shared_ptr<Demux> mDemux;
     uint64_t mTimeStamp = INVALID_TIME_STAMP;
     time_t mBeginTime;
 };
diff --git a/tv/tuner/aidl/default/Tuner.cpp b/tv/tuner/aidl/default/Tuner.cpp
index 7e49660..678be54 100644
--- a/tv/tuner/aidl/default/Tuner.cpp
+++ b/tv/tuner/aidl/default/Tuner.cpp
@@ -32,20 +32,22 @@
 namespace tv {
 namespace tuner {
 
-Tuner::Tuner() {
+Tuner::Tuner() {}
+
+void Tuner::init() {
     // Static Frontends array to maintain local frontends information
     // Array index matches their FrontendId in the default impl
     mFrontendSize = 10;
-    mFrontends[0] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBS, 0, this);
-    mFrontends[1] = ndk::SharedRefBase::make<Frontend>(FrontendType::ATSC3, 1, this);
-    mFrontends[2] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBC, 2, this);
-    mFrontends[3] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBS, 3, this);
-    mFrontends[4] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBT, 4, this);
-    mFrontends[5] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBT, 5, this);
-    mFrontends[6] = ndk::SharedRefBase::make<Frontend>(FrontendType::ANALOG, 6, this);
-    mFrontends[7] = ndk::SharedRefBase::make<Frontend>(FrontendType::ATSC, 7, this);
-    mFrontends[8] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBS3, 8, this);
-    mFrontends[9] = ndk::SharedRefBase::make<Frontend>(FrontendType::DTMB, 9, this);
+    mFrontends[0] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBS, 0, this->ref<Tuner>());
+    mFrontends[1] = ndk::SharedRefBase::make<Frontend>(FrontendType::ATSC3, 1, this->ref<Tuner>());
+    mFrontends[2] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBC, 2, this->ref<Tuner>());
+    mFrontends[3] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBS, 3, this->ref<Tuner>());
+    mFrontends[4] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBT, 4, this->ref<Tuner>());
+    mFrontends[5] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBT, 5, this->ref<Tuner>());
+    mFrontends[6] = ndk::SharedRefBase::make<Frontend>(FrontendType::ANALOG, 6, this->ref<Tuner>());
+    mFrontends[7] = ndk::SharedRefBase::make<Frontend>(FrontendType::ATSC, 7, this->ref<Tuner>());
+    mFrontends[8] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBS3, 8, this->ref<Tuner>());
+    mFrontends[9] = ndk::SharedRefBase::make<Frontend>(FrontendType::DTMB, 9, this->ref<Tuner>());
 
     vector<FrontendStatusType> statusCaps;
 
@@ -212,7 +214,7 @@
     ALOGV("%s", __FUNCTION__);
 
     mLastUsedId += 1;
-    mDemuxes[mLastUsedId] = ndk::SharedRefBase::make<Demux>(mLastUsedId, this);
+    mDemuxes[mLastUsedId] = ndk::SharedRefBase::make<Demux>(mLastUsedId, this->ref<Tuner>());
 
     out_demuxId->push_back(mLastUsedId);
     *_aidl_return = mDemuxes[mLastUsedId];
diff --git a/tv/tuner/aidl/default/Tuner.h b/tv/tuner/aidl/default/Tuner.h
index e69990d..7af7ab8 100644
--- a/tv/tuner/aidl/default/Tuner.h
+++ b/tv/tuner/aidl/default/Tuner.h
@@ -63,6 +63,7 @@
     void frontendStopTune(int32_t frontendId);
     void removeDemux(int32_t demuxId);
     void removeFrontend(int32_t frontendId);
+    void init();
 
   private:
     // Static mFrontends array to maintain local frontends information
diff --git a/tv/tuner/aidl/default/service.cpp b/tv/tuner/aidl/default/service.cpp
index 649b763..ac8d779 100644
--- a/tv/tuner/aidl/default/service.cpp
+++ b/tv/tuner/aidl/default/service.cpp
@@ -28,6 +28,7 @@
 int main() {
     ABinderProcess_setThreadPoolMaxThreadCount(8);
     std::shared_ptr<Tuner> tuner = ndk::SharedRefBase::make<Tuner>();
+    tuner->init();
 
     const std::string instance = std::string() + Tuner::descriptor + "/default";
     binder_status_t status = AServiceManager_addService(tuner->asBinder().get(), instance.c_str());