Fully remove Frontend HAL from Tuner JNI and use Frontend Client instead

Test: atest android.media.tv.tuner.cts on Cuttlefish
Bug: 174095851
Change-Id: Ia011e776035827ca4dcf2ae9f4728513e5cf5a0a
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 3825133..b91d347 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -859,8 +859,7 @@
 
 /////////////// FrontendClientCallbackImpl ///////////////////////
 
-FrontendClientCallbackImpl::FrontendClientCallbackImpl(
-        jweak tunerObj, FrontendId id) : mObject(tunerObj), mId(id) {}
+FrontendClientCallbackImpl::FrontendClientCallbackImpl(jweak tunerObj) : mObject(tunerObj) {}
 
 void FrontendClientCallbackImpl::onEvent(FrontendEventType frontendEventType) {
     ALOGD("FrontendClientCallbackImpl::onEvent, type=%d", frontendEventType);
@@ -1123,8 +1122,8 @@
 }
 
 JTuner::~JTuner() {
-    if (mFe != NULL) {
-        mFe->close();
+    if (mFeClient != NULL) {
+        mFeClient->close();
     }
     if (mDemux != NULL) {
         mDemux->close();
@@ -1134,7 +1133,6 @@
     env->DeleteWeakGlobalRef(mObject);
     env->DeleteGlobalRef(mClass);
     mTuner = NULL;
-    mFe = NULL;
     mDemux = NULL;
     mTunerClient = NULL;
     mFeClient = NULL;
@@ -1189,27 +1187,6 @@
 }
 
 jobject JTuner::openFrontendByHandle(int feHandle) {
-    sp<IFrontend> fe;
-    Result res;
-    uint32_t id = getResourceIdFromHandle(feHandle);
-
-    mTuner->openFrontendById(id, [&](Result r, const sp<IFrontend>& frontend) {
-        fe = frontend;
-        res = r;
-    });
-    if (res != Result::SUCCESS || fe == nullptr) {
-        ALOGE("Failed to open frontend");
-        return NULL;
-    }
-    mFe = fe;
-    mFe_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFe);
-    mFeId = id;
-    if (mDemux != NULL) {
-        mDemux->setFrontendDataSource(mFeId);
-    }
-
-    jint jId = (jint) id;
-
     // TODO: Handle reopening frontend with different handle
     sp<FrontendClient> feClient = mTunerClient->openFrontend(feHandle);
     if (feClient == NULL) {
@@ -1219,11 +1196,10 @@
     mFeClient = feClient;
 
     mFeId = mFeClient->getId();
-    jId = (jint) id;
     if (mDemuxClient != NULL) {
         mDemuxClient->setFrontendDataSource(mFeClient);
     }
-    sp<FrontendClientCallbackImpl> feClientCb = new FrontendClientCallbackImpl(mObject, id);
+    sp<FrontendClientCallbackImpl> feClientCb = new FrontendClientCallbackImpl(mObject);
     mFeClient->setCallback(feClientCb);
 
     JNIEnv *env = AndroidRuntime::getJNIEnv();
@@ -1232,7 +1208,7 @@
             env->FindClass("android/media/tv/tuner/Tuner$Frontend"),
             gFields.frontendInitID,
             mObject,
-            (jint) jId);
+            (jint) mFeId);
 }
 
 jobject JTuner::getAnalogFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps) {
@@ -1536,29 +1512,20 @@
 
 int JTuner::scan(const FrontendSettings& settings, FrontendScanType scanType,
         const FrontendSettingsExt1_1& settingsExt1_1) {
-    if (mFe == NULL) {
-        ALOGE("frontend is not initialized");
+    if (mFeClient == NULL) {
+        ALOGE("frontend client is not initialized");
         return (int)Result::INVALID_STATE;
     }
-    Result result;
-    sp<::android::hardware::tv::tuner::V1_1::IFrontend> fe_1_1 =
-            ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFe);
-    if (fe_1_1 == NULL) {
-        ALOGD("1.1 frontend is not found. Using 1.0 instead.");
-        result = mFe->scan(settings, scanType);
-        return (int)result;
-    }
-
-    result = fe_1_1->scan_1_1(settings, scanType, settingsExt1_1);
+    Result result = mFeClient->scan(settings, scanType, settingsExt1_1);
     return (int)result;
 }
 
 int JTuner::stopScan() {
-    if (mFe == NULL) {
-        ALOGE("frontend is not initialized");
+    if (mFeClient == NULL) {
+        ALOGE("frontend client is not initialized");
         return (int)Result::INVALID_STATE;
     }
-    Result result = mFe->stopScan();
+    Result result = mFeClient->stopScan();
     return (int)result;
 }
 
@@ -1576,11 +1543,11 @@
 }
 
 int JTuner::setLna(bool enable) {
-    if (mFe == NULL) {
-        ALOGE("frontend is not initialized");
+    if (mFeClient == NULL) {
+        ALOGE("frontend client is not initialized");
         return (int)Result::INVALID_STATE;
     }
-    Result result = mFe->setLna(enable);
+    Result result = mFeClient->setLna(enable);
     return (int)result;
 }
 
@@ -1603,9 +1570,6 @@
         if (res == Result::SUCCESS) {
             mDemux = demuxSp;
             mDemuxId = id;
-            if (mFe != NULL) {
-                mDemux->setFrontendDataSource(mFeId);
-            }
         } else {
             return res;
         }
@@ -1631,12 +1595,6 @@
 
 jint JTuner::close() {
     Result res = Result::SUCCESS;
-    if (mFe != NULL) {
-        res = mFe->close();
-        if (res != Result::SUCCESS) {
-            return (jint) res;
-        }
-    }
     if (mDemux != NULL) {
         res = mDemux->close();
         if (res != Result::SUCCESS) {
@@ -1702,24 +1660,11 @@
 }
 
 int JTuner::linkCiCam(int id) {
-    if (mFe_1_1 == NULL) {
-        ALOGE("frontend 1.1 is not initialized");
+    if (mFeClient == NULL) {
+        ALOGE("frontend client is not initialized");
         return (int)Constant::INVALID_LTS_ID;
     }
-
-    Result res;
-    uint32_t ltsId;
-    mFe_1_1->linkCiCam(static_cast<uint32_t>(id),
-            [&](Result r, uint32_t id) {
-                res = r;
-                ltsId = id;
-            });
-
-    if (res != Result::SUCCESS) {
-        return (int)Constant::INVALID_LTS_ID;
-    }
-
-    return (int) ltsId;
+    return mFeClient->linkCiCamToFrontend(id);
 }
 
 int JTuner::disconnectCiCam() {
@@ -1735,12 +1680,12 @@
 
 
 int JTuner::unlinkCiCam(int id) {
-    if (mFe_1_1 == NULL) {
-        ALOGE("frontend 1.1 is not initialized");
+    if (mFeClient == NULL) {
+        ALOGE("frontend client is not initialized");
         return (int)Result::INVALID_STATE;
     }
 
-    Result r = mFe_1_1->unlinkCiCam(static_cast<uint32_t>(id));
+    Result r = mFeClient->unlinkCiCamToFrontend(id);
 
     return (int) r;
 }
@@ -1910,7 +1855,7 @@
 }
 
 jobject JTuner::getFrontendStatus(jintArray types) {
-    if (mFe == NULL) {
+    if (mFeClient == NULL) {
         return NULL;
     }
     JNIEnv *env = AndroidRuntime::getJNIEnv();
@@ -1927,38 +1872,8 @@
         }
     }
 
-    Result res;
-    hidl_vec<FrontendStatus> status;
-    hidl_vec<FrontendStatusExt1_1> status_1_1;
-
-    if (v.size() > 0) {
-        mFe->getStatus(v,
-                [&](Result r, const hidl_vec<FrontendStatus>& s) {
-                    res = r;
-                    status = s;
-                });
-        if (res != Result::SUCCESS) {
-            return NULL;
-        }
-    }
-
-    if (v_1_1.size() > 0) {
-        sp<::android::hardware::tv::tuner::V1_1::IFrontend> iFeSp_1_1;
-        iFeSp_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFe);
-
-        if (iFeSp_1_1 != NULL) {
-            iFeSp_1_1->getStatusExt1_1(v_1_1,
-                [&](Result r, const hidl_vec<FrontendStatusExt1_1>& s) {
-                    res = r;
-                    status_1_1 = s;
-                });
-            if (res != Result::SUCCESS) {
-                return NULL;
-            }
-        } else {
-            ALOGW("getStatusExt1_1 is not supported with the current HAL implementation.");
-        }
-    }
+    hidl_vec<FrontendStatus> status = mFeClient->getStatus(v);
+    hidl_vec<FrontendStatusExt1_1> status_1_1 = mFeClient->getStatusExtended_1_1(v_1_1);
 
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/FrontendStatus");
     jmethodID init = env->GetMethodID(clazz, "<init>", "()V");
@@ -2504,15 +2419,6 @@
 
 jint JTuner::closeFrontend() {
     Result r = Result::SUCCESS;
-    if (mFe != NULL) {
-        r = mFe->close();
-    }
-    if (r == Result::SUCCESS) {
-        mFe = NULL;
-        mFe_1_1 = NULL;
-    } else {
-        return (jint) r;
-    }
 
     if (mFeClient != NULL) {
         r = mFeClient->close();
@@ -2570,10 +2476,6 @@
     return (DescramblerClient *)env->GetLongField(descrambler, gFields.descramblerContext);
 }
 
-static uint32_t getResourceIdFromHandle(jint handle) {
-    return (handle & 0x00ff0000) >> 16;
-}
-
 static DemuxPid getDemuxPid(int pidType, int pid) {
     DemuxPid demuxPid;
     if ((int)pidType == 1) {
diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h
index b0613d4..bbead26 100644
--- a/media/jni/android_media_tv_Tuner.h
+++ b/media/jni/android_media_tv_Tuner.h
@@ -178,7 +178,7 @@
 };
 
 struct FrontendClientCallbackImpl : public FrontendClientCallback {
-    FrontendClientCallbackImpl(jweak tunerObj, FrontendId id);
+    FrontendClientCallbackImpl(jweak tunerObj);
 
     virtual void onEvent(FrontendEventType frontendEventType);
     virtual void onScanMessage(
@@ -187,7 +187,6 @@
             FrontendScanMessageTypeExt1_1 type, const FrontendScanMessageExt1_1& messageExt);
 
     jweak mObject;
-    FrontendId mId;
 };
 
 struct TimeFilter : public RefBase {
@@ -244,10 +243,6 @@
     static sp<ITuner> mTuner;
     static sp<::android::hardware::tv::tuner::V1_1::ITuner> mTuner_1_1;
     static sp<TunerClient> mTunerClient;
-    // TODO: remove after migrate to client lib
-    sp<IFrontend> mFe;
-    // TODO: remove after migrate to client lib
-    sp<::android::hardware::tv::tuner::V1_1::IFrontend> mFe_1_1;
     sp<FrontendClient> mFeClient;
     int mFeId;
     sp<LnbClient> mLnbClient;
@@ -267,9 +262,6 @@
     static jobject getDtmbFrontendCaps(JNIEnv *env, int id);
 
     bool isV1_1ExtendedStatusType(jint type);
-    static uint32_t getResourceIdFromHandle(jint handle) {
-        return (handle & 0x00ff0000) >> 16;
-    }
 };
 
 class C2DataIdInfo : public C2Param {
diff --git a/media/jni/tuner/FrontendClient.cpp b/media/jni/tuner/FrontendClient.cpp
index 9dd4df7..14761a6 100644
--- a/media/jni/tuner/FrontendClient.cpp
+++ b/media/jni/tuner/FrontendClient.cpp
@@ -22,6 +22,7 @@
 #include "FrontendClient.h"
 
 using ::aidl::android::media::tv::tuner::TunerFrontendSettings;
+using ::android::hardware::tv::tuner::V1_1::Constant;
 
 namespace android {
 
@@ -99,6 +100,96 @@
     return Result::INVALID_STATE;
 }
 
+Result FrontendClient::scan(const FrontendSettings& settings, FrontendScanType type,
+        const FrontendSettingsExt1_1& settingsExt1_1) {
+    if (mTunerFrontend != NULL) {
+        // TODO: parse hidl settings to aidl settings
+        // TODO: aidl frontend settings to include Tuner HAL 1.1 settings
+        TunerFrontendSettings settings;
+        // TODO: handle error message.
+        mTunerFrontend->scan(settings, (int)type);
+        return Result::SUCCESS;
+    }
+
+    Result result;
+    if (mFrontend_1_1 != NULL) {
+        result = mFrontend_1_1->scan_1_1(settings, type, settingsExt1_1);
+        return result;
+    }
+
+    if (mFrontend != NULL) {
+        result = mFrontend->scan(settings, type);
+        return result;
+    }
+
+    return Result::INVALID_STATE;
+}
+
+Result FrontendClient::stopScan() {
+    if (mTunerFrontend != NULL) {
+        // TODO: handle error message.
+        mTunerFrontend->stopScan();
+        return Result::SUCCESS;
+    }
+
+    if (mFrontend != NULL) {
+        Result result = mFrontend->stopScan();
+        return result;
+    }
+
+    return Result::INVALID_STATE;
+}
+
+vector<FrontendStatus> FrontendClient::getStatus(vector<FrontendStatusType> statusTypes) {
+    vector<FrontendStatus> status;
+
+    if (mTunerFrontend != NULL) {
+        // TODO: handle error message.
+        /*status = mTunerFrontend->getStatus(statusTypes);
+        return status;*/
+    }
+
+    if (mFrontend != NULL && statusTypes.size() > 0) {
+        Result res;
+        mFrontend->getStatus(statusTypes,
+                [&](Result r, const hidl_vec<FrontendStatus>& s) {
+                    res = r;
+                    status = s;
+                });
+        if (res != Result::SUCCESS) {
+            status.clear();
+            return status;
+        }
+    }
+
+    return status;
+}
+vector<FrontendStatusExt1_1> FrontendClient::getStatusExtended_1_1(
+        vector<FrontendStatusTypeExt1_1> statusTypes) {
+    vector<FrontendStatusExt1_1> status;
+
+    if (mTunerFrontend != NULL) {
+        // TODO: handle error message.
+        /*status = mTunerFrontend->getStatusExtended_1_1(statusTypes);
+        return status;*/
+    }
+
+    if (mFrontend_1_1 != NULL && statusTypes.size() > 0) {
+        Result res;
+        mFrontend_1_1->getStatusExt1_1(statusTypes,
+            [&](Result r, const hidl_vec<FrontendStatusExt1_1>& s) {
+                res = r;
+                status = s;
+            });
+        if (res != Result::SUCCESS) {
+            status.clear();
+            return status;
+        }
+    }
+
+    return status;
+}
+
 Result FrontendClient::setLnb(sp<LnbClient> lnbClient) {
     if (mTunerFrontend != NULL) {
         // TODO: handle error message.
@@ -114,6 +205,59 @@
     return Result::INVALID_STATE;
 }
 
+Result FrontendClient::setLna(bool bEnable) {
+    if (mTunerFrontend != NULL) {
+        // TODO: handle error message.
+        /*mTunerFrontend->setLna(bEnable);
+        return Result::SUCCESS;*/
+    }
+
+    if (mFrontend != NULL) {
+        Result result = mFrontend->setLna(bEnable);
+        return result;
+    }
+
+    return Result::INVALID_STATE;
+}
+
+int FrontendClient::linkCiCamToFrontend(int ciCamId) {
+    int ltsId = (int)Constant::INVALID_LTS_ID;
+
+    if (mTunerFrontend != NULL) {
+        // TODO: handle error message.
+        /*mTunerFrontend->linkCiCamToFrontend(ciCamId, ltsId);
+        return ltsId;*/
+    }
+
+    if (mFrontend_1_1 != NULL) {
+        Result res;
+        mFrontend_1_1->linkCiCam(static_cast<uint32_t>(ciCamId),
+            [&](Result r, uint32_t id) {
+                res = r;
+                ltsId = id;
+            });
+        if (res != Result::SUCCESS) {
+            return (int)Constant::INVALID_LTS_ID;
+        }
+    }
+
+    return ltsId;
+}
+
+Result FrontendClient::unlinkCiCamToFrontend(int ciCamId) {
+    if (mTunerFrontend != NULL) {
+        // TODO: handle error message.
+        /*mTunerFrontend->unlinkCiCamToFrontend(ciCamId);
+        return Result::SUCCESS;*/
+    }
+
+    if (mFrontend_1_1 != NULL) {
+        return mFrontend_1_1->unlinkCiCam(static_cast<uint32_t>(ciCamId));
+    }
+
+    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 b24f944..32356744 100644
--- a/media/jni/tuner/FrontendClient.h
+++ b/media/jni/tuner/FrontendClient.h
@@ -38,13 +38,18 @@
 using ::android::hardware::tv::tuner::V1_0::FrontendEventType;
 using ::android::hardware::tv::tuner::V1_0::FrontendScanMessage;
 using ::android::hardware::tv::tuner::V1_0::FrontendScanMessageType;
+using ::android::hardware::tv::tuner::V1_0::FrontendScanType;
 using ::android::hardware::tv::tuner::V1_0::FrontendSettings;
+using ::android::hardware::tv::tuner::V1_0::FrontendStatus;
+using ::android::hardware::tv::tuner::V1_0::FrontendStatusType;
 using ::android::hardware::tv::tuner::V1_0::IFrontend;
 using ::android::hardware::tv::tuner::V1_0::Result;
 
 using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageExt1_1;
 using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageTypeExt1_1;
 using ::android::hardware::tv::tuner::V1_1::FrontendSettingsExt1_1;
+using ::android::hardware::tv::tuner::V1_1::FrontendStatusExt1_1;
+using ::android::hardware::tv::tuner::V1_1::FrontendStatusTypeExt1_1;
 using ::android::hardware::tv::tuner::V1_1::IFrontendCallback;
 
 using namespace std;
@@ -128,11 +133,50 @@
     Result stopTune();
 
     /**
+     * Scan the frontend to use the settings given.
+     */
+    Result scan(const FrontendSettings& settings, FrontendScanType frontendScanType,
+            const FrontendSettingsExt1_1& settingsExt1_1);
+
+    /**
+     * Stop the previous scanning.
+     */
+    Result stopScan();
+
+    /**
+     * Gets the statuses of the frontend.
+     */
+    vector<FrontendStatus> getStatus(vector<FrontendStatusType> statusTypes);
+
+    /**
+     * Gets the 1.1 extended statuses of the frontend.
+     */
+    vector<FrontendStatusExt1_1> getStatusExtended_1_1(
+            vector<FrontendStatusTypeExt1_1> statusTypes);
+
+    /**
      * Sets Low-Noise Block downconverter (LNB) for satellite frontend.
      */
     Result setLnb(sp<LnbClient> lnbClient);
 
     /**
+     * Enable or Disable Low Noise Amplifier (LNA).
+     */
+    Result setLna(bool bEnable);
+
+    /**
+     * Link Frontend to the cicam with given id.
+     *
+     * @return lts id
+     */
+    int linkCiCamToFrontend(int ciCamId);
+
+    /**
+     * Unink Frontend to the cicam with given id.
+     */
+    Result unlinkCiCamToFrontend(int ciCamId);
+
+    /**
      * Close Frontend.
      */
     Result close();