diff --git a/ios/chrome/browser/follow/follow_browser_agent.h b/ios/chrome/browser/follow/follow_browser_agent.h index 54bb0046504b55..91e8edeca0a976 100644 --- a/ios/chrome/browser/follow/follow_browser_agent.h +++ b/ios/chrome/browser/follow/follow_browser_agent.h @@ -95,8 +95,12 @@ class FollowBrowserAgent final : public BrowserUserData { FollowSource source, FollowedWebSite* web_site); - raw_ptr browser_; - raw_ptr service_; + // Helper method to lazy initiate variables. + raw_ptr GetFollowService(); + FeedMetricsRecorder* GetMetricsRecorder(); + + raw_ptr browser_ = nullptr; + raw_ptr service_ = nullptr; __weak id new_tab_page_commands_; __weak id snack_bar_commands_; diff --git a/ios/chrome/browser/follow/follow_browser_agent.mm b/ios/chrome/browser/follow/follow_browser_agent.mm index fa759478075466..cb9b3b74413475 100644 --- a/ios/chrome/browser/follow/follow_browser_agent.mm +++ b/ios/chrome/browser/follow/follow_browser_agent.mm @@ -92,41 +92,42 @@ bool IsFollowSourceFromMenu(FollowSource source) { FollowBrowserAgent::~FollowBrowserAgent() = default; bool FollowBrowserAgent::IsWebSiteFollowed(WebPageURLs* web_page_urls) { - return service_->IsWebSiteFollowed(web_page_urls); + return GetFollowService()->IsWebSiteFollowed(web_page_urls); } NSURL* FollowBrowserAgent::GetRecommendedSiteURL(WebPageURLs* web_page_urls) { - return service_->GetRecommendedSiteURL(web_page_urls); + return GetFollowService()->GetRecommendedSiteURL(web_page_urls); } NSArray* FollowBrowserAgent::GetFollowedWebSites() { - return service_->GetFollowedWebSites(); + return GetFollowService()->GetFollowedWebSites(); } void FollowBrowserAgent::FollowWebSite(WebPageURLs* web_page_urls, FollowSource source) { // Record if the source is from a menu. if (IsFollowSourceFromMenu(source)) { - [metrics_recorder_ recordFollowFromMenu]; - [metrics_recorder_ + [GetMetricsRecorder() recordFollowFromMenu]; + [GetMetricsRecorder() recordFollowRequestedWithType:FollowRequestType::kFollowRequestFollow]; } - service_->FollowWebSite(web_page_urls, source, - base::BindOnce(&FollowBrowserAgent::OnFollowResponse, - AsWeakPtr(), web_page_urls, source)); + GetFollowService()->FollowWebSite( + web_page_urls, source, + base::BindOnce(&FollowBrowserAgent::OnFollowResponse, AsWeakPtr(), + web_page_urls, source)); } void FollowBrowserAgent::UnfollowWebSite(WebPageURLs* web_page_urls, FollowSource source) { // Record if the source is from a menu. if (IsFollowSourceFromMenu(source)) { - [metrics_recorder_ recordUnfollowFromMenu]; - [metrics_recorder_ recordFollowRequestedWithType: - FollowRequestType::kFollowRequestUnfollow]; + [GetMetricsRecorder() recordUnfollowFromMenu]; + [GetMetricsRecorder() recordFollowRequestedWithType: + FollowRequestType::kFollowRequestUnfollow]; } - service_->UnfollowWebSite( + GetFollowService()->UnfollowWebSite( web_page_urls, source, base::BindOnce(&FollowBrowserAgent::OnUnfollowResponse, AsWeakPtr(), web_page_urls, source)); @@ -148,26 +149,18 @@ bool IsFollowSourceFromMenu(FollowSource source) { } void FollowBrowserAgent::AddObserver(Observer* observer) { - service_->AddObserver(observer); + GetFollowService()->AddObserver(observer); } void FollowBrowserAgent::RemoveObserver(Observer* observer) { - service_->RemoveObserver(observer); + GetFollowService()->RemoveObserver(observer); } base::WeakPtr FollowBrowserAgent::AsWeakPtr() { return weak_ptr_factory_.GetWeakPtr(); } -FollowBrowserAgent::FollowBrowserAgent(Browser* browser) : browser_(browser) { - ChromeBrowserState* browser_state = browser_->GetBrowserState(); - service_ = FollowServiceFactory::GetForBrowserState(browser_state); - DCHECK(service_); - - metrics_recorder_ = - DiscoverFeedServiceFactory::GetForBrowserState(browser_state) - ->GetFeedMetricsRecorder(); -} +FollowBrowserAgent::FollowBrowserAgent(Browser* browser) : browser_(browser) {} void FollowBrowserAgent::OnFollowResponse(WebPageURLs* web_page_urls, FollowSource source, @@ -204,14 +197,14 @@ bool IsFollowSourceFromMenu(FollowSource source) { FollowedWebSite* web_site) { // Record if the source is from a menu. if (IsFollowSourceFromMenu(source)) { - const NSUInteger count = service_->GetFollowedWebSites().count; - [metrics_recorder_ recordFollowCount:count - forLogReason:FollowCountLogReasonAfterFollow]; + const NSUInteger count = GetFollowService()->GetFollowedWebSites().count; + [GetMetricsRecorder() recordFollowCount:count + forLogReason:FollowCountLogReasonAfterFollow]; } base::UmaHistogramBoolean( "ContentSuggestions.Feed.WebFeed.NewFollow.IsRecommended", - service_->GetRecommendedSiteURL(web_page_urls) ? 1 : 0); + GetFollowService()->GetRecommendedSiteURL(web_page_urls) ? 1 : 0); // Enable the feed prefs to show the feed and to expand it if they // are disabled. @@ -240,7 +233,7 @@ bool IsFollowSourceFromMenu(FollowSource source) { NSString* button_text = l10n_util::GetNSString(IDS_IOS_SNACKBAR_ACTION_GO_TO_FEED); - __weak FeedMetricsRecorder* metrics_recorder = metrics_recorder_; + __weak FeedMetricsRecorder* metrics_recorder = GetMetricsRecorder(); __weak id new_tab_page_command = new_tab_page_commands_; auto message_action = ^{ @@ -272,7 +265,7 @@ bool IsFollowSourceFromMenu(FollowSource source) { NSString* button_text = l10n_util::GetNSString(IDS_IOS_SNACKBAR_ACTION_TRY_AGAIN); - __weak FeedMetricsRecorder* metrics_recorder = metrics_recorder_; + __weak FeedMetricsRecorder* metrics_recorder = GetMetricsRecorder(); base::WeakPtr weak_ptr = AsWeakPtr(); auto message_action = ^{ @@ -302,9 +295,9 @@ bool IsFollowSourceFromMenu(FollowSource source) { FollowedWebSite* web_site) { // Record if the source is from a menu. if (IsFollowSourceFromMenu(source)) { - const NSUInteger count = service_->GetFollowedWebSites().count; - [metrics_recorder_ recordFollowCount:count - forLogReason:FollowCountLogReasonAfterUnfollow]; + const NSUInteger count = GetFollowService()->GetFollowedWebSites().count; + [GetMetricsRecorder() recordFollowCount:count + forLogReason:FollowCountLogReasonAfterUnfollow]; } NSString* message = @@ -313,7 +306,7 @@ bool IsFollowSourceFromMenu(FollowSource source) { NSString* button_text = l10n_util::GetNSString(IDS_IOS_SNACKBAR_ACTION_UNDO); - __weak FeedMetricsRecorder* metrics_recorder = metrics_recorder_; + __weak FeedMetricsRecorder* metrics_recorder = GetMetricsRecorder(); base::WeakPtr weak_ptr = AsWeakPtr(); auto message_action = ^{ @@ -348,7 +341,7 @@ bool IsFollowSourceFromMenu(FollowSource source) { NSString* button_text = l10n_util::GetNSString(IDS_IOS_SNACKBAR_ACTION_TRY_AGAIN); - __weak FeedMetricsRecorder* metrics_recorder = metrics_recorder_; + __weak FeedMetricsRecorder* metrics_recorder = GetMetricsRecorder(); base::WeakPtr weak_ptr = AsWeakPtr(); auto message_action = ^{ @@ -374,3 +367,22 @@ bool IsFollowSourceFromMenu(FollowSource source) { messageAction:message_action completionAction:completion_action]; } + +raw_ptr FollowBrowserAgent::GetFollowService() { + if (!service_) { + ChromeBrowserState* browser_state = browser_->GetBrowserState(); + service_ = FollowServiceFactory::GetForBrowserState(browser_state); + DCHECK(service_); + } + return service_; +} + +FeedMetricsRecorder* FollowBrowserAgent::GetMetricsRecorder() { + if (!metrics_recorder_) { + ChromeBrowserState* browser_state = browser_->GetBrowserState(); + metrics_recorder_ = + DiscoverFeedServiceFactory::GetForBrowserState(browser_state) + ->GetFeedMetricsRecorder(); + } + return metrics_recorder_; +}