[iOS][LU] Add breadcrumbs for LVF unification

Change-Id: Ib0a94ce0fca6eded1af92c1e8fb49ff0d48c9f7f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6218397
Commit-Queue: Robert Kaplow <rkaplow@chromium.org>
Auto-Submit: Radu Nitescu <radunitescu@google.com>
Reviewed-by: Robert Kaplow <rkaplow@chromium.org>
Reviewed-by: Christian Xu <christianxu@chromium.org>
Reviewed-by: Stepan Khapugin <stkhapugin@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1416207}
NOKEYCHECK=True
GitOrigin-RevId: afb25a6d141bd3e2cf9fe2bbbc6ae91fc8e3992b
diff --git a/chrome/browser/lens_overlay/coordinator/lens_view_finder_coordinator.mm b/chrome/browser/lens_overlay/coordinator/lens_view_finder_coordinator.mm
index a4fd607..2600194 100644
--- a/chrome/browser/lens_overlay/coordinator/lens_view_finder_coordinator.mm
+++ b/chrome/browser/lens_overlay/coordinator/lens_view_finder_coordinator.mm
@@ -8,6 +8,7 @@
 #import "ios/chrome/app/profile/profile_state.h"
 #import "ios/chrome/browser/lens_overlay/model/lens_overlay_configuration_factory.h"
 #import "ios/chrome/browser/lens_overlay/model/lens_overlay_entrypoint.h"
+#import "ios/chrome/browser/lens_overlay/model/lens_view_finder_metrics_recorder.h"
 #import "ios/chrome/browser/lens_overlay/ui/lens_view_finder_transition_manager.h"
 #import "ios/chrome/browser/shared/coordinator/scene/scene_state.h"
 #import "ios/chrome/browser/shared/model/browser/browser.h"
@@ -55,6 +56,9 @@
 
   /// Forces the device orientation in portrait mode.
   std::unique_ptr<ScopedForcePortraitOrientation> _scopedForceOrientation;
+
+  /// Records LVF related metrics.
+  LensViewFinderMetricsRecorder* _metricsRecorder;
 }
 
 @synthesize baseViewController = _baseViewController;
@@ -67,6 +71,7 @@
 
 - (void)start {
   [super start];
+  _metricsRecorder = [[LensViewFinderMetricsRecorder alloc] init];
   [self.browser->GetCommandDispatcher()
       startDispatchingToTarget:self
                    forProtocol:@protocol(LensCommands)];
@@ -75,6 +80,7 @@
 - (void)stop {
   [self.browser->GetCommandDispatcher() stopDispatchingToTarget:self];
   [self lockOrientationPortrait:NO];
+  _metricsRecorder = nil;
   [super stop];
 }
 
@@ -110,6 +116,7 @@
   _lensViewController.modalTransitionStyle =
       UIModalTransitionStyleCrossDissolve;
 
+  [_metricsRecorder recordLensViewFinderOpened];
   [self.baseViewController presentViewController:_lensViewController
                                         animated:YES
                                       completion:nil];
@@ -142,6 +149,11 @@
     image = [self infilledImageForPortraitCameraCapture:image];
   }
 
+  [_metricsRecorder
+      recordImageWithSource:isCameraImage
+                                ? LensViewFinderImageSource::kCamera
+                                : LensViewFinderImageSource::kGallery];
+
   LensOverlayEntrypoint entrypoint =
       isCameraImage ? LensOverlayEntrypoint::kLVFCameraCapture
                     : LensOverlayEntrypoint::kLVFImagePicker;
@@ -187,6 +199,7 @@
 
 - (void)lensControllerDidTapDismissButton:
     (id<ChromeLensViewFinderController>)lensController {
+  [_metricsRecorder recordLensViewFinderDismissTapped];
   [self exitLensViewFinderAnimated:YES];
 }
 
diff --git a/chrome/browser/lens_overlay/model/BUILD.gn b/chrome/browser/lens_overlay/model/BUILD.gn
index 27f5588..e250b6c 100644
--- a/chrome/browser/lens_overlay/model/BUILD.gn
+++ b/chrome/browser/lens_overlay/model/BUILD.gn
@@ -104,6 +104,8 @@
   sources = [
     "lens_overlay_metrics_recorder.h",
     "lens_overlay_metrics_recorder.mm",
+    "lens_view_finder_metrics_recorder.h",
+    "lens_view_finder_metrics_recorder.mm",
   ]
   deps = [
     "//base",
diff --git a/chrome/browser/lens_overlay/model/lens_view_finder_metrics_recorder.h b/chrome/browser/lens_overlay/model/lens_view_finder_metrics_recorder.h
new file mode 100644
index 0000000..db018fa
--- /dev/null
+++ b/chrome/browser/lens_overlay/model/lens_view_finder_metrics_recorder.h
@@ -0,0 +1,33 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_LENS_OVERLAY_MODEL_LENS_VIEW_FINDER_METRICS_RECORDER_H_
+#define IOS_CHROME_BROWSER_LENS_OVERLAY_MODEL_LENS_VIEW_FINDER_METRICS_RECORDER_H_
+
+#import "base/metrics/user_metrics.h"
+#import "base/metrics/user_metrics_action.h"
+#import "components/ukm/ios/ukm_url_recorder.h"
+#import "ios/chrome/browser/shared/model/utils/mime_type_util.h"
+
+// Different types of image selection sources.
+enum class LensViewFinderImageSource {
+  kCamera = 0,
+  kGallery = 1,
+};
+
+/// Utility for recording lens view finder related metrics.
+@interface LensViewFinderMetricsRecorder : NSObject
+
+// Records LVF opened.
+- (void)recordLensViewFinderOpened;
+
+// Records LVF closed.
+- (void)recordLensViewFinderDismissTapped;
+
+// Records LVF selected an image.
+- (void)recordImageWithSource:(LensViewFinderImageSource)source;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_LENS_OVERLAY_MODEL_LENS_VIEW_FINDER_METRICS_RECORDER_H_
diff --git a/chrome/browser/lens_overlay/model/lens_view_finder_metrics_recorder.mm b/chrome/browser/lens_overlay/model/lens_view_finder_metrics_recorder.mm
new file mode 100644
index 0000000..989fd8a
--- /dev/null
+++ b/chrome/browser/lens_overlay/model/lens_view_finder_metrics_recorder.mm
@@ -0,0 +1,30 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/lens_overlay/model/lens_view_finder_metrics_recorder.h"
+
+@implementation LensViewFinderMetricsRecorder
+
+- (void)recordLensViewFinderOpened {
+  RecordAction(base::UserMetricsAction("Mobile.LensViewFinder.Opened"));
+}
+
+- (void)recordLensViewFinderDismissTapped {
+  RecordAction(base::UserMetricsAction("Mobile.LensViewFinder.DismissTapped"));
+}
+
+- (void)recordImageWithSource:(LensViewFinderImageSource)source {
+  switch (source) {
+    case LensViewFinderImageSource::kCamera:
+      RecordAction(
+          base::UserMetricsAction("Mobile.LensViewFinder.CameraCapture"));
+      break;
+    case LensViewFinderImageSource::kGallery:
+      RecordAction(
+          base::UserMetricsAction("Mobile.LensViewFinder.GalleryImagePicked"));
+      break;
+  }
+}
+
+@end