Make metadata field mandatory for program info struct.

Test: VTS, manual
Change-Id: I3e4ed1f203dc28315d7c7db10c9ce3d83e4ec59d
diff --git a/radio/IRadio.cpp b/radio/IRadio.cpp
index ebf3859..5bbe7cb 100644
--- a/radio/IRadio.cpp
+++ b/radio/IRadio.cpp
@@ -172,16 +172,11 @@
     virtual status_t getProgramInformation(struct radio_program_info *info)
     {
         Parcel data, reply;
-        if (info == NULL) {
+        if (info == nullptr || info->metadata == nullptr) {
             return BAD_VALUE;
         }
         radio_metadata_t *metadata = info->metadata;
         data.writeInterfaceToken(IRadio::getInterfaceDescriptor());
-        if (metadata != NULL) {
-            data.writeUint32(1);
-        } else {
-            data.writeUint32(0);
-        }
         status_t status = remote()->transact(GET_PROGRAM_INFORMATION, data, &reply);
         if (status == NO_ERROR) {
             status = (status_t)reply.readInt32();
@@ -190,13 +185,13 @@
                 // restore local metadata pointer
                 info->metadata = metadata;
 
-                uint32_t metatataSize = reply.readUint32();
-                if ((metadata != NULL) && (metatataSize != 0)) {
-                    radio_metadata_t *newMetadata = (radio_metadata_t *)malloc(metatataSize);
+                uint32_t metadataSize = reply.readUint32();
+                if (metadataSize != 0) {
+                    radio_metadata_t *newMetadata = (radio_metadata_t *)malloc(metadataSize);
                     if (newMetadata == NULL) {
                         return NO_MEMORY;
                     }
-                    reply.read(newMetadata, metatataSize);
+                    reply.read(newMetadata, metadataSize);
                     status = radio_metadata_add_metadata(&info->metadata, newMetadata);
                     free(newMetadata);
                 }
@@ -306,21 +301,17 @@
             CHECK_INTERFACE(IRadio, data, reply);
             struct radio_program_info info;
             status_t status;
-            // query metadata only if requested by remote side
-            if (data.readUint32() == 1) {
-                status = radio_metadata_allocate(&info.metadata, 0, 0);
-                if (status != NO_ERROR) {
-                    return status;
-                }
-            } else {
-                info.metadata = NULL;
+
+            status = radio_metadata_allocate(&info.metadata, 0, 0);
+            if (status != NO_ERROR) {
+                return status;
             }
             status = getProgramInformation(&info);
 
             reply->writeInt32(status);
             if (status == NO_ERROR) {
                 reply->write(&info, sizeof(struct radio_program_info));
-                if ((info.metadata != NULL) && (radio_metadata_get_count(info.metadata) > 0)) {
+                if (radio_metadata_get_count(info.metadata) > 0) {
                     size_t size = radio_metadata_get_size(info.metadata);
                     reply->writeUint32((uint32_t)size);
                     reply->write(info.metadata, size);
diff --git a/services/radio/HidlUtils.cpp b/services/radio/HidlUtils.cpp
index bfced7a..3b33386 100644
--- a/services/radio/HidlUtils.cpp
+++ b/services/radio/HidlUtils.cpp
@@ -122,8 +122,7 @@
 
 //static
 void HidlUtils::convertProgramInfoFromHal(radio_program_info_t *info,
-                                          const ProgramInfo *halInfo,
-                                          bool withMetadata)
+                                          const ProgramInfo *halInfo)
 {
     info->channel = halInfo->channel;
     info->sub_channel = halInfo->subChannel;
@@ -131,10 +130,8 @@
     info->stereo = halInfo->stereo;
     info->digital = halInfo->digital;
     info->signal_strength = halInfo->signalStrength;
-    if (withMetadata && halInfo->metadata.size() != 0) {
-        convertMetaDataFromHal(&info->metadata, halInfo->metadata,
-                               halInfo->channel, halInfo->subChannel);
-    }
+    convertMetaDataFromHal(&info->metadata, halInfo->metadata,
+                           halInfo->channel, halInfo->subChannel);
 }
 
 //static
diff --git a/services/radio/HidlUtils.h b/services/radio/HidlUtils.h
index 091abb7..c771060 100644
--- a/services/radio/HidlUtils.h
+++ b/services/radio/HidlUtils.h
@@ -38,8 +38,7 @@
     static void convertBandConfigToHal(BandConfig *halConfig,
                                        const radio_hal_band_config_t *config);
     static void convertProgramInfoFromHal(radio_program_info_t *info,
-                                          const ProgramInfo *halInfo,
-                                          bool withMetadata);
+                                          const ProgramInfo *halInfo);
     static void convertMetaDataFromHal(radio_metadata_t **metadata,
                                        const hidl_vec<MetaData>& halMetadata,
                                        uint32_t channel,
diff --git a/services/radio/RadioHalHidl.cpp b/services/radio/RadioHalHidl.cpp
index c7a899a..182880a 100644
--- a/services/radio/RadioHalHidl.cpp
+++ b/services/radio/RadioHalHidl.cpp
@@ -233,19 +233,21 @@
     if (mHalTuner == 0) {
         return -ENODEV;
     }
+    if (info == nullptr || info->metadata == nullptr) {
+        return BAD_VALUE;
+    }
     ProgramInfo halInfo;
     Result halResult;
-    bool withMetaData = (info->metadata != NULL);
     Return<void> hidlReturn = mHalTuner->getProgramInformation(
-                    withMetaData, [&](Result result, const ProgramInfo& info) {
-                        halResult = result;
-                        if (result == Result::OK) {
-                            halInfo = info;
-                        }
-    });
+        [&](Result result, const ProgramInfo& info) {
+            halResult = result;
+            if (result == Result::OK) {
+                halInfo = info;
+            }
+        });
     status_t status = checkHidlStatus(hidlReturn.getStatus());
     if (status == NO_ERROR && halResult == Result::OK) {
-        HidlUtils::convertProgramInfoFromHal(info, &halInfo, withMetaData);
+        HidlUtils::convertProgramInfoFromHal(info, &halInfo);
     }
     return HidlUtils::convertHalResult(halResult);
 }
@@ -276,11 +278,9 @@
     memset(&event, 0, sizeof(radio_hal_event_t));
     event.type = RADIO_EVENT_TUNED;
     event.status = HidlUtils::convertHalResult(result);
-    HidlUtils::convertProgramInfoFromHal(&event.info, &info, true);
+    HidlUtils::convertProgramInfoFromHal(&event.info, &info);
     onCallback(&event);
-    if (event.info.metadata != NULL) {
-        radio_metadata_deallocate(event.info.metadata);
-    }
+    radio_metadata_deallocate(event.info.metadata);
     return Return<void>();
 }
 
@@ -290,7 +290,7 @@
     radio_hal_event_t event;
     memset(&event, 0, sizeof(radio_hal_event_t));
     event.type = RADIO_EVENT_AF_SWITCH;
-    HidlUtils::convertProgramInfoFromHal(&event.info, &info, true);
+    HidlUtils::convertProgramInfoFromHal(&event.info, &info);
     onCallback(&event);
     if (event.info.metadata != NULL) {
         radio_metadata_deallocate(event.info.metadata);