[iOS] Move remaining NTP metrics into NTPMetricsRecorder

Moves NTPHeader actions to the metrics recorder, as well as one action
from the NTP coordinator. Some very minor refactoring included.

Bug: 1431193
Change-Id: Id801f13e90c4ab5824af8688a849721b01cb7273
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4455176
Reviewed-by: Sergio Collazos <sczs@chromium.org>
Code-Coverage: Findit <findit-for-me@appspot.gserviceaccount.com>
Commit-Queue: Adam Arcaro <adamta@google.com>
Cr-Commit-Position: refs/heads/main@{#1133341}
diff --git a/ios/chrome/browser/ui/ntp/metrics/new_tab_page_metrics_recorder.h b/ios/chrome/browser/ui/ntp/metrics/new_tab_page_metrics_recorder.h
index d640f69..07489a7 100644
--- a/ios/chrome/browser/ui/ntp/metrics/new_tab_page_metrics_recorder.h
+++ b/ios/chrome/browser/ui/ntp/metrics/new_tab_page_metrics_recorder.h
@@ -41,6 +41,22 @@
 // Logs a metric for an overscroll action on the NTP.
 - (void)recordOverscrollActionForType:(OverscrollActionType)type;
 
+// Logs a metric for the lens button being tapped in the fake omnibox.
+- (void)recordLensTapped;
+
+// Logs a metric for the voice search button being tapped in the NTP header.
+- (void)recordVoiceSearchTapped;
+
+// Logs a metric when the hidden tap view on top of the NTP is tapped to focus
+// the omnibox.
+- (void)recordFakeTapViewTapped;
+
+// Logs a metric for the fake omnibox being tapped in the NTP.
+- (void)recordFakeOmniboxTapped;
+
+// Logs a metric for the identity disc being tapped in the NTP.
+- (void)recordIdentityDiscTapped;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_NTP_METRICS_NEW_TAB_PAGE_METRICS_RECORDER_H_
diff --git a/ios/chrome/browser/ui/ntp/metrics/new_tab_page_metrics_recorder.mm b/ios/chrome/browser/ui/ntp/metrics/new_tab_page_metrics_recorder.mm
index 750491c..e4c8b028 100644
--- a/ios/chrome/browser/ui/ntp/metrics/new_tab_page_metrics_recorder.mm
+++ b/ios/chrome/browser/ui/ntp/metrics/new_tab_page_metrics_recorder.mm
@@ -35,6 +35,28 @@
   UMA_HISTOGRAM_ENUMERATION("IOS.NTP.OverscrollAction", type);
 }
 
+- (void)recordLensTapped {
+  base::RecordAction(
+      base::UserMetricsAction("Mobile.LensIOS.NewTabPageEntrypointTapped"));
+}
+
+- (void)recordVoiceSearchTapped {
+  base::RecordAction(
+      base::UserMetricsAction("MobileNTPMostVisitedVoiceSearch"));
+}
+
+- (void)recordFakeTapViewTapped {
+  base::RecordAction(base::UserMetricsAction("MobileFakeViewNTPTapped"));
+}
+
+- (void)recordFakeOmniboxTapped {
+  base::RecordAction(base::UserMetricsAction("MobileFakeboxNTPTapped"));
+}
+
+- (void)recordIdentityDiscTapped {
+  base::RecordAction(base::UserMetricsAction("MobileNTPIdentityDiscTapped"));
+}
+
 #pragma mark - Private
 
 // Records an NTP impression for the tile ablation retention feature.
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
index fc64f58b..4e88376 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
@@ -350,7 +350,7 @@
   if ([self isFeedHeaderVisible]) {
     [self configureFeedAndHeader];
   }
-  [self configureheaderViewController];
+  [self configureHeaderViewController];
   [self configureContentSuggestionsCoordinator];
   [self configureNTPMediator];
   [self configureFeedMetricsRecorder];
@@ -667,9 +667,10 @@
 }
 
 // Configures `self.headerViewController`.
-- (void)configureheaderViewController {
+- (void)configureHeaderViewController {
   DCHECK(self.headerViewController);
   DCHECK(self.NTPMediator);
+  DCHECK(self.NTPMetricsRecorder);
 
   self.headerViewController.isGoogleDefaultSearchEngine =
       [self isGoogleDefaultSearchEngine];
@@ -685,6 +686,7 @@
       LayoutGuideCenterForBrowser(self.browser);
   self.headerViewController.toolbarDelegate = self.toolbarDelegate;
   self.headerViewController.baseViewController = self.baseViewController;
+  self.headerViewController.NTPMetricsRecorder = self.NTPMetricsRecorder;
 }
 
 // Configures `self.contentSuggestionsCoordiantor`.
@@ -797,6 +799,7 @@
 }
 
 - (void)fakeboxTapped {
+  // TODO(crbug.com/1431193): Move these logs to the `NTPMetricsRecorder`.
   if (NewTabPageTabHelper::FromWebState(self.webState)
           ->ShouldShowStartSurface()) {
     UMA_HISTOGRAM_ENUMERATION("IOS.ContentSuggestions.ActionOnStartSurface",
@@ -809,7 +812,7 @@
 }
 
 - (void)identityDiscWasTapped {
-  base::RecordAction(base::UserMetricsAction("MobileNTPIdentityDiscTapped"));
+  [self.NTPMetricsRecorder recordIdentityDiscTapped];
   id<ApplicationCommands> handler = HandlerForProtocol(
       self.browser->GetCommandDispatcher(), ApplicationCommands);
   BOOL isSignedIn =
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_header_view_controller.h b/ios/chrome/browser/ui/ntp/new_tab_page_header_view_controller.h
index 53774307..1daa6aa 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_header_view_controller.h
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_header_view_controller.h
@@ -18,6 +18,7 @@
 @protocol FakeboxFocuser;
 @protocol NewTabPageControllerDelegate;
 @protocol NewTabPageHeaderCommands;
+@class NewTabPageMetricsRecorder;
 @protocol OmniboxCommands;
 @protocol LensCommands;
 @class LayoutGuideCenter;
@@ -59,6 +60,14 @@
 // The layout guide center for the current scene.
 @property(nonatomic, strong) LayoutGuideCenter* layoutGuideCenter;
 
+// Metrics recorder for the new tab page.
+@property(nonatomic, weak) NewTabPageMetricsRecorder* NTPMetricsRecorder;
+
+// Identity disc shown in this ViewController.
+// TODO(crbug.com/1170995): Remove once the Feed header properly supports
+// ContentSuggestions.
+@property(nonatomic, strong, readonly) UIButton* identityDiscButton;
+
 // Animation to expand this header in response to focusing the omnibox to match
 // the fake omnibox with the omnibox's.
 - (void)expandHeaderForFocus;
@@ -101,11 +110,6 @@
 // Update any dynamic constraints.
 - (void)updateConstraints;
 
-// Identity disc shown in this ViewController.
-// TODO(crbug.com/1170995): Remove once the Feed header properly supports
-// ContentSuggestions.
-@property(nonatomic, strong, readonly) UIButton* identityDiscButton;
-
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_NTP_NEW_TAB_PAGE_HEADER_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_header_view_controller.mm b/ios/chrome/browser/ui/ntp/new_tab_page_header_view_controller.mm
index 088322a..9c00c38 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_header_view_controller.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_header_view_controller.mm
@@ -31,6 +31,7 @@
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_metrics.h"
 #import "ios/chrome/browser/ui/lens/lens_entrypoint.h"
 #import "ios/chrome/browser/ui/ntp/logo_vendor.h"
+#import "ios/chrome/browser/ui/ntp/metrics/new_tab_page_metrics_recorder.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_controller_delegate.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_header_commands.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_header_constants.h"
@@ -437,8 +438,7 @@
 }
 
 - (void)openLens {
-  base::RecordAction(
-      UserMetricsAction("Mobile.LensIOS.NewTabPageEntrypointTapped"));
+  [self.NTPMetricsRecorder recordLensTapped];
   OpenLensInputSelectionCommand* command = [[OpenLensInputSelectionCommand
       alloc]
           initWithEntryPoint:LensEntrypoint::NewTabPage
@@ -449,7 +449,7 @@
 
 - (void)loadVoiceSearch:(id)sender {
   DCHECK(self.voiceSearchIsEnabled);
-  base::RecordAction(UserMetricsAction("MobileNTPMostVisitedVoiceSearch"));
+  [self.NTPMetricsRecorder recordVoiceSearchTapped];
   UIView* voiceSearchButton = base::mac::ObjCCastStrict<UIView>(sender);
   [self.layoutGuideCenter referenceView:voiceSearchButton
                               underName:kVoiceSearchButtonGuide];
@@ -465,12 +465,12 @@
 }
 
 - (void)fakeTapViewTapped {
-  base::RecordAction(base::UserMetricsAction("MobileFakeViewNTPTapped"));
+  [self.NTPMetricsRecorder recordFakeTapViewTapped];
   [self.commandHandler fakeboxTapped];
 }
 
 - (void)fakeboxTapped {
-  base::RecordAction(base::UserMetricsAction("MobileFakeboxNTPTapped"));
+  [self.NTPMetricsRecorder recordFakeOmniboxTapped];
   [self.commandHandler fakeboxTapped];
 }