Refactor Tuner JNI and move the interaction with ILnb into LnbClient

Test: atest android.media.tv.tuner.cts on Cuttlefish
Bug: 174095851
Change-Id: I3903f62949aec0dac61388b356e7d7850a5a044c
diff --git a/media/jni/tuner/FrontendClient.cpp b/media/jni/tuner/FrontendClient.cpp
index b6225cf..9dd4df7 100644
--- a/media/jni/tuner/FrontendClient.cpp
+++ b/media/jni/tuner/FrontendClient.cpp
@@ -99,6 +99,21 @@
     return Result::INVALID_STATE;
 }
 
+Result FrontendClient::setLnb(sp<LnbClient> lnbClient) {
+    if (mTunerFrontend != NULL) {
+        // TODO: handle error message.
+        /*mTunerFrontend->setLnb(lnbClient->getAidlLnb());
+        return Result::SUCCESS;*/
+    }
+
+    if (mFrontend != NULL) {
+        Result result = mFrontend->setLnb(lnbClient->getId());
+        return result;
+    }
+
+    return Result::INVALID_STATE;
+}
+
 Result FrontendClient::close() {
     if (mTunerFrontend != NULL) {
         // TODO: handle error message.
diff --git a/media/jni/tuner/FrontendClient.h b/media/jni/tuner/FrontendClient.h
index 265e14f..b24f944 100644
--- a/media/jni/tuner/FrontendClient.h
+++ b/media/jni/tuner/FrontendClient.h
@@ -24,6 +24,7 @@
 #include <android/hardware/tv/tuner/1.1/types.h>
 
 #include "FrontendClientCallback.h"
+#include "LnbClient.h"
 
 using Status = ::ndk::ScopedAStatus;
 
@@ -127,6 +128,11 @@
     Result stopTune();
 
     /**
+     * Sets Low-Noise Block downconverter (LNB) for satellite frontend.
+     */
+    Result setLnb(sp<LnbClient> lnbClient);
+
+    /**
      * Close Frontend.
      */
     Result close();
diff --git a/media/jni/tuner/LnbClient.cpp b/media/jni/tuner/LnbClient.cpp
index c9f9f84..7f3916f 100644
--- a/media/jni/tuner/LnbClient.cpp
+++ b/media/jni/tuner/LnbClient.cpp
@@ -30,11 +30,13 @@
 // TODO: pending aidl interface
 LnbClient::LnbClient() {
     //mTunerLnb = tunerLnb;
+    mId = -1;
 }
 
 LnbClient::~LnbClient() {
     //mTunerLnb = NULL;
     mLnb = NULL;
+    mId = -1;
 }
 
 // TODO: remove after migration to Tuner Service is done.
@@ -42,28 +44,66 @@
     mLnb = lnb;
 }
 
-Result LnbClient::setCallback(sp<LnbClientCallback> /*cb*/) {
-    return Result::SUCCESS;
+Result LnbClient::setCallback(sp<LnbClientCallback> cb) {
+    // TODO: pending aidl interface
+    /*if (mTunerFrontend != NULL) {
+        mAidlCallback = ::ndk::SharedRefBase::make<TunerLnbCallback>(cb);
+        mTunerLnb->setCallback(mAidlCallback);
+        return Result::SUCCESS;
+    }*/
+
+    mHidlCallback = new HidlLnbCallback(cb);
+    return mLnb->setCallback(mHidlCallback);
 }
 
-Result LnbClient::setVoltage(int /*voltage*/) {
-    return Result::SUCCESS;
+Result LnbClient::setVoltage(LnbVoltage voltage) {
+    // TODO: pending aidl interface
+
+    if (mLnb != NULL) {
+        return mLnb->setVoltage(voltage);
+    }
+
+    return Result::INVALID_STATE;
 }
 
-Result LnbClient::setTone(int /*tone*/) {
-    return Result::SUCCESS;
+Result LnbClient::setTone(LnbTone tone) {
+    // TODO: pending aidl interface
+
+    if (mLnb != NULL) {
+        return mLnb->setTone(tone);
+    }
+
+    return Result::INVALID_STATE;
 }
 
-Result LnbClient::setSatellitePosition(int /*position*/) {
-    return Result::SUCCESS;
+Result LnbClient::setSatellitePosition(LnbPosition position) {
+    // TODO: pending aidl interface
+
+    if (mLnb != NULL) {
+        return mLnb->setSatellitePosition(position);
+    }
+
+    return Result::INVALID_STATE;
 }
 
-Result LnbClient::sendDiseqcMessage(vector<uint8_t> /*diseqcMessage*/) {
-    return Result::SUCCESS;
+Result LnbClient::sendDiseqcMessage(vector<uint8_t> diseqcMessage) {
+    // TODO: pending aidl interface
+
+    if (mLnb != NULL) {
+        return mLnb->sendDiseqcMessage(diseqcMessage);
+    }
+
+    return Result::INVALID_STATE;
 }
 
 Result LnbClient::close() {
-    return Result::SUCCESS;
+    // TODO: pending aidl interface
+
+    if (mLnb != NULL) {
+        return mLnb->close();
+    }
+
+    return Result::INVALID_STATE;
 }
 
 /////////////// ILnbCallback ///////////////////////
diff --git a/media/jni/tuner/LnbClient.h b/media/jni/tuner/LnbClient.h
index c548777..533a996 100644
--- a/media/jni/tuner/LnbClient.h
+++ b/media/jni/tuner/LnbClient.h
@@ -31,6 +31,10 @@
 using ::android::hardware::hidl_vec;
 using ::android::hardware::tv::tuner::V1_0::ILnb;
 using ::android::hardware::tv::tuner::V1_0::ILnbCallback;
+using ::android::hardware::tv::tuner::V1_0::LnbId;
+using ::android::hardware::tv::tuner::V1_0::LnbPosition;
+using ::android::hardware::tv::tuner::V1_0::LnbTone;
+using ::android::hardware::tv::tuner::V1_0::LnbVoltage;
 using ::android::hardware::tv::tuner::V1_0::Result;
 
 using namespace std;
@@ -79,17 +83,17 @@
     /**
      * Set the lnb's power voltage.
      */
-    Result setVoltage(int voltage);
+    Result setVoltage(LnbVoltage voltage);
 
     /**
      * Set the lnb's tone mode.
      */
-    Result setTone(int tone);
+    Result setTone(LnbTone tone);
 
     /**
      * Select the lnb's position.
      */
-    Result setSatellitePosition(int position);
+    Result setSatellitePosition(LnbPosition position);
 
     /**
      * Sends DiSEqC (Digital Satellite Equipment Control) message.
@@ -101,6 +105,10 @@
      */
     Result close();
 
+    //shared_ptr<ITunerLnb> getAidlLnb() { return mTunerLnb; }
+    void setId(LnbId id) { mId = id; }
+    LnbId getId() { return mId; }
+
 private:
     /**
      * An AIDL Tuner Lnb Singleton assigned at the first time the Tuner Client
@@ -115,6 +123,11 @@
      * Default null when the HAL service does not exist.
      */
     sp<ILnb> mLnb;
+
+    //shared_ptr<TunerLnbCallback> mAidlCallback;
+    sp<HidlLnbCallback> mHidlCallback;
+
+    LnbId mId;
 };
 }  // namespace android
 
diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp
index 67a559c..69cd3d3 100644
--- a/media/jni/tuner/TunerClient.cpp
+++ b/media/jni/tuner/TunerClient.cpp
@@ -180,11 +180,49 @@
     return NULL;
 }
 
-sp<LnbClient> TunerClient::openLnb(int /*lnbHandle*/) {
+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);*/
+    }
+
+    if (mTuner != NULL) {
+        int id = getResourceIdFromHandle(lnbHandle, LNB);
+        // TODO: pending aidl interface
+        sp<LnbClient> lnbClient = new LnbClient();
+        sp<ILnb> hidlLnb = openHidlLnbById(id);
+        if (hidlLnb != NULL) {
+            lnbClient->setHidlLnb(hidlLnb);
+            lnbClient->setId(id);
+            return lnbClient;
+        }
+    }
+
     return NULL;
 }
 
-sp<LnbClient> TunerClient::openLnbByName(string /*lnbName*/) {
+sp<LnbClient> TunerClient::openLnbByName(string lnbName) {
+    if (mTunerService != NULL) {
+        // TODO: handle error code
+        /*shared_ptr<ITunerLnb> tunerLnb;
+        mTunerService->openLnbByName(lnbName, &tunerLnb);
+        return new LnbClient(tunerLnb);*/
+    }
+
+    if (mTuner != NULL) {
+        // TODO: pending aidl interface
+        sp<LnbClient> lnbClient = new LnbClient();
+        LnbId id;
+        sp<ILnb> hidlLnb = openHidlLnbByName(lnbName, id);
+        if (hidlLnb != NULL) {
+            lnbClient->setHidlLnb(hidlLnb);
+            lnbClient->setId(id);
+            return lnbClient;
+        }
+    }
+
     return NULL;
 }
 
@@ -249,6 +287,37 @@
     return demux;
 }
 
+sp<ILnb> TunerClient::openHidlLnbById(int id) {
+    sp<ILnb> lnb;
+    Result res;
+
+    mTuner->openLnbById(id, [&](Result r, const sp<ILnb>& lnbSp) {
+        res = r;
+        lnb = lnbSp;
+    });
+    if (res != Result::SUCCESS || lnb == nullptr) {
+        ALOGE("Failed to open lnb by id");
+        return NULL;
+    }
+    return lnb;
+}
+
+sp<ILnb> TunerClient::openHidlLnbByName(string name, LnbId& lnbId) {
+    sp<ILnb> lnb;
+    Result res;
+
+    mTuner->openLnbByName(name, [&](Result r, LnbId id, const sp<ILnb>& lnbSp) {
+        res = r;
+        lnb = lnbSp;
+        lnbId = id;
+    });
+    if (res != Result::SUCCESS || lnb == nullptr) {
+        ALOGE("Failed to open lnb by name");
+        return NULL;
+    }
+    return lnb;
+}
+
 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 98ae24d..06ba7a5 100644
--- a/media/jni/tuner/TunerClient.h
+++ b/media/jni/tuner/TunerClient.h
@@ -133,6 +133,8 @@
     sp<IFrontend> openHidlFrontendById(int id);
     sp<IDemux> openHidlDemux();
     Result getHidlFrontendInfo(int id, FrontendInfo& info);
+    sp<ILnb> openHidlLnbById(int id);
+    sp<ILnb> openHidlLnbByName(string name, LnbId& lnbId);
     FrontendInfo FrontendInfoAidlToHidl(TunerServiceFrontendInfo aidlFrontendInfo);
 
     int getResourceIdFromHandle(int handle, int resourceType);