Move Tuner resource updating from Tuner java into Tuner client

Note that the main goal of this CL is to
move the resource updating with TunerResourceManager
from Tuner java into Tuner native client library.

This requires TunerResourceManager aidl interface to generate
both ndk and java library.

Also this CL removes the previously manually defined
TunerResourceManager java interface and use the automatically
generated java lib instead.

Some Android Services, such as MediaCase/TIF, that previously used the
manually defined TRM java APIs are changed to use the auto gen APIs
in this CL.

Test: atest android.media.tv.tuner.cts on Cuttlefish
Bug: 174095851
Change-Id: I46acdd2f118d5b082aa162c680661a304b4f628b
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index f80f412..decf68f 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -137,6 +137,7 @@
 
 cc_library_shared {
     name: "libmedia_tv_tuner",
+
     srcs: [
         "android_media_tv_Tuner.cpp",
         "tuner/DemuxClient.cpp",
@@ -163,6 +164,7 @@
         "libnativehelper",
         "libutils",
         "tv_tuner_aidl_interface-ndk_platform",
+        "tv_tuner_resource_manager_aidl_interface-ndk_platform"
     ],
     defaults: [
         "libcodec2-impl-defaults",
diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp
index b14e902..39e6ba2 100644
--- a/media/jni/tuner/TunerClient.cpp
+++ b/media/jni/tuner/TunerClient.cpp
@@ -25,6 +25,8 @@
 using ::android::hardware::tv::tuner::V1_0::FrontendId;
 using ::android::hardware::tv::tuner::V1_0::FrontendType;
 
+using ::aidl::android::media::tv::tunerresourcemanager::TunerFrontendInfo;
+
 namespace android {
 
 sp<ITuner> TunerClient::mTuner;
@@ -37,6 +39,7 @@
 TunerClient::TunerClient() {
     // Get HIDL Tuner in migration stage.
     getHidlTuner();
+    updateTunerResources();
     // Connect with Tuner Service.
     ::ndk::SpAIBinder binder(AServiceManager_getService("media.tuner"));
     mTunerService = ITunerService::fromBinder(binder);
@@ -259,6 +262,49 @@
 
 /////////////// TunerClient Helper Methods ///////////////////////
 
+void TunerClient::updateTunerResources() {
+    if (mTuner == NULL) {
+        return;
+    }
+
+    // Connect with Tuner Resource Manager.
+    ::ndk::SpAIBinder binder(AServiceManager_getService("tv_tuner_resource_mgr"));
+    mTunerResourceManager = ITunerResourceManager::fromBinder(binder);
+
+    updateFrontendResources();
+    updateLnbResources();
+    // TODO: update Demux, Descrambler.
+}
+
+void TunerClient::updateFrontendResources() {
+    vector<FrontendId> ids = getFrontendIds();
+    if (ids.size() == 0) {
+        return;
+    }
+    vector<TunerFrontendInfo> infos;
+    for (int i = 0; i < ids.size(); i++) {
+        shared_ptr<FrontendInfo> frontendInfo = getFrontendInfo((int)ids[i]);
+        if (frontendInfo == NULL) {
+            continue;
+        }
+        TunerFrontendInfo tunerFrontendInfo{
+            .handle = getResourceHandleFromId((int)ids[i], FRONTEND),
+            .frontendType = static_cast<int>(frontendInfo->type),
+            .exclusiveGroupId = static_cast<int>(frontendInfo->exclusiveGroupId),
+        };
+        infos.push_back(tunerFrontendInfo);
+    }
+    mTunerResourceManager->setFrontendInfoList(infos);
+}
+
+void TunerClient::updateLnbResources() {
+    vector<int> handles = getLnbHandles();
+    if (handles.size() == 0) {
+        return;
+    }
+    mTunerResourceManager->setLnbInfoList(handles);
+}
+
 sp<ITuner> TunerClient::getHidlTuner() {
     if (mTuner == NULL) {
         mTunerVersion = 0;
@@ -366,6 +412,32 @@
     return descrambler;
 }
 
+vector<int> TunerClient::getLnbHandles() {
+    vector<int> lnbHandles;
+
+    if (mTunerService != NULL) {
+        // TODO: pending hidl interface
+    }
+
+    if (mTuner != NULL) {
+        Result res;
+        vector<LnbId> lnbIds;
+        mTuner->getLnbIds([&](Result r, const hardware::hidl_vec<LnbId>& ids) {
+            lnbIds = ids;
+            res = r;
+        });
+        if (res != Result::SUCCESS || lnbIds.size() == 0) {
+            ALOGW("Lnb isn't available");
+        } else {
+            for (int i = 0; i < lnbIds.size(); i++) {
+                lnbHandles.push_back(getResourceHandleFromId((int)lnbIds[i], LNB));
+            }
+        }
+    }
+
+    return lnbHandles;
+}
+
 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 94fdf27..a3d2d02c 100644
--- a/media/jni/tuner/TunerClient.h
+++ b/media/jni/tuner/TunerClient.h
@@ -17,6 +17,8 @@
 #ifndef _ANDROID_MEDIA_TV_TUNER_CLIENT_H_
 #define _ANDROID_MEDIA_TV_TUNER_CLIENT_H_
 
+#include <aidl/android/media/tv/tunerresourcemanager/ITunerResourceManager.h>
+#include <aidl/android/media/tv/tunerresourcemanager/TunerFrontendInfo.h>
 #include <aidl/android/media/tv/tuner/ITunerService.h>
 #include <android/hardware/tv/tuner/1.1/ITuner.h>
 #include <android/hardware/tv/tuner/1.1/types.h>
@@ -28,10 +30,12 @@
 
 using ::aidl::android::media::tv::tuner::ITunerService;
 using ::aidl::android::media::tv::tuner::TunerServiceFrontendInfo;
+using ::aidl::android::media::tv::tunerresourcemanager::ITunerResourceManager;
 
 using ::android::hardware::tv::tuner::V1_0::DemuxCapabilities;
 using ::android::hardware::tv::tuner::V1_0::FrontendId;
 using ::android::hardware::tv::tuner::V1_0::ITuner;
+using ::android::hardware::tv::tuner::V1_0::LnbId;
 using ::android::hardware::tv::tuner::V1_0::Result;
 using ::android::hardware::tv::tuner::V1_1::FrontendDtmbCapabilities;
 
@@ -136,13 +140,16 @@
     sp<ILnb> openHidlLnbById(int id);
     sp<ILnb> openHidlLnbByName(string name, LnbId& lnbId);
     sp<IDescrambler> openHidlDescrambler();
+    vector<int> getLnbHandles();
     FrontendInfo FrontendInfoAidlToHidl(TunerServiceFrontendInfo aidlFrontendInfo);
+    void updateTunerResources();
+    void updateFrontendResources();
+    void updateLnbResources();
 
     int getResourceIdFromHandle(int handle, int resourceType);
 
     int getResourceHandleFromId(int id, int resourceType);
 
-private:
     /**
      * An AIDL Tuner Service Singleton assigned at the first time the Tuner Client
      * connects with the Tuner Service. Default null when the service does not exist.
@@ -167,6 +174,8 @@
     // while the low 16 bits are the minor version. Default value is unknown version 0.
     static int mTunerVersion;
 
+    shared_ptr<ITunerResourceManager> mTunerResourceManager;
+
     int mResourceRequestCount = 0;
 };
 }  // namespace android