Connect Frontend Settings between TunerFrontend and FrontendClient

Test: make
Bug: 174095851
Change-Id: I5f681dcfc24c138a5462344b3a92439d353b599f
diff --git a/media/jni/tuner/FrontendClient.cpp b/media/jni/tuner/FrontendClient.cpp
index 0540aac..08573a6 100644
--- a/media/jni/tuner/FrontendClient.cpp
+++ b/media/jni/tuner/FrontendClient.cpp
@@ -21,8 +21,8 @@
 
 #include "FrontendClient.h"
 
-using ::aidl::android::media::tv::tuner::TunerFrontendDvbtSettings;
 using ::aidl::android::media::tv::tuner::TunerFrontendScanAtsc3PlpInfo;
+using ::aidl::android::media::tv::tuner::TunerFrontendUnionSettings;
 
 using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard;
 using ::android::hardware::tv::tuner::V1_0::FrontendAnalogType;
@@ -43,6 +43,7 @@
 using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation;
 using ::android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation;
 using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
+using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;
 
 namespace android {
 
@@ -86,14 +87,13 @@
 Result FrontendClient::tune(const FrontendSettings& settings,
         const FrontendSettingsExt1_1& settingsExt1_1) {
     if (mTunerFrontend != NULL) {
-        // TODO: aidl frontend settings to include Tuner HAL 1.1 settings
         TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1);
         Status s = mTunerFrontend->tune(tunerFeSettings);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
     Result result;
-    if (mFrontend_1_1 != NULL) {
+    if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) {
         result = mFrontend_1_1->tune_1_1(settings, settingsExt1_1);
         return result;
     }
@@ -123,14 +123,13 @@
 Result FrontendClient::scan(const FrontendSettings& settings, FrontendScanType type,
         const FrontendSettingsExt1_1& settingsExt1_1) {
     if (mTunerFrontend != NULL) {
-        // TODO: aidl frontend settings to include Tuner HAL 1.1 settings
         TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1);
         Status s = mTunerFrontend->scan(tunerFeSettings, (int)type);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
     Result result;
-    if (mFrontend_1_1 != NULL) {
+    if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) {
         result = mFrontend_1_1->scan_1_1(settings, type, settingsExt1_1);
         return result;
     }
@@ -293,6 +292,8 @@
     return Result::INVALID_STATE;
 }
 
+/////////////// TunerFrontend Helper Methods ///////////////////////
+
 shared_ptr<ITunerFrontend> FrontendClient::getAidlFrontend() {
     return mTunerFrontend;
 }
@@ -302,52 +303,59 @@
 }
 
 TunerFrontendSettings FrontendClient::getAidlFrontendSettings(const FrontendSettings& settings,
-        const FrontendSettingsExt1_1& /*settingsExt1_1*/) {
-    // TODO: complete hidl to aidl frontend settings conversion
-    TunerFrontendSettings s;
+        const FrontendSettingsExt1_1& settingsExt1_1) {
+    bool isExtended = validateExtendedSettings(settingsExt1_1);
+    TunerFrontendSettings s{
+        .isExtended = isExtended,
+        .endFrequency = (int) settingsExt1_1.endFrequency,
+        .inversion = (int) settingsExt1_1.inversion,
+    };
+
+    if (settingsExt1_1.settingExt.getDiscriminator()
+            == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dtmb) {
+        s.settings.set<TunerFrontendUnionSettings::dtmb>(getAidlDtmbSettings(settingsExt1_1));
+        return s;
+    }
+
     switch (settings.getDiscriminator()) {
         case FrontendSettings::hidl_discriminator::analog: {
+            s.settings.set<TunerFrontendUnionSettings::analog>(
+                    getAidlAnalogSettings(settings, settingsExt1_1));
             break;
         }
         case FrontendSettings::hidl_discriminator::atsc: {
+            s.settings.set<TunerFrontendUnionSettings::atsc>(getAidlAtscSettings(settings));
             break;
         }
         case FrontendSettings::hidl_discriminator::atsc3: {
+            s.settings.set<TunerFrontendUnionSettings::atsc3>(getAidlAtsc3Settings(settings));
             break;
         }
         case FrontendSettings::hidl_discriminator::dvbs: {
+            s.settings.set<TunerFrontendUnionSettings::dvbs>(
+                    getAidlDvbsSettings(settings, settingsExt1_1));
             break;
         }
         case FrontendSettings::hidl_discriminator::dvbc: {
+            s.settings.set<TunerFrontendUnionSettings::cable>(
+                    getAidlCableSettings(settings, settingsExt1_1));
             break;
         }
         case FrontendSettings::hidl_discriminator::dvbt: {
-            TunerFrontendDvbtSettings dvbtSettings{
-                .frequency = (int)settings.dvbt().frequency,
-                .transmissionMode = (int)settings.dvbt().transmissionMode,
-                .bandwidth = (int)settings.dvbt().bandwidth,
-                .constellation = (int)settings.dvbt().constellation,
-                .hierarchy = (int)settings.dvbt().hierarchy,
-                .hpCodeRate = (int)settings.dvbt().hpCoderate,
-                .lpCodeRate = (int)settings.dvbt().lpCoderate,
-                .guardInterval = (int)settings.dvbt().guardInterval,
-                .isHighPriority = settings.dvbt().isHighPriority,
-                .standard = (int)settings.dvbt().standard,
-                .isMiso = settings.dvbt().isMiso,
-                .plpMode = (int)settings.dvbt().plpMode,
-                .plpId = (int)settings.dvbt().plpId,
-                .plpGroupId = (int)settings.dvbt().plpGroupId,
-            };
-            s.set<TunerFrontendSettings::dvbt>(dvbtSettings);
+            s.settings.set<TunerFrontendUnionSettings::dvbt>(
+                    getAidlDvbtSettings(settings, settingsExt1_1));
             break;
         }
         case FrontendSettings::hidl_discriminator::isdbs: {
+            s.settings.set<TunerFrontendUnionSettings::isdbs>(getAidlIsdbsSettings(settings));
             break;
         }
         case FrontendSettings::hidl_discriminator::isdbs3: {
+            s.settings.set<TunerFrontendUnionSettings::isdbs3>(getAidlIsdbs3Settings(settings));
             break;
         }
         case FrontendSettings::hidl_discriminator::isdbt: {
+            s.settings.set<TunerFrontendUnionSettings::isdbt>(getAidlIsdbtSettings(settings));
             break;
         }
         default:
@@ -356,6 +364,192 @@
     return s;
 }
 
+TunerFrontendAnalogSettings FrontendClient::getAidlAnalogSettings(const FrontendSettings& settings,
+        const FrontendSettingsExt1_1& settingsExt1_1) {
+    TunerFrontendAnalogSettings analogSettings{
+        .frequency = (int)settings.analog().frequency,
+        .signalType = (int)settings.analog().type,
+        .sifStandard = (int)settings.analog().sifStandard,
+    };
+    if (settingsExt1_1.settingExt.getDiscriminator()
+            == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::analog) {
+        analogSettings.isExtended = true;
+        analogSettings.aftFlag = (int)settingsExt1_1.settingExt.analog().aftFlag;
+    } else {
+        analogSettings.isExtended = false;
+    }
+    return analogSettings;
+}
+
+TunerFrontendDvbsSettings FrontendClient::getAidlDvbsSettings(const FrontendSettings& settings,
+        const FrontendSettingsExt1_1& settingsExt1_1) {
+    TunerFrontendDvbsSettings dvbsSettings{
+        .frequency = (int)settings.dvbs().frequency,
+        .modulation = (int)settings.dvbs().modulation,
+        .codeRate = {
+            .fec = (long)settings.dvbs().coderate.fec,
+            .isLinear = settings.dvbs().coderate.isLinear,
+            .isShortFrames = settings.dvbs().coderate.isShortFrames,
+            .bitsPer1000Symbol = (int)settings.dvbs().coderate.bitsPer1000Symbol,
+        },
+        .symbolRate = (int)settings.dvbs().symbolRate,
+        .rolloff = (int)settings.dvbs().rolloff,
+        .pilot = (int)settings.dvbs().pilot,
+        .inputStreamId = (int)settings.dvbs().inputStreamId,
+        .standard = (int)settings.dvbs().standard,
+        .vcm = (int)settings.dvbs().vcmMode,
+    };
+    if (settingsExt1_1.settingExt.getDiscriminator()
+            == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbs) {
+        dvbsSettings.isExtended = true;
+        dvbsSettings.scanType = (int)settingsExt1_1.settingExt.dvbs().scanType;
+        dvbsSettings.isDiseqcRxMessage = settingsExt1_1.settingExt.dvbs().isDiseqcRxMessage;
+    } else {
+        dvbsSettings.isExtended = false;
+    }
+    return dvbsSettings;
+}
+
+TunerFrontendCableSettings FrontendClient::getAidlCableSettings(const FrontendSettings& settings,
+        const FrontendSettingsExt1_1& settingsExt1_1) {
+    TunerFrontendCableSettings cableSettings{
+        .frequency = (int)settings.dvbc().frequency,
+        .modulation = (int)settings.dvbc().modulation,
+        .innerFec = (long)settings.dvbc().fec,
+        .symbolRate = (int)settings.dvbc().symbolRate,
+        .outerFec = (int)settings.dvbc().outerFec,
+        .annex = (int)settings.dvbc().annex,
+        .spectralInversion = (int)settings.dvbc().spectralInversion,
+    };
+    if (settingsExt1_1.settingExt.getDiscriminator()
+            == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbc) {
+        cableSettings.isExtended = true;
+        cableSettings.interleaveMode = (int)settingsExt1_1.settingExt.dvbc().interleaveMode;
+        cableSettings.bandwidth = (int)settingsExt1_1.settingExt.dvbc().bandwidth;
+    } else {
+        cableSettings.isExtended = false;
+    }
+    return cableSettings;
+}
+
+TunerFrontendDvbtSettings FrontendClient::getAidlDvbtSettings(const FrontendSettings& settings,
+        const FrontendSettingsExt1_1& settingsExt1_1) {
+    TunerFrontendDvbtSettings dvbtSettings{
+        .frequency = (int)settings.dvbt().frequency,
+        .transmissionMode = (int)settings.dvbt().transmissionMode,
+        .bandwidth = (int)settings.dvbt().bandwidth,
+        .constellation = (int)settings.dvbt().constellation,
+        .hierarchy = (int)settings.dvbt().hierarchy,
+        .hpCodeRate = (int)settings.dvbt().hpCoderate,
+        .lpCodeRate = (int)settings.dvbt().lpCoderate,
+        .guardInterval = (int)settings.dvbt().guardInterval,
+        .isHighPriority = settings.dvbt().isHighPriority,
+        .standard = (int)settings.dvbt().standard,
+        .isMiso = settings.dvbt().isMiso,
+        .plpMode = (int)settings.dvbt().plpMode,
+        .plpId = (int)settings.dvbt().plpId,
+        .plpGroupId = (int)settings.dvbt().plpGroupId,
+    };
+    if (settingsExt1_1.settingExt.getDiscriminator()
+            == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbt) {
+        dvbtSettings.isExtended = true;
+        dvbtSettings.constellation = (int)settingsExt1_1.settingExt.dvbt().constellation;
+        dvbtSettings.transmissionMode =
+                (int)settingsExt1_1.settingExt.dvbt().transmissionMode;
+    } else {
+        dvbtSettings.isExtended = false;
+    }
+    return dvbtSettings;
+}
+
+TunerFrontendDtmbSettings FrontendClient::getAidlDtmbSettings(
+        const FrontendSettingsExt1_1& settingsExt1_1) {
+    TunerFrontendDtmbSettings dtmbSettings{
+        .frequency = (int)settingsExt1_1.settingExt.dtmb().frequency,
+        .transmissionMode = (int)settingsExt1_1.settingExt.dtmb().transmissionMode,
+        .bandwidth = (int)settingsExt1_1.settingExt.dtmb().bandwidth,
+        .modulation = (int)settingsExt1_1.settingExt.dtmb().modulation,
+        .codeRate = (int)settingsExt1_1.settingExt.dtmb().codeRate,
+        .guardInterval = (int)settingsExt1_1.settingExt.dtmb().guardInterval,
+        .interleaveMode = (int)settingsExt1_1.settingExt.dtmb().interleaveMode,
+    };
+    return dtmbSettings;
+}
+
+TunerFrontendAtscSettings FrontendClient::getAidlAtscSettings(const FrontendSettings& settings) {
+    TunerFrontendAtscSettings atscSettings{
+        .frequency = (int)settings.atsc().frequency,
+        .modulation = (int)settings.atsc().modulation,
+    };
+    return atscSettings;
+}
+
+TunerFrontendAtsc3Settings FrontendClient::getAidlAtsc3Settings(const FrontendSettings& settings) {
+    TunerFrontendAtsc3Settings atsc3Settings{
+        .frequency = (int)settings.atsc3().frequency,
+        .bandwidth = (int)settings.atsc3().bandwidth,
+        .demodOutputFormat = (int)settings.atsc3().demodOutputFormat,
+    };
+    atsc3Settings.plpSettings.resize(settings.atsc3().plpSettings.size());
+    for (auto plpSetting : settings.atsc3().plpSettings) {
+        atsc3Settings.plpSettings.push_back({
+            .plpId = (int)plpSetting.plpId,
+            .modulation = (int)plpSetting.modulation,
+            .interleaveMode = (int)plpSetting.interleaveMode,
+            .codeRate = (int)plpSetting.codeRate,
+            .fec = (int)plpSetting.fec,
+        });
+    }
+    return atsc3Settings;
+}
+
+TunerFrontendIsdbsSettings FrontendClient::getAidlIsdbsSettings(const FrontendSettings& settings) {
+    TunerFrontendIsdbsSettings isdbsSettings{
+        .frequency = (int)settings.isdbs().frequency,
+        .streamId = (int)settings.isdbs().streamId,
+        .streamIdType = (int)settings.isdbs().streamIdType,
+        .modulation = (int)settings.isdbs().modulation,
+        .codeRate = (int)settings.isdbs().coderate,
+        .symbolRate = (int)settings.isdbs().symbolRate,
+        .rolloff = (int)settings.isdbs().rolloff,
+    };
+    return isdbsSettings;
+}
+
+TunerFrontendIsdbs3Settings FrontendClient::getAidlIsdbs3Settings(
+        const FrontendSettings& settings) {
+    TunerFrontendIsdbs3Settings isdbs3Settings{
+        .frequency = (int)settings.isdbs3().frequency,
+        .streamId = (int)settings.isdbs3().streamId,
+        .streamIdType = (int)settings.isdbs3().streamIdType,
+        .modulation = (int)settings.isdbs3().modulation,
+        .codeRate = (int)settings.isdbs3().coderate,
+        .symbolRate = (int)settings.isdbs3().symbolRate,
+        .rolloff = (int)settings.isdbs3().rolloff,
+    };
+    return isdbs3Settings;
+}
+
+TunerFrontendIsdbtSettings FrontendClient::getAidlIsdbtSettings(const FrontendSettings& settings) {
+    TunerFrontendIsdbtSettings isdbtSettings{
+        .frequency = (int)settings.isdbt().frequency,
+        .modulation = (int)settings.isdbt().modulation,
+        .bandwidth = (int)settings.isdbt().bandwidth,
+        .mode = (int)settings.isdbt().mode,
+        .codeRate = (int)settings.isdbt().coderate,
+        .guardInterval = (int)settings.isdbt().guardInterval,
+        .serviceAreaId = (int)settings.isdbt().serviceAreaId,
+    };
+    return isdbtSettings;
+}
+
+bool FrontendClient::validateExtendedSettings(const FrontendSettingsExt1_1& settingsExt1_1) {
+    return settingsExt1_1.endFrequency != (uint32_t)Constant::INVALID_FRONTEND_SETTING_FREQUENCY
+            || settingsExt1_1.inversion != FrontendSpectralInversion::UNDEFINED
+            || settingsExt1_1.settingExt.getDiscriminator()
+                    != FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::noinit;
+}
+
 /////////////// TunerFrontendCallback ///////////////////////
 
 TunerFrontendCallback::TunerFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)