[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