Send server experiment IDs in feed reliability log

Bug: 348442524
Change-Id: I0bf51f6dc8a652d142c3d55e0fd58dc75347d8da
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5663717
Reviewed-by: Jonathan Freed <[email protected]>
Reviewed-by: Adam Arcaro <[email protected]>
Code-Coverage: [email protected] <[email protected]>
Commit-Queue: Jian Li <[email protected]>
Reviewed-by: Tommy Nyquist <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1322338}
diff --git a/chrome/browser/feed/android/feed_reliability_logging_bridge.cc b/chrome/browser/feed/android/feed_reliability_logging_bridge.cc
index 7cb8a75..bb6907b9 100644
--- a/chrome/browser/feed/android/feed_reliability_logging_bridge.cc
+++ b/chrome/browser/feed/android/feed_reliability_logging_bridge.cc
@@ -3,7 +3,9 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/feed/android/feed_reliability_logging_bridge.h"
+
 #include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
 #include "base/time/time.h"
 #include "components/feed/core/v2/public/types.h"
 #include "net/base/net_errors.h"
@@ -13,6 +15,8 @@
 // Must come after all headers that specialize FromJniType() / ToJniType().
 #include "chrome/browser/feed/android/jni_headers/FeedReliabilityLoggingBridge_jni.h"
 
+using base::android::ScopedJavaLocalRef;
+
 namespace feed {
 namespace android {
 namespace {
@@ -248,6 +252,13 @@
       base::android::AttachCurrentThread(), java_ref_, success);
 }
 
+void FeedReliabilityLoggingBridge::ReportExperiments(
+    const std::vector<int32_t>& experiment_ids) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  Java_FeedReliabilityLoggingBridge_reportExperiments(env, java_ref_,
+                                                      experiment_ids);
+}
+
 void FeedReliabilityLoggingBridge::Destroy(JNIEnv* env) {
   delete this;
 }
diff --git a/chrome/browser/feed/android/feed_reliability_logging_bridge.h b/chrome/browser/feed/android/feed_reliability_logging_bridge.h
index a5f9ee2..549e5870f 100644
--- a/chrome/browser/feed/android/feed_reliability_logging_bridge.h
+++ b/chrome/browser/feed/android/feed_reliability_logging_bridge.h
@@ -62,6 +62,7 @@
                                    int64_t server_send_timestamp_ns) override;
   void LogLoadMoreRequestFinished(int combined_network_status_code) override;
   void LogLoadMoreEnded(bool success) override;
+  void ReportExperiments(const std::vector<int32_t>& experiment_ids) override;
 
  private:
   base::android::ScopedJavaGlobalRef<jobject> java_ref_;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLoggingBridge.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLoggingBridge.java
index d9aa472..1165e29 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLoggingBridge.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLoggingBridge.java
@@ -8,6 +8,7 @@
 
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JNINamespace;
+import org.jni_zero.JniType;
 import org.jni_zero.NativeMethods;
 
 import org.chromium.chrome.browser.xsurface.feed.FeedLaunchReliabilityLogger;
@@ -198,6 +199,14 @@
         }
     }
 
+    @CalledByNative
+    public void reportExperiments(@JniType("std::vector<int32_t>") int[] experimentIds) {
+        mLaunchLogger.reportExperiments(experimentIds);
+        if (mUserInteractionLogger != null) {
+            mUserInteractionLogger.reportExperiments(experimentIds);
+        }
+    }
+
     public void onStreamUpdateFinished() {
         if (!mLaunchLogger.isLaunchInProgress()) return;
 
diff --git a/chrome/browser/feed/feed_service_factory.cc b/chrome/browser/feed/feed_service_factory.cc
index 29f2624..933f356 100644
--- a/chrome/browser/feed/feed_service_factory.cc
+++ b/chrome/browser/feed/feed_service_factory.cc
@@ -121,9 +121,9 @@
     // by design. We do not provide the variations IDs from the backend
     // and do not attach them to the X-Client-Data header.
     for (const auto& exp : experiments) {
-      for (const auto& group_name : exp.second) {
+      for (const auto& group : exp.second) {
         ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial(exp.first,
-                                                                  group_name);
+                                                                  group.name);
       }
     }
   }
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 5107440..9debef6 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -250,6 +250,7 @@
 #include "components/feed/buildflags.h"
 #include "components/feed/core/common/pref_names.h"
 #include "components/feed/core/shared_prefs/pref_names.h"
+#include "components/feed/core/v2/ios_shared_prefs.h"
 
 #if BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/accessibility/accessibility_prefs/android/accessibility_prefs_controller.h"
@@ -2808,6 +2809,11 @@
   syncer::SyncPrefs::MaybeMigrateAutofillToPerAccountPref(profile_prefs);
 #endif  // !BUILDFLAG(IS_ANDROID)
 
+#if BUILDFLAG(IS_ANDROID)
+  // Added 06/2024
+  feed::prefs::MigrateObsoleteFeedExperimentPref_Jun_2024(profile_prefs);
+#endif  // BUILDFLAG(IS_ANDROID)
+
   // Please don't delete the following line. It is used by PRESUBMIT.py.
   // END_MIGRATE_OBSOLETE_PROFILE_PREFS