Add FilterClientCallback implementation

Test: make libmedia_tv_tuner
Bug: 174095851
Change-Id: I5a4e2f58a10e19c83db5771563718be29196f2a8
diff --git a/media/jni/tuner/DemuxClient.cpp b/media/jni/tuner/DemuxClient.cpp
index abf7d56..11acb5e 100644
--- a/media/jni/tuner/DemuxClient.cpp
+++ b/media/jni/tuner/DemuxClient.cpp
@@ -44,26 +44,59 @@
     mDemux = demux;
 }
 
-Result DemuxClient::setFrontendDataSource(sp<FrontendClient> tunerFrontend) {
+Result DemuxClient::setFrontendDataSource(sp<FrontendClient> frontendClient) {
     // TODO: pending aidl interface
     /*if (mTunerDemux != NULL) {
         // TODO: handle error message
-        mTunerDemux->setFrontendDataSource(tunerFrontend->getAidlFrontend());
+        mTunerDemux->setFrontendDataSource(frontendClient->getAidlFrontend());
         return (int) Result::SUCCESS;
     }*/
 
     if (mDemux != NULL) {
-        Result res = mDemux->setFrontendDataSource(tunerFrontend->getId());
+        Result res = mDemux->setFrontendDataSource(frontendClient->getId());
         return res;
     }
 
     return Result::INVALID_STATE;
 }
 
-//FilterClient openFilter(int mainType, int subType, int bufferSize, FilterClientCallback cb);
+sp<FilterClient> DemuxClient::openFilter(DemuxFilterType type, int bufferSize,
+        sp<FilterClientCallback> cb) {
+    // TODO: pending aidl interface
 
-int DemuxClient::getAvSyncHwId(FilterClient /*tunerFilter*/) {
-    return 0;
+    if (mDemux != NULL) {
+        sp<HidlFilterCallback> callback = new HidlFilterCallback(cb);
+        sp<IFilter> hidlFilter = openHidlFilter(type, bufferSize, callback);
+        if (hidlFilter != NULL) {
+            sp<FilterClient> filterClient = new FilterClient();
+            filterClient->setHidlFilter(hidlFilter);
+            return filterClient;
+        }
+    }
+
+    // TODO: handle share av memory handle
+
+    return NULL;
+}
+
+int DemuxClient::getAvSyncHwId(sp<FilterClient> filterClient) {
+    // pending aidl interface
+
+    if (mDemux != NULL) {
+        uint32_t avSyncHwId;
+        Result res;
+        sp<IFilter> halFilter = filterClient->getHalFilter();
+        mDemux->getAvSyncHwId(halFilter,
+                [&](Result r, uint32_t id) {
+                    res = r;
+                    avSyncHwId = id;
+                });
+        if (res == Result::SUCCESS) {
+            return (int) avSyncHwId;
+        }
+    }
+
+    return -1;
 }
 
 long DemuxClient::getAvSyncTime(int avSyncHwId) {
@@ -120,4 +153,26 @@
 
     return Result::INVALID_STATE;
 }
+
+/////////////// DemuxClient Helper Methods ///////////////////////
+
+sp<IFilter> DemuxClient::openHidlFilter(DemuxFilterType type, int bufferSize,
+        sp<HidlFilterCallback> callback) {
+    if (mDemux == NULL) {
+        return NULL;
+    }
+
+    sp<IFilter> hidlFilter;
+    Result res;
+    mDemux->openFilter(type, bufferSize, callback,
+            [&](Result r, const sp<IFilter>& filter) {
+                hidlFilter = filter;
+                res = r;
+            });
+    if (res != Result::SUCCESS || hidlFilter == NULL) {
+        return NULL;
+    }
+
+    return hidlFilter;
+}
 }  // namespace android