Refactor Tuner JNI and move the interaction with IDescrambler into DescramblerClient

Test: atest android.media.tv.tuner.cts on Cuttlefish
Bug: 174095851
Change-Id: Ie6c465324bbec71b080f9fdead003f3c56d79010
diff --git a/media/java/android/media/tv/tuner/dvr/DvrRecorder.java b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java
index c4b622d..2f2cd96 100644
--- a/media/java/android/media/tv/tuner/dvr/DvrRecorder.java
+++ b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java
@@ -47,7 +47,7 @@
     private static int sInstantId = 0;
     private int mSegmentId = 0;
     private int mOverflow;
-    private Boolean mIsStopped = null;
+    private Boolean mIsStopped = true;
 
     private native int nativeAttachFilter(Filter filter);
     private native int nativeDetachFilter(Filter filter);
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 5a18a4c..3825133 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -1747,21 +1747,17 @@
 
 jobject JTuner::openDescrambler() {
     ALOGD("JTuner::openDescrambler");
-    if (mTuner == nullptr || mDemux == nullptr) {
+    if (mTunerClient == nullptr || mDemuxClient == nullptr) {
         return NULL;
     }
-    sp<IDescrambler> descramblerSp;
-    Result res;
-    mTuner->openDescrambler([&](Result r, const sp<IDescrambler>& descrambler) {
-        res = r;
-        descramblerSp = descrambler;
-    });
+    sp<DescramblerClient> descramblerClient = mTunerClient->openDescrambler(0/*unused*/);
 
-    if (res != Result::SUCCESS || descramblerSp == NULL) {
+    if (descramblerClient == NULL) {
+        ALOGD("Failed to open descrambler");
         return NULL;
     }
 
-    descramblerSp->setDemuxSource(mDemuxId);
+    descramblerClient->setDemuxSource(mDemuxClient);
 
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jobject descramblerObj =
@@ -1769,8 +1765,8 @@
                     env->FindClass("android/media/tv/tuner/Descrambler"),
                     gFields.descramblerInitID);
 
-    descramblerSp->incStrong(descramblerObj);
-    env->SetLongField(descramblerObj, gFields.descramblerContext, (jlong)descramblerSp.get());
+    descramblerClient->incStrong(descramblerObj);
+    env->SetLongField(descramblerObj, gFields.descramblerContext, (jlong)descramblerClient.get());
 
     return descramblerObj;
 }
@@ -2570,8 +2566,8 @@
     return (JTuner *)env->GetLongField(thiz, gFields.tunerContext);
 }
 
-static sp<IDescrambler> getDescrambler(JNIEnv *env, jobject descrambler) {
-    return (IDescrambler *)env->GetLongField(descrambler, gFields.descramblerContext);
+static sp<DescramblerClient> getDescramblerClient(JNIEnv *env, jobject descrambler) {
+    return (DescramblerClient *)env->GetLongField(descrambler, gFields.descramblerContext);
 }
 
 static uint32_t getResourceIdFromHandle(jint handle) {
@@ -4097,49 +4093,47 @@
 
 static jint android_media_tv_Tuner_descrambler_add_pid(
         JNIEnv *env, jobject descrambler, jint pidType, jint pid, jobject filter) {
-    sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler);
-    if (descramblerSp == NULL) {
+    sp<DescramblerClient> descramblerClient = getDescramblerClient(env, descrambler);
+    if (descramblerClient == NULL) {
         return (jint) Result::NOT_INITIALIZED;
     }
-    // TODO: use filter client once descramblerClient is ready
-    sp<IFilter> iFilterSp = getFilterClient(env, filter)->getHalFilter();
-    Result result = descramblerSp->addPid(getDemuxPid((int)pidType, (int)pid), iFilterSp);
+    sp<FilterClient> filterClient = getFilterClient(env, filter);
+    Result result = descramblerClient->addPid(getDemuxPid((int)pidType, (int)pid), filterClient);
     return (jint) result;
 }
 
 static jint android_media_tv_Tuner_descrambler_remove_pid(
         JNIEnv *env, jobject descrambler, jint pidType, jint pid, jobject filter) {
-    sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler);
-    if (descramblerSp == NULL) {
+    sp<DescramblerClient> descramblerClient = getDescramblerClient(env, descrambler);
+    if (descramblerClient == NULL) {
         return (jint) Result::NOT_INITIALIZED;
     }
-    // TODO: use filter client once descramblerClient is ready
-    sp<IFilter> iFilterSp = getFilterClient(env, filter)->getHalFilter();
-    Result result = descramblerSp->removePid(getDemuxPid((int)pidType, (int)pid), iFilterSp);
+    sp<FilterClient> filterClient = getFilterClient(env, filter);
+    Result result = descramblerClient->removePid(getDemuxPid((int)pidType, (int)pid), filterClient);
     return (jint) result;
 }
 
 static jint android_media_tv_Tuner_descrambler_set_key_token(
         JNIEnv* env, jobject descrambler, jbyteArray keyToken) {
-    sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler);
-    if (descramblerSp == NULL) {
+    sp<DescramblerClient> descramblerClient = getDescramblerClient(env, descrambler);
+    if (descramblerClient == NULL) {
         return (jint) Result::NOT_INITIALIZED;
     }
     int size = env->GetArrayLength(keyToken);
     std::vector<uint8_t> v(size);
     env->GetByteArrayRegion(keyToken, 0, size, reinterpret_cast<jbyte*>(&v[0]));
-    Result result = descramblerSp->setKeyToken(v);
+    Result result = descramblerClient->setKeyToken(v);
     return (jint) result;
 }
 
 static jint android_media_tv_Tuner_close_descrambler(JNIEnv* env, jobject descrambler) {
-    sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler);
-    if (descramblerSp == NULL) {
+    sp<DescramblerClient> descramblerClient = getDescramblerClient(env, descrambler);
+    if (descramblerClient == NULL) {
         return (jint) Result::NOT_INITIALIZED;
     }
-    Result r = descramblerSp->close();
+    Result r = descramblerClient->close();
     if (r == Result::SUCCESS) {
-        descramblerSp->decStrong(descrambler);
+        descramblerClient->decStrong(descrambler);
     }
     return (jint) r;
 }
diff --git a/media/jni/tuner/DemuxClient.cpp b/media/jni/tuner/DemuxClient.cpp
index 59dfd70..58f9a46 100644
--- a/media/jni/tuner/DemuxClient.cpp
+++ b/media/jni/tuner/DemuxClient.cpp
@@ -32,11 +32,13 @@
 // TODO: pending aidl interface
 DemuxClient::DemuxClient() {
     //mTunerDemux = tunerDemux;
+    mId = -1;
 }
 
 DemuxClient::~DemuxClient() {
     //mTunerDemux = NULL;
     mDemux = NULL;
+    mId = -1;
 }
 
 // TODO: remove after migration to Tuner Service is done.
diff --git a/media/jni/tuner/DemuxClient.h b/media/jni/tuner/DemuxClient.h
index f11f2c6..7b8eede 100644
--- a/media/jni/tuner/DemuxClient.h
+++ b/media/jni/tuner/DemuxClient.h
@@ -88,6 +88,9 @@
      */
     Result close();
 
+    void setId(int id) { mId = id; }
+    int getId() { return mId; }
+
 private:
     sp<IFilter> openHidlFilter(DemuxFilterType type, int bufferSize, sp<HidlFilterCallback> cb);
     sp<IDvr> openHidlDvr(DvrType type, int bufferSize, sp<HidlDvrCallback> cb);
@@ -105,6 +108,8 @@
      * Default null when the HAL service does not exist.
      */
     sp<IDemux> mDemux;
+
+    int mId;
 };
 }  // namespace android
 
diff --git a/media/jni/tuner/DescramblerClient.cpp b/media/jni/tuner/DescramblerClient.cpp
index f0ea418b..979beea 100644
--- a/media/jni/tuner/DescramblerClient.cpp
+++ b/media/jni/tuner/DescramblerClient.cpp
@@ -42,25 +42,56 @@
     mDescrambler = descrambler;
 }
 
-Result DescramblerClient::setDemuxSource(sp<DemuxClient> /*demuxClient*/) {
-    return Result::SUCCESS;
+Result DescramblerClient::setDemuxSource(sp<DemuxClient> demuxClient) {
+    if (demuxClient == NULL) {
+        return Result::INVALID_ARGUMENT;
+    }
+
+    // TODO: pending aidl interface
+
+    if (mDescrambler != NULL) {
+        return mDescrambler->setDemuxSource(demuxClient->getId());
+    }
+
+    return Result::INVALID_STATE;
 }
 
-Result DescramblerClient::setKeyToken(vector<uint8_t> /*keyToken*/) {
-    return Result::SUCCESS;
+Result DescramblerClient::setKeyToken(vector<uint8_t> keyToken) {
+    // TODO: pending aidl interface
+
+    if (mDescrambler != NULL) {
+        return mDescrambler->setKeyToken(keyToken);
+    }
+
+    return Result::INVALID_STATE;
 }
 
-Result DescramblerClient::addPid(DemuxPid /*pid*/, sp<FilterClient> /*optionalSourceFilter*/) {
-    return Result::SUCCESS;
-}
+Result DescramblerClient::addPid(DemuxPid pid, sp<FilterClient> optionalSourceFilter) {
+    // TODO: pending aidl interface
 
-Result DescramblerClient::removePid(DemuxPid /*pid*/, sp<FilterClient> /*optionalSourceFilter*/) {
-    return Result::SUCCESS;
-}
+    if (mDescrambler != NULL) {
+        return mDescrambler->addPid(pid, optionalSourceFilter->getHalFilter());
+    }
+
+    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());
+    }
+
+    return Result::INVALID_STATE;}
 
 Result DescramblerClient::close() {
-    return Result::SUCCESS;
-}
+    // TODO: pending aidl interface
+
+    if (mDescrambler != NULL) {
+        return mDescrambler->close();
+    }
+
+    return Result::INVALID_STATE;}
 
 /////////////// DescramblerClient Helper Methods ///////////////////////
 
diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp
index 69cd3d3..e469aa3 100644
--- a/media/jni/tuner/TunerClient.cpp
+++ b/media/jni/tuner/TunerClient.cpp
@@ -161,9 +161,11 @@
     if (mTuner != NULL) {
         // TODO: pending aidl interface
         sp<DemuxClient> demuxClient = new DemuxClient();
-        sp<IDemux> hidlDemux = openHidlDemux();
+        int demuxId;
+        sp<IDemux> hidlDemux = openHidlDemux(demuxId);
         if (hidlDemux != NULL) {
             demuxClient->setHidlDemux(hidlDemux);
+            demuxClient->setId(demuxId);
             return demuxClient;
         }
     }
@@ -177,8 +179,24 @@
 }
 
 sp<DescramblerClient> TunerClient::openDescrambler(int /*descramblerHandle*/) {
-    return NULL;
-}
+    if (mTunerService != NULL) {
+        // TODO: handle error code
+        /*shared_ptr<ITunerDescrambler> tunerDescrambler;
+        mTunerService->openDescrambler(demuxHandle, &tunerDescrambler);
+        return new DescramblerClient(tunerDescrambler);*/
+    }
+
+    if (mTuner != NULL) {
+        // TODO: pending aidl interface
+        sp<DescramblerClient> descramblerClient = new DescramblerClient();
+        sp<IDescrambler> hidlDescrambler = openHidlDescrambler();
+        if (hidlDescrambler != NULL) {
+            descramblerClient->setHidlDescrambler(hidlDescrambler);
+            return descramblerClient;
+        }
+    }
+
+    return NULL;}
 
 sp<LnbClient> TunerClient::openLnb(int lnbHandle) {
     if (mTunerService != NULL) {
@@ -272,12 +290,13 @@
     return res;
 }
 
-sp<IDemux> TunerClient::openHidlDemux() {
+sp<IDemux> TunerClient::openHidlDemux(int& demuxId) {
     sp<IDemux> demux;
     Result res;
 
-    mTuner->openDemux([&](Result result, uint32_t /*id*/, const sp<IDemux>& demuxSp) {
+    mTuner->openDemux([&](Result result, uint32_t id, const sp<IDemux>& demuxSp) {
         demux = demuxSp;
+        demuxId = id;
         res = result;
     });
     if (res != Result::SUCCESS || demux == nullptr) {
@@ -318,6 +337,22 @@
     return lnb;
 }
 
+sp<IDescrambler> TunerClient::openHidlDescrambler() {
+    sp<IDescrambler> descrambler;
+    Result res;
+
+    mTuner->openDescrambler([&](Result r, const sp<IDescrambler>& descramblerSp) {
+        res = r;
+        descrambler = descramblerSp;
+    });
+
+    if (res != Result::SUCCESS || descrambler == NULL) {
+        return NULL;
+    }
+
+    return descrambler;
+}
+
 FrontendInfo TunerClient::FrontendInfoAidlToHidl(TunerServiceFrontendInfo aidlFrontendInfo) {
     FrontendInfo hidlFrontendInfo {
         .type = static_cast<FrontendType>(aidlFrontendInfo.type),
diff --git a/media/jni/tuner/TunerClient.h b/media/jni/tuner/TunerClient.h
index 06ba7a5..036360f 100644
--- a/media/jni/tuner/TunerClient.h
+++ b/media/jni/tuner/TunerClient.h
@@ -131,10 +131,11 @@
 private:
     sp<ITuner> getHidlTuner();
     sp<IFrontend> openHidlFrontendById(int id);
-    sp<IDemux> openHidlDemux();
+    sp<IDemux> openHidlDemux(int& demuxId);
     Result getHidlFrontendInfo(int id, FrontendInfo& info);
     sp<ILnb> openHidlLnbById(int id);
     sp<ILnb> openHidlLnbByName(string name, LnbId& lnbId);
+    sp<IDescrambler> openHidlDescrambler();
     FrontendInfo FrontendInfoAidlToHidl(TunerServiceFrontendInfo aidlFrontendInfo);
 
     int getResourceIdFromHandle(int handle, int resourceType);