Connect LnbClient to TunerLnb interface and handle error messages

Test: make libmedia_tv_tuner
Bug: 159067322
Change-Id: Iaadf431c984bdbf3a59f9bdd073639f4b3dc12bb
diff --git a/media/jni/tuner/LnbClient.cpp b/media/jni/tuner/LnbClient.cpp
index 7f3916f..77583b8 100644
--- a/media/jni/tuner/LnbClient.cpp
+++ b/media/jni/tuner/LnbClient.cpp
@@ -19,6 +19,7 @@
 #include <android-base/logging.h>
 #include <utils/Log.h>
 
+#include "TunerClient.h"
 #include "LnbClient.h"
 
 using ::android::hardware::tv::tuner::V1_0::Result;
@@ -27,14 +28,13 @@
 
 /////////////// LnbClient ///////////////////////
 
-// TODO: pending aidl interface
-LnbClient::LnbClient() {
-    //mTunerLnb = tunerLnb;
+LnbClient::LnbClient(shared_ptr<ITunerLnb> tunerLnb) {
+    mTunerLnb = tunerLnb;
     mId = -1;
 }
 
 LnbClient::~LnbClient() {
-    //mTunerLnb = NULL;
+    mTunerLnb = NULL;
     mLnb = NULL;
     mId = -1;
 }
@@ -45,19 +45,21 @@
 }
 
 Result LnbClient::setCallback(sp<LnbClientCallback> cb) {
-    // TODO: pending aidl interface
-    /*if (mTunerFrontend != NULL) {
+    if (mTunerLnb != NULL) {
         mAidlCallback = ::ndk::SharedRefBase::make<TunerLnbCallback>(cb);
-        mTunerLnb->setCallback(mAidlCallback);
-        return Result::SUCCESS;
-    }*/
+        Status s = mTunerLnb->setCallback(mAidlCallback);
+        return TunerClient::getServiceSpecificErrorCode(s);
+    }
 
     mHidlCallback = new HidlLnbCallback(cb);
     return mLnb->setCallback(mHidlCallback);
 }
 
 Result LnbClient::setVoltage(LnbVoltage voltage) {
-    // TODO: pending aidl interface
+    if (mTunerLnb != NULL) {
+        Status s = mTunerLnb->setVoltage((int)voltage);
+        return TunerClient::getServiceSpecificErrorCode(s);
+    }
 
     if (mLnb != NULL) {
         return mLnb->setVoltage(voltage);
@@ -67,7 +69,10 @@
 }
 
 Result LnbClient::setTone(LnbTone tone) {
-    // TODO: pending aidl interface
+    if (mTunerLnb != NULL) {
+        Status s = mTunerLnb->setTone((int)tone);
+        return TunerClient::getServiceSpecificErrorCode(s);
+    }
 
     if (mLnb != NULL) {
         return mLnb->setTone(tone);
@@ -77,7 +82,10 @@
 }
 
 Result LnbClient::setSatellitePosition(LnbPosition position) {
-    // TODO: pending aidl interface
+    if (mTunerLnb != NULL) {
+        Status s = mTunerLnb->setSatellitePosition((int)position);
+        return TunerClient::getServiceSpecificErrorCode(s);
+    }
 
     if (mLnb != NULL) {
         return mLnb->setSatellitePosition(position);
@@ -87,7 +95,10 @@
 }
 
 Result LnbClient::sendDiseqcMessage(vector<uint8_t> diseqcMessage) {
-    // TODO: pending aidl interface
+    if (mTunerLnb != NULL) {
+        Status s = mTunerLnb->sendDiseqcMessage(diseqcMessage);
+        return TunerClient::getServiceSpecificErrorCode(s);
+    }
 
     if (mLnb != NULL) {
         return mLnb->sendDiseqcMessage(diseqcMessage);
@@ -97,7 +108,10 @@
 }
 
 Result LnbClient::close() {
-    // TODO: pending aidl interface
+    if (mTunerLnb != NULL) {
+        Status s = mTunerLnb->close();
+        return TunerClient::getServiceSpecificErrorCode(s);
+    }
 
     if (mLnb != NULL) {
         return mLnb->close();
@@ -125,6 +139,25 @@
     return Void();
 }
 
-/////////////// LnbClient Helper Methods ///////////////////////
+/////////////// TunerLnbCallback ///////////////////////
 
+TunerLnbCallback::TunerLnbCallback(sp<LnbClientCallback> lnbClientCallback)
+        : mLnbClientCallback(lnbClientCallback) {}
+
+Status TunerLnbCallback::onEvent(int lnbEventType) {
+    if (mLnbClientCallback != NULL) {
+        mLnbClientCallback->onEvent(static_cast<LnbEventType>(lnbEventType));
+        return Status::ok();
+    }
+    return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
+}
+
+Status TunerLnbCallback::onDiseqcMessage(const vector<uint8_t>& diseqcMessage) {
+    if (mLnbClientCallback != NULL) {
+        hidl_vec<uint8_t> msg(begin(diseqcMessage), end(diseqcMessage));
+        mLnbClientCallback->onDiseqcMessage(msg);
+        return Status::ok();
+    }
+    return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
+}
 }  // namespace android
diff --git a/media/jni/tuner/LnbClient.h b/media/jni/tuner/LnbClient.h
index 533a996..2465120 100644
--- a/media/jni/tuner/LnbClient.h
+++ b/media/jni/tuner/LnbClient.h
@@ -17,14 +17,18 @@
 #ifndef _ANDROID_MEDIA_TV_LNB_CLIENT_H_
 #define _ANDROID_MEDIA_TV_LNB_CLIENT_H_
 
-//#include <aidl/android/media/tv/tuner/ITunerLnb.h>
+#include <aidl/android/media/tv/tuner/BnTunerLnbCallback.h>
+#include <aidl/android/media/tv/tuner/ITunerLnb.h>
 #include <android/hardware/tv/tuner/1.0/ILnb.h>
 #include <android/hardware/tv/tuner/1.0/ILnbCallback.h>
 #include <android/hardware/tv/tuner/1.1/types.h>
 
 #include "LnbClientCallback.h"
 
-//using ::aidl::android::media::tv::tuner::ITunerLnb;
+using Status = ::ndk::ScopedAStatus;
+
+using ::aidl::android::media::tv::tuner::BnTunerLnbCallback;
+using ::aidl::android::media::tv::tuner::ITunerLnb;
 
 using ::android::hardware::Return;
 using ::android::hardware::Void;
@@ -42,17 +46,17 @@
 namespace android {
 
 // TODO: pending aidl interface
-/*class TunerLnbCallback : public BnTunerLnbCallback {
+class TunerLnbCallback : public BnTunerLnbCallback {
 
 public:
     TunerLnbCallback(sp<LnbClientCallback> lnbClientCallback);
 
     Status onEvent(int lnbEventType);
-    Status onDiseqcMessage(vector<uint8_t> diseqcMessage);
+    Status onDiseqcMessage(const vector<uint8_t>& diseqcMessage);
 
 private:
     sp<LnbClientCallback> mLnbClientCallback;
-};*/
+};
 
 struct HidlLnbCallback : public ILnbCallback {
 
@@ -68,8 +72,7 @@
 struct LnbClient : public RefBase {
 
 public:
-    // TODO: add TunerLnb as parameter.
-    LnbClient();
+    LnbClient(shared_ptr<ITunerLnb> tunerLnb);
     ~LnbClient();
 
     // TODO: remove after migration to Tuner Service is done.
@@ -114,8 +117,7 @@
      * An AIDL Tuner Lnb Singleton assigned at the first time the Tuner Client
      * opens an Lnb. Default null when lnb is not opened.
      */
-    // TODO: pending on aidl interface
-    //shared_ptr<ITunerLnb> mTunerLnb;
+    shared_ptr<ITunerLnb> mTunerLnb;
 
     /**
      * A Lnb HAL interface that is ready before migrating to the TunerLnb.
@@ -124,7 +126,7 @@
      */
     sp<ILnb> mLnb;
 
-    //shared_ptr<TunerLnbCallback> mAidlCallback;
+    shared_ptr<TunerLnbCallback> mAidlCallback;
     sp<HidlLnbCallback> mHidlCallback;
 
     LnbId mId;
diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp
index f5e3524..498ba0e 100644
--- a/media/jni/tuner/TunerClient.cpp
+++ b/media/jni/tuner/TunerClient.cpp
@@ -229,15 +229,15 @@
 sp<LnbClient> TunerClient::openLnb(int lnbHandle) {
     if (mTunerService != NULL) {
         // TODO: handle error code
-        /*shared_ptr<ITunerLnb> tunerLnb;
-        mTunerService->openLnb(demuxHandle, &tunerLnb);
-        return new LnbClient(tunerLnb);*/
+        shared_ptr<ITunerLnb> tunerLnb;
+        mTunerService->openLnb(lnbHandle, &tunerLnb);
+        return new LnbClient(tunerLnb);
     }
 
     if (mTuner != NULL) {
         int id = getResourceIdFromHandle(lnbHandle, LNB);
         // TODO: pending aidl interface
-        sp<LnbClient> lnbClient = new LnbClient();
+        sp<LnbClient> lnbClient = new LnbClient(NULL);
         sp<ILnb> hidlLnb = openHidlLnbById(id);
         if (hidlLnb != NULL) {
             lnbClient->setHidlLnb(hidlLnb);
@@ -252,14 +252,14 @@
 sp<LnbClient> TunerClient::openLnbByName(string lnbName) {
     if (mTunerService != NULL) {
         // TODO: handle error code
-        /*shared_ptr<ITunerLnb> tunerLnb;
+        shared_ptr<ITunerLnb> tunerLnb;
         mTunerService->openLnbByName(lnbName, &tunerLnb);
-        return new LnbClient(tunerLnb);*/
+        return new LnbClient(tunerLnb);
     }
 
     if (mTuner != NULL) {
         // TODO: pending aidl interface
-        sp<LnbClient> lnbClient = new LnbClient();
+        sp<LnbClient> lnbClient = new LnbClient(NULL);
         LnbId id;
         sp<ILnb> hidlLnb = openHidlLnbByName(lnbName, id);
         if (hidlLnb != NULL) {
diff --git a/media/jni/tuner/TunerClient.h b/media/jni/tuner/TunerClient.h
index 8a1181a..733ee6b 100644
--- a/media/jni/tuner/TunerClient.h
+++ b/media/jni/tuner/TunerClient.h
@@ -20,6 +20,7 @@
 #include <aidl/android/media/tv/tunerresourcemanager/ITunerResourceManager.h>
 #include <aidl/android/media/tv/tuner/ITunerService.h>
 #include <aidl/android/media/tv/tuner/TunerFrontendInfo.h>
+#include <android/binder_parcel_utils.h>
 #include <android/hardware/tv/tuner/1.1/ITuner.h>
 #include <android/hardware/tv/tuner/1.1/types.h>
 
@@ -28,6 +29,8 @@
 #include "DescramblerClient.h"
 #include "LnbClient.h"
 
+using Status = ::ndk::ScopedAStatus;
+
 using ::aidl::android::media::tv::tuner::ITunerService;
 using ::aidl::android::media::tv::tuner::TunerFrontendInfo;
 using ::aidl::android::media::tv::tunerresourcemanager::ITunerResourceManager;
@@ -132,6 +135,15 @@
      */
     int getHalTunerVersion() { return mTunerVersion; }
 
+    static Result getServiceSpecificErrorCode(Status& s) {
+        if (s.getExceptionCode() == EX_SERVICE_SPECIFIC) {
+            return static_cast<Result>(s.getServiceSpecificError());
+        } else if (s.isOk()) {
+            return Result::SUCCESS;
+        }
+        return Result::UNKNOWN_ERROR;
+    }
+
 private:
     sp<ITuner> getHidlTuner();
     sp<IFrontend> openHidlFrontendById(int id);