Connect TunerDescrambler and DescramblerClient

Test: make
Bug: 174095851
Change-Id: I039f92cf6135ae7b0f67d6cd97fe0d95edef26be
diff --git a/media/jni/tuner/DemuxClient.h b/media/jni/tuner/DemuxClient.h
index 31eb35a..c38a8fa 100644
--- a/media/jni/tuner/DemuxClient.h
+++ b/media/jni/tuner/DemuxClient.h
@@ -100,6 +100,11 @@
      */
     Result close();
 
+    /**
+     * Get the Aidl demux to set as source.
+     */
+    shared_ptr<ITunerDemux> getAidlDemux() { return mTunerDemux; }
+
     void setId(int id) { mId = id; }
     int getId() { return mId; }
 
diff --git a/media/jni/tuner/DescramblerClient.cpp b/media/jni/tuner/DescramblerClient.cpp
index 979beea..c9bacda 100644
--- a/media/jni/tuner/DescramblerClient.cpp
+++ b/media/jni/tuner/DescramblerClient.cpp
@@ -27,13 +27,12 @@
 
 /////////////// DescramblerClient ///////////////////////
 
-// TODO: pending aidl interface
-DescramblerClient::DescramblerClient() {
-    //mTunerDescrambler = tunerDescrambler;
+DescramblerClient::DescramblerClient(shared_ptr<ITunerDescrambler> tunerDescrambler) {
+    mTunerDescrambler = tunerDescrambler;
 }
 
 DescramblerClient::~DescramblerClient() {
-    //mTunerDescrambler = NULL;
+    mTunerDescrambler = NULL;
     mDescrambler = NULL;
 }
 
@@ -47,7 +46,10 @@
         return Result::INVALID_ARGUMENT;
     }
 
-    // TODO: pending aidl interface
+    if (mTunerDescrambler != NULL) {
+        Status s = mTunerDescrambler->setDemuxSource(demuxClient->getAidlDemux());
+        return ClientHelper::getServiceSpecificErrorCode(s);
+    }
 
     if (mDescrambler != NULL) {
         return mDescrambler->setDemuxSource(demuxClient->getId());
@@ -57,7 +59,10 @@
 }
 
 Result DescramblerClient::setKeyToken(vector<uint8_t> keyToken) {
-    // TODO: pending aidl interface
+    if (mTunerDescrambler != NULL) {
+        Status s = mTunerDescrambler->setKeyToken(keyToken);
+        return ClientHelper::getServiceSpecificErrorCode(s);
+    }
 
     if (mDescrambler != NULL) {
         return mDescrambler->setKeyToken(keyToken);
@@ -67,7 +72,11 @@
 }
 
 Result DescramblerClient::addPid(DemuxPid pid, sp<FilterClient> optionalSourceFilter) {
-    // TODO: pending aidl interface
+    if (mTunerDescrambler != NULL) {
+        Status s = mTunerDescrambler->addPid(
+                getAidlDemuxPid(pid), optionalSourceFilter->getAidlFilter());
+        return ClientHelper::getServiceSpecificErrorCode(s);
+    }
 
     if (mDescrambler != NULL) {
         return mDescrambler->addPid(pid, optionalSourceFilter->getHalFilter());
@@ -76,16 +85,24 @@
     return Result::INVALID_STATE;}
 
 Result DescramblerClient::removePid(DemuxPid pid, sp<FilterClient> optionalSourceFilter) {
-    // TODO: pending aidl interface
-
-    if (mDescrambler != NULL) {
-        return mDescrambler->addPid(pid, optionalSourceFilter->getHalFilter());
+    if (mTunerDescrambler != NULL) {
+        Status s = mTunerDescrambler->removePid(
+                getAidlDemuxPid(pid), optionalSourceFilter->getAidlFilter());
+        return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    return Result::INVALID_STATE;}
+    if (mDescrambler != NULL) {
+        return mDescrambler->removePid(pid, optionalSourceFilter->getHalFilter());
+    }
+
+    return Result::INVALID_STATE;
+}
 
 Result DescramblerClient::close() {
-    // TODO: pending aidl interface
+    if (mTunerDescrambler != NULL) {
+        Status s = mTunerDescrambler->close();
+        return ClientHelper::getServiceSpecificErrorCode(s);
+    }
 
     if (mDescrambler != NULL) {
         return mDescrambler->close();
@@ -95,4 +112,16 @@
 
 /////////////// DescramblerClient Helper Methods ///////////////////////
 
+TunerDemuxPid DescramblerClient::getAidlDemuxPid(DemuxPid& pid) {
+    TunerDemuxPid aidlPid;
+    switch (pid.getDiscriminator()) {
+        case DemuxPid::hidl_discriminator::tPid:
+            aidlPid.set<TunerDemuxPid::tPid>((int)pid.tPid());
+            break;
+        case DemuxPid::hidl_discriminator::mmtpPid:
+            aidlPid.set<TunerDemuxPid::mmtpPid>((int)pid.mmtpPid());
+            break;
+    }
+    return aidlPid;
+}
 }  // namespace android
diff --git a/media/jni/tuner/DescramblerClient.h b/media/jni/tuner/DescramblerClient.h
index 8af6883..a8fa1e2 100644
--- a/media/jni/tuner/DescramblerClient.h
+++ b/media/jni/tuner/DescramblerClient.h
@@ -17,14 +17,15 @@
 #ifndef _ANDROID_MEDIA_TV_DESCRAMBLER_CLIENT_H_
 #define _ANDROID_MEDIA_TV_DESCRAMBLER_CLIENT_H_
 
-//#include <aidl/android/media/tv/tuner/ITunerDescrambler.h>
+#include <aidl/android/media/tv/tuner/ITunerDescrambler.h>
 #include <android/hardware/tv/tuner/1.0/IDescrambler.h>
 #include <android/hardware/tv/tuner/1.1/types.h>
 
 #include "DemuxClient.h"
 #include "FilterClient.h"
 
-//using ::aidl::android::media::tv::tuner::ITunerDescrambler;
+using ::aidl::android::media::tv::tuner::ITunerDescrambler;
+using ::aidl::android::media::tv::tuner::TunerDemuxPid;
 
 using ::android::hardware::tv::tuner::V1_0::IDescrambler;
 using ::android::hardware::tv::tuner::V1_0::Result;
@@ -37,8 +38,7 @@
 struct DescramblerClient : public RefBase {
 
 public:
-    // TODO: pending hidl interface
-    DescramblerClient();
+    DescramblerClient(shared_ptr<ITunerDescrambler> tunerDescrambler);
     ~DescramblerClient();
 
     // TODO: remove after migration to Tuner Service is done.
@@ -70,12 +70,13 @@
     Result close();
 
 private:
+    TunerDemuxPid getAidlDemuxPid(DemuxPid& pid);
+
     /**
      * An AIDL Tuner Descrambler Singleton assigned at the first time the Tuner Client
      * opens a descrambler. Default null when descrambler is not opened.
      */
-    // TODO: pending on aidl interface
-    //shared_ptr<ITunerDescrambler> mTunerDescrambler;
+    shared_ptr<ITunerDescrambler> mTunerDescrambler;
 
     /**
      * A Descrambler HAL interface that is ready before migrating to the TunerDescrambler.
diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp
index a604490d..240b144 100644
--- a/media/jni/tuner/TunerClient.cpp
+++ b/media/jni/tuner/TunerClient.cpp
@@ -224,17 +224,18 @@
     return NULL;
 }
 
-sp<DescramblerClient> TunerClient::openDescrambler(int /*descramblerHandle*/) {
+sp<DescramblerClient> TunerClient::openDescrambler(int descramblerHandle) {
     if (mTunerService != NULL) {
-        // TODO: handle error code
-        /*shared_ptr<ITunerDescrambler> tunerDescrambler;
-        mTunerService->openDescrambler(demuxHandle, &tunerDescrambler);
-        return new DescramblerClient(tunerDescrambler);*/
+        shared_ptr<ITunerDescrambler> tunerDescrambler;
+        Status s = mTunerService->openDescrambler(descramblerHandle, &tunerDescrambler);
+        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
+            return NULL;
+        }
+        return new DescramblerClient(tunerDescrambler);
     }
 
     if (mTuner != NULL) {
-        // TODO: pending aidl interface
-        sp<DescramblerClient> descramblerClient = new DescramblerClient();
+        sp<DescramblerClient> descramblerClient = new DescramblerClient(NULL);
         sp<IDescrambler> hidlDescrambler = openHidlDescrambler();
         if (hidlDescrambler != NULL) {
             descramblerClient->setHidlDescrambler(hidlDescrambler);