Fully connect TunerFrontend with FrontendClient

Test: make
Bug: 174095851
Change-Id: I29264464763cdd06b4ef16656b414148eb309618
diff --git a/media/jni/tuner/FrontendClient.cpp b/media/jni/tuner/FrontendClient.cpp
index f454907..3a00133 100644
--- a/media/jni/tuner/FrontendClient.cpp
+++ b/media/jni/tuner/FrontendClient.cpp
@@ -91,8 +91,8 @@
     if (mTunerFrontend != NULL) {
         mAidlCallback = ::ndk::SharedRefBase::make<TunerFrontendCallback>(frontendClientCallback);
         mAidlCallback->setFrontendType(mType);
-        mTunerFrontend->setCallback(mAidlCallback);
-        return Result::SUCCESS;
+        Status s = mTunerFrontend->setCallback(mAidlCallback);
+        return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
     mHidlCallback = new HidlFrontendCallback(frontendClientCallback);
@@ -243,9 +243,8 @@
 
 Result FrontendClient::setLnb(sp<LnbClient> lnbClient) {
     if (mTunerFrontend != NULL) {
-        // TODO: handle error message.
-        /*mTunerFrontend->setLnb(lnbClient->getAidlLnb());
-        return Result::SUCCESS;*/
+        Status s = mTunerFrontend->setLnb(lnbClient->getAidlLnb());
+        return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
     if (mFrontend != NULL) {
@@ -258,9 +257,8 @@
 
 Result FrontendClient::setLna(bool bEnable) {
     if (mTunerFrontend != NULL) {
-        // TODO: handle error message.
-        /*mTunerFrontend->setLna(bEnable);
-        return Result::SUCCESS;*/
+        Status s = mTunerFrontend->setLna(bEnable);
+        return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
     if (mFrontend != NULL) {
@@ -275,9 +273,11 @@
     int ltsId = (int)Constant::INVALID_LTS_ID;
 
     if (mTunerFrontend != NULL) {
-        // TODO: handle error message.
-        /*mTunerFrontend->linkCiCamToFrontend(ciCamId, ltsId);
-        return ltsId;*/
+        Status s = mTunerFrontend->linkCiCamToFrontend(ciCamId, &ltsId);
+        if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) {
+            return ltsId;
+        }
+        return (int)Constant::INVALID_LTS_ID;
     }
 
     if (mFrontend_1_1 != NULL) {
@@ -297,9 +297,8 @@
 
 Result FrontendClient::unlinkCiCamToFrontend(int ciCamId) {
     if (mTunerFrontend != NULL) {
-        // TODO: handle error message.
-        /*mTunerFrontend->unlinkCiCamToFrontend(ciCamId);
-        return Result::SUCCESS;*/
+        Status s = mTunerFrontend->unlinkCiCamToFrontend(ciCamId);
+        return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
     if (mFrontend_1_1 != NULL) {
diff --git a/media/jni/tuner/LnbClient.h b/media/jni/tuner/LnbClient.h
index e7869e8..465dc23 100644
--- a/media/jni/tuner/LnbClient.h
+++ b/media/jni/tuner/LnbClient.h
@@ -108,7 +108,7 @@
      */
     Result close();
 
-    //shared_ptr<ITunerLnb> getAidlLnb() { return mTunerLnb; }
+    shared_ptr<ITunerLnb> getAidlLnb() { return mTunerLnb; }
     void setId(LnbId id) { mId = id; }
     LnbId getId() { return mId; }
 
diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp
index 240b144..7f954b5 100644
--- a/media/jni/tuner/TunerClient.cpp
+++ b/media/jni/tuner/TunerClient.cpp
@@ -22,7 +22,10 @@
 
 #include "TunerClient.h"
 
+using ::aidl::android::media::tv::tuner::TunerFrontendCapabilities;
+using ::aidl::android::media::tv::tuner::TunerFrontendDtmbCapabilities;
 using ::android::hardware::tv::tuner::V1_0::FrontendId;
+using ::android::hardware::tv::tuner::V1_0::FrontendStatusType;
 using ::android::hardware::tv::tuner::V1_0::FrontendType;
 
 namespace android {
@@ -136,12 +139,11 @@
 shared_ptr<FrontendInfo> TunerClient::getFrontendInfo(int id) {
     if (mTunerService != NULL) {
         TunerFrontendInfo aidlFrontendInfo;
-        // TODO: handle error code
         Status s = mTunerService->getFrontendInfo(id, &aidlFrontendInfo);
         if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
             return NULL;
         }
-        return make_shared<FrontendInfo>(FrontendInfoAidlToHidl(aidlFrontendInfo));
+        return make_shared<FrontendInfo>(frontendInfoAidlToHidl(aidlFrontendInfo));
     }
 
     if (mTuner != NULL) {
@@ -157,7 +159,22 @@
 }
 
 shared_ptr<FrontendDtmbCapabilities> TunerClient::getFrontendDtmbCapabilities(int id) {
-    // pending aidl interface
+    if (mTunerService != NULL) {
+        TunerFrontendDtmbCapabilities dtmbCaps;
+        Status s = mTunerService->getFrontendDtmbCapabilities(id, &dtmbCaps);
+        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
+            return NULL;
+        }
+        FrontendDtmbCapabilities hidlCaps{
+            .transmissionModeCap = static_cast<uint32_t>(dtmbCaps.transmissionModeCap),
+            .bandwidthCap = static_cast<uint32_t>(dtmbCaps.bandwidthCap),
+            .modulationCap = static_cast<uint32_t>(dtmbCaps.modulationCap),
+            .codeRateCap = static_cast<uint32_t>(dtmbCaps.codeRateCap),
+            .guardIntervalCap = static_cast<uint32_t>(dtmbCaps.guardIntervalCap),
+            .interleaveModeCap = static_cast<uint32_t>(dtmbCaps.interleaveModeCap),
+        };
+        return make_shared<FrontendDtmbCapabilities>(hidlCaps);
+    }
 
     if (mTuner_1_1 != NULL) {
         Result result;
@@ -487,7 +504,7 @@
     return caps;
 }
 
-FrontendInfo TunerClient::FrontendInfoAidlToHidl(TunerFrontendInfo aidlFrontendInfo) {
+FrontendInfo TunerClient::frontendInfoAidlToHidl(TunerFrontendInfo aidlFrontendInfo) {
     FrontendInfo hidlFrontendInfo {
         .type = static_cast<FrontendType>(aidlFrontendInfo.type),
         .minFrequency = static_cast<uint32_t>(aidlFrontendInfo.minFrequency),
@@ -497,8 +514,102 @@
         .acquireRange = static_cast<uint32_t>(aidlFrontendInfo.acquireRange),
         .exclusiveGroupId = static_cast<uint32_t>(aidlFrontendInfo.exclusiveGroupId),
     };
-    // TODO: handle Frontend caps
 
+    int size = aidlFrontendInfo.statusCaps.size();
+    hidlFrontendInfo.statusCaps.resize(size);
+    for (int i = 0; i < size; i++) {
+        hidlFrontendInfo.statusCaps[i] =
+                static_cast<FrontendStatusType>(aidlFrontendInfo.statusCaps[i]);
+    }
+
+    switch (aidlFrontendInfo.caps.getTag()) {
+        case TunerFrontendCapabilities::analogCaps: {
+            auto analog = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::analogCaps>();
+            hidlFrontendInfo.frontendCaps.analogCaps({
+                .typeCap = static_cast<uint32_t>(analog.typeCap),
+                .sifStandardCap = static_cast<uint32_t>(analog.sifStandardCap),
+            });
+            break;
+        }
+        case TunerFrontendCapabilities::atscCaps: {
+            auto atsc = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::atscCaps>();
+            hidlFrontendInfo.frontendCaps.atscCaps({
+                .modulationCap = static_cast<uint32_t>(atsc.modulationCap),
+            });
+            break;
+        }
+        case TunerFrontendCapabilities::atsc3Caps: {
+            auto atsc3 = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::atsc3Caps>();
+            hidlFrontendInfo.frontendCaps.atsc3Caps({
+                .bandwidthCap = static_cast<uint32_t>(atsc3.bandwidthCap),
+                .modulationCap = static_cast<uint32_t>(atsc3.modulationCap),
+                .timeInterleaveModeCap = static_cast<uint32_t>(atsc3.timeInterleaveModeCap),
+                .codeRateCap = static_cast<uint32_t>(atsc3.codeRateCap),
+                .fecCap = static_cast<uint32_t>(atsc3.fecCap),
+                .demodOutputFormatCap = static_cast<uint8_t>(atsc3.demodOutputFormatCap),
+            });
+            break;
+        }
+        case TunerFrontendCapabilities::cableCaps: {
+            auto cable = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::cableCaps>();
+            hidlFrontendInfo.frontendCaps.dvbcCaps({
+                .modulationCap = static_cast<uint32_t>(cable.modulationCap),
+                .fecCap = static_cast<uint64_t>(cable.codeRateCap),
+                .annexCap = static_cast<uint8_t>(cable.annexCap),
+            });
+            break;
+        }
+        case TunerFrontendCapabilities::dvbsCaps: {
+            auto dvbs = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::dvbsCaps>();
+            hidlFrontendInfo.frontendCaps.dvbsCaps({
+                .modulationCap = static_cast<int32_t>(dvbs.modulationCap),
+                .innerfecCap = static_cast<uint64_t>(dvbs.codeRateCap),
+                .standard = static_cast<uint8_t>(dvbs.standard),
+            });
+            break;
+        }
+        case TunerFrontendCapabilities::dvbtCaps: {
+            auto dvbt = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::dvbtCaps>();
+            hidlFrontendInfo.frontendCaps.dvbtCaps({
+                .transmissionModeCap = static_cast<uint32_t>(dvbt.transmissionModeCap),
+                .bandwidthCap = static_cast<uint32_t>(dvbt.bandwidthCap),
+                .constellationCap = static_cast<uint32_t>(dvbt.constellationCap),
+                .coderateCap = static_cast<uint32_t>(dvbt.codeRateCap),
+                .hierarchyCap = static_cast<uint32_t>(dvbt.hierarchyCap),
+                .guardIntervalCap = static_cast<uint32_t>(dvbt.guardIntervalCap),
+                .isT2Supported = dvbt.isT2Supported,
+                .isMisoSupported = dvbt.isMisoSupported,
+            });
+            break;
+        }
+        case TunerFrontendCapabilities::isdbsCaps: {
+            auto isdbs = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::isdbsCaps>();
+            hidlFrontendInfo.frontendCaps.isdbsCaps({
+                .modulationCap = static_cast<uint32_t>(isdbs.modulationCap),
+                .coderateCap = static_cast<uint32_t>(isdbs.codeRateCap),
+            });
+            break;
+        }
+        case TunerFrontendCapabilities::isdbs3Caps: {
+            auto isdbs3 = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::isdbs3Caps>();
+            hidlFrontendInfo.frontendCaps.isdbs3Caps({
+                .modulationCap = static_cast<uint32_t>(isdbs3.modulationCap),
+                .coderateCap = static_cast<uint32_t>(isdbs3.codeRateCap),
+            });
+            break;
+        }
+        case TunerFrontendCapabilities::isdbtCaps: {
+            auto isdbt = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::isdbtCaps>();
+            hidlFrontendInfo.frontendCaps.isdbtCaps({
+                .modeCap = static_cast<uint32_t>(isdbt.modeCap),
+                .bandwidthCap = static_cast<uint32_t>(isdbt.bandwidthCap),
+                .modulationCap = static_cast<uint32_t>(isdbt.modulationCap),
+                .coderateCap = static_cast<uint32_t>(isdbt.codeRateCap),
+                .guardIntervalCap = static_cast<uint32_t>(isdbt.guardIntervalCap),
+            });
+            break;
+        }
+    }
     return hidlFrontendInfo;
 }
 
diff --git a/media/jni/tuner/TunerClient.h b/media/jni/tuner/TunerClient.h
index acd018e..744bf20 100644
--- a/media/jni/tuner/TunerClient.h
+++ b/media/jni/tuner/TunerClient.h
@@ -147,7 +147,7 @@
     sp<IDescrambler> openHidlDescrambler();
     vector<int> getLnbHandles();
     DemuxCapabilities getHidlDemuxCaps(TunerDemuxCapabilities& aidlCaps);
-    FrontendInfo FrontendInfoAidlToHidl(TunerFrontendInfo aidlFrontendInfo);
+    FrontendInfo frontendInfoAidlToHidl(TunerFrontendInfo aidlFrontendInfo);
     void updateTunerResources();
     void updateFrontendResources();
     void updateLnbResources();