[Segmentation] Allow tensor uploading thru metadata

Change-Id: I6f8530cc92623d35fd639eb6060fae0ba148337f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3846605
Reviewed-by: Siddhartha S <[email protected]>
Commit-Queue: Min Qin <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1038883}
diff --git a/components/segmentation_platform/internal/segmentation_ukm_helper.cc b/components/segmentation_platform/internal/segmentation_ukm_helper.cc
index ab51818..324e752f 100644
--- a/components/segmentation_platform/internal/segmentation_ukm_helper.cc
+++ b/components/segmentation_platform/internal/segmentation_ukm_helper.cc
@@ -115,8 +115,9 @@
 
   // Add inputs to ukm message.
   if (!AddInputsToUkm(&execution_result, segment_id, model_version,
-                      input_tensor))
+                      input_tensor)) {
     return ukm::kInvalidSourceId;
+  }
 
   // TODO(xingliu): Also record continuous outputs for model execution.
   execution_result.SetPredictionResult(FloatToInt64(result))
@@ -162,9 +163,6 @@
     SegmentId segment_id,
     int64_t model_version,
     const std::vector<float>& input_tensor) {
-  if (!allowed_segment_ids_.contains(static_cast<int>(segment_id)))
-    return false;
-
   if (input_tensor.size() > ARRAY_SIZE(kSegmentationUkmInputMethods)) {
     // Don't record UKM if there are too many tensors.
     stats::RecordTooManyInputTensors(input_tensor.size());
@@ -202,6 +200,17 @@
   return true;
 }
 
+bool SegmentationUkmHelper::CanUploadTensors(
+    const proto::SegmentInfo& segment_info) const {
+  if (!base::FeatureList::IsEnabled(
+          features::kSegmentationStructuredMetricsFeature)) {
+    return false;
+  }
+  return segment_info.model_metadata().upload_tensors() ||
+         allowed_segment_ids_.contains(
+             static_cast<int>(segment_info.segment_id()));
+}
+
 // static
 int64_t SegmentationUkmHelper::FloatToInt64(float f) {
   // Encode the float number in IEEE754 double precision.