Remove feed session based refresh

Land after downstream usage removal in https://crrev.com/i/6840074.

This CL is related to https://crrev.com/c/5173288, which cleans up
all ACR flag related code. But I extracted this "session" piece
separately because the removal was more complicated. This CL should
be a lot more readable than if I had jumbled it together.

Bug: 1479655
Change-Id: I6941b727ba708554ad8d94936964708bf001e360
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5172027
Reviewed-by: Sergio Collazos <sczs@chromium.org>
Commit-Queue: edchin <edchin@google.com>
Cr-Commit-Position: refs/heads/main@{#1243720}
diff --git a/ios/chrome/app/feed_app_agent.mm b/ios/chrome/app/feed_app_agent.mm
index 6ef0d01..cdd41543 100644
--- a/ios/chrome/app/feed_app_agent.mm
+++ b/ios/chrome/app/feed_app_agent.mm
@@ -206,13 +206,6 @@
     });
   };
 
-  // The `engagedWithLatestRefreshedContent` criteria only applies to background
-  // app close. Early return if criteria is not met.
-  if (IsFeedAppCloseBackgroundRefreshEnabled() &&
-      ![self.feedMetricsRecorder hasEngagedWithLatestRefreshedContent]) {
-    return;
-  }
-
   // Cold starts are killed earlier in this method, so warm and cold starts
   // cannot be recorded at the same time.
   [self recordWarmStartMetrics];
@@ -245,9 +238,6 @@
 
 // Record refresh trigger for warm start.
 - (void)recordWarmStartMetrics {
-  CHECK(!IsFeedAppCloseBackgroundRefreshEnabled() ||
-        [self.feedMetricsRecorder hasEngagedWithLatestRefreshedContent]);
-
   if (IsFeedAppCloseBackgroundRefreshEnabled()) {
     // This is recorded if both app close and regular background refreshes are
     // enabled.
diff --git a/ios/chrome/browser/shared/public/features/features.h b/ios/chrome/browser/shared/public/features/features.h
index 541ec390..7f808f1 100644
--- a/ios/chrome/browser/shared/public/features/features.h
+++ b/ios/chrome/browser/shared/public/features/features.h
@@ -326,17 +326,6 @@
 // signed in non syncing users.
 BASE_DECLARE_FEATURE(kLinkAccountSettingsToPrivacyFooter);
 
-// Engagement criteria type for a feed refresh.
-enum class FeedRefreshEngagementCriteriaType {
-  // Any scroll or interaction.
-  kSimpleEngagement = 0,
-  // Meets minimum scroll criteria or any interaction.
-  kEngagement = 1,
-  // Meets good visit criteria.
-  kGoodVisit = 2,
-  kMaxValue = kGoodVisit,
-};
-
 // Feature flag to enable feed background refresh.
 // Use IsFeedBackgroundRefreshEnabled() instead of this constant directly.
 BASE_DECLARE_FEATURE(kEnableFeedBackgroundRefresh);
@@ -410,10 +399,6 @@
 extern const char kBackgroundRefreshMaxAgeInSeconds[];
 
 // Feature param under `kEnableFeedInvisibleForegroundRefresh` to enable refresh
-// following a Feed session.
-extern const char kEnableFeedSessionCloseForegroundRefresh[];
-
-// Feature param under `kEnableFeedInvisibleForegroundRefresh` to enable refresh
 // on app backgrounding.
 extern const char kEnableFeedAppCloseForegroundRefresh[];
 
@@ -422,17 +407,9 @@
 extern const char kEnableFeedAppCloseBackgroundRefresh[];
 
 // Feature param under `kEnableFeedInvisibleForegroundRefresh` for the
-// engagement criteria type to refresh the feed.
-extern const char kFeedRefreshEngagementCriteriaType[];
-
-// Feature param under `kEnableFeedInvisibleForegroundRefresh` for the
 // background refresh interval in seconds.
 extern const char kAppCloseBackgroundRefreshIntervalInSeconds[];
 
-// Feature param under `kEnableFeedInvisibleForegroundRefresh` for the time
-// interval used to set the refresh timer.
-extern const char kFeedRefreshTimerTimeoutInSeconds[];
-
 // Feature param under `kEnableFeedInvisibleForegroundRefresh` for the refresh
 // threshold when the last refresh was seen.
 extern const char kFeedSeenRefreshThresholdInSeconds[];
@@ -519,11 +496,6 @@
 // Whether feed can be refreshed while not visible.
 bool IsFeedInvisibleForegroundRefreshEnabled();
 
-// Whether feed is refreshed after the user ends a Feed session, but while the
-// app is still in the foreground (e.g., user switches tabs, user navigates away
-// from Feed in current tab).
-bool IsFeedSessionCloseForegroundRefreshEnabled();
-
 // Whether feed is refreshed at the moment the app is backgrounding. This is
 // different from background refresh.
 bool IsFeedAppCloseForegroundRefreshEnabled();
@@ -532,16 +504,10 @@
 // backgrounded, and the capability was enabled at startup.
 bool IsFeedAppCloseBackgroundRefreshEnabled();
 
-// Returns the engagement criteria type for a feed refresh.
-FeedRefreshEngagementCriteriaType GetFeedRefreshEngagementCriteriaType();
-
 // The earliest interval to refresh in the background after app enters the
 // background in app close background refresh.
 double GetAppCloseBackgroundRefreshIntervalInSeconds();
 
-// Returns the time interval used to set the session end timer.
-double GetFeedRefreshTimerTimeoutInSeconds();
-
 // Returns the refresh threshold (aka feed expiration) for a feed that has been
 // seen.
 double GetFeedSeenRefreshThresholdInSeconds();
diff --git a/ios/chrome/browser/shared/public/features/features.mm b/ios/chrome/browser/shared/public/features/features.mm
index 5aebf9c1..c6b4523b 100644
--- a/ios/chrome/browser/shared/public/features/features.mm
+++ b/ios/chrome/browser/shared/public/features/features.mm
@@ -449,18 +449,12 @@
     "BackgroundRefreshIntervalInSeconds";
 const char kBackgroundRefreshMaxAgeInSeconds[] =
     "BackgroundRefreshMaxAgeInSeconds";
-const char kEnableFeedSessionCloseForegroundRefresh[] =
-    "EnableFeedSessionCloseForegroundRefresh";
 const char kEnableFeedAppCloseForegroundRefresh[] =
     "EnableFeedAppCloseForegroundRefresh";
 const char kEnableFeedAppCloseBackgroundRefresh[] =
     "EnableFeedAppCloseBackgroundRefresh";
-const char kFeedRefreshEngagementCriteriaType[] =
-    "FeedRefreshEngagementCriteriaType";
 const char kAppCloseBackgroundRefreshIntervalInSeconds[] =
     "AppCloseBackgroundRefreshIntervalInSeconds";
-const char kFeedRefreshTimerTimeoutInSeconds[] =
-    "FeedRefreshTimerTimeoutInSeconds";
 const char kFeedSeenRefreshThresholdInSeconds[] =
     "FeedSeenRefreshThresholdInSeconds";
 const char kFeedUnseenRefreshThresholdInSeconds[] =
@@ -606,13 +600,6 @@
   return base::FeatureList::IsEnabled(kEnableFeedInvisibleForegroundRefresh);
 }
 
-bool IsFeedSessionCloseForegroundRefreshEnabled() {
-  return base::GetFieldTrialParamByFeatureAsBool(
-      kEnableFeedInvisibleForegroundRefresh,
-      kEnableFeedSessionCloseForegroundRefresh,
-      /*default=*/false);
-}
-
 bool IsFeedAppCloseForegroundRefreshEnabled() {
   return base::GetFieldTrialParamByFeatureAsBool(
       kEnableFeedInvisibleForegroundRefresh,
@@ -625,15 +612,6 @@
          IsFeedAppCloseBackgroundRefreshEnabledOnly();
 }
 
-FeedRefreshEngagementCriteriaType GetFeedRefreshEngagementCriteriaType() {
-  return (FeedRefreshEngagementCriteriaType)
-      base::GetFieldTrialParamByFeatureAsInt(
-          kEnableFeedInvisibleForegroundRefresh,
-          kFeedRefreshEngagementCriteriaType,
-          /*default_value=*/
-          (int)FeedRefreshEngagementCriteriaType::kSimpleEngagement);
-}
-
 double GetAppCloseBackgroundRefreshIntervalInSeconds() {
   double override_value = [[NSUserDefaults standardUserDefaults]
       doubleForKey:@"AppCloseBackgroundRefreshIntervalInSeconds"];
@@ -646,17 +624,6 @@
       /*default=*/base::Minutes(5).InSecondsF());
 }
 
-double GetFeedRefreshTimerTimeoutInSeconds() {
-  double override_value = [[NSUserDefaults standardUserDefaults]
-      doubleForKey:@"FeedRefreshTimerTimeoutInSeconds"];
-  if (override_value > 0.0) {
-    return override_value;
-  }
-  return base::GetFieldTrialParamByFeatureAsDouble(
-      kEnableFeedInvisibleForegroundRefresh, kFeedRefreshTimerTimeoutInSeconds,
-      /*default=*/base::Minutes(5).InSecondsF());
-}
-
 double GetFeedSeenRefreshThresholdInSeconds() {
   double override_value = [[NSUserDefaults standardUserDefaults]
       doubleForKey:@"FeedSeenRefreshThresholdInSeconds"];
diff --git a/ios/chrome/browser/ui/ntp/metrics/BUILD.gn b/ios/chrome/browser/ui/ntp/metrics/BUILD.gn
index debf09e..7e045e4 100644
--- a/ios/chrome/browser/ui/ntp/metrics/BUILD.gn
+++ b/ios/chrome/browser/ui/ntp/metrics/BUILD.gn
@@ -23,7 +23,6 @@
     "//components/ntp_tiles",
     "//components/prefs",
     "//ios/chrome/browser/discover_feed/model:constants",
-    "//ios/chrome/browser/discover_feed/model:discover_feed_refresher",
     "//ios/chrome/browser/metrics/model:constants",
     "//ios/chrome/browser/shared/model/prefs:pref_names",
     "//ios/chrome/browser/shared/public/features",
diff --git a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.h b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.h
index 71241a8..4a3abd9d 100644
--- a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.h
+++ b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.h
@@ -13,7 +13,6 @@
 #import "ios/chrome/browser/ui/ntp/metrics/feed_metrics_constants.h"
 #import "ios/chrome/browser/ui/ntp/metrics/feed_refresh_state_tracker.h"
 
-class DiscoverFeedRefresher;
 @protocol FeedControlDelegate;
 @protocol NewTabPageFollowDelegate;
 @protocol NewTabPageMetricsDelegate;
@@ -35,9 +34,6 @@
 // Whether or not the feed is currently being shown on the Start Surface.
 @property(nonatomic, assign) BOOL isShownOnStartSurface;
 
-// Object that can refresh the feed.
-@property(nonatomic, assign) DiscoverFeedRefresher* feedRefresher;
-
 // Delegate for reporting feed actions to the NTP metrics recorder.
 @property(nonatomic, weak) id<NewTabPageMetricsDelegate> NTPMetricsDelegate;
 
diff --git a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.mm b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.mm
index 3534476..b136a1e 100644
--- a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.mm
+++ b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.mm
@@ -13,7 +13,6 @@
 #import "base/metrics/user_metrics_action.h"
 #import "base/time/time.h"
 #import "components/prefs/pref_service.h"
-#import "ios/chrome/browser/discover_feed/model/discover_feed_refresher.h"
 #import "ios/chrome/browser/metrics/model/constants.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/browser/ui/ntp/feed_control_delegate.h"
@@ -58,12 +57,6 @@
 // metric.
 @property(nonatomic, assign) NSDate* activityBucketLastReportedDate;
 
-// Tracks whether user has engaged with the latest refreshed content. The term
-// "engaged" is defined by its usage in this file. For example, it may be
-// similar to `engagedSimpleReportedDiscover`.
-@property(nonatomic, assign, getter=hasEngagedWithLatestRefreshedContent)
-    BOOL engagedWithLatestRefreshedContent;
-
 // Tracking property to record a scroll for Good Visits.
 // TODO(crbug.com/1373650) separate the property below in two, one for each
 // feed.
@@ -91,9 +84,6 @@
 // `ContentSuggestions.Feed.TimeSpentInFeed`
 @property(nonatomic, assign) base::TimeDelta timeSpentInFeed;
 
-// Timer to refresh the feed.
-@property(nonatomic, strong) NSTimer* refreshTimer;
-
 // YES if the NTP is visible.
 @property(nonatomic, assign) BOOL isNTPVisible;
 
@@ -124,11 +114,6 @@
 
 #pragma mark - Public
 
-- (void)dealloc {
-  [self.refreshTimer invalidate];
-  self.refreshTimer = nil;
-}
-
 + (void)recordFeedRefreshTrigger:(FeedRefreshTrigger)trigger {
   base::UmaHistogramEnumeration(kDiscoverFeedRefreshTrigger, trigger);
 }
@@ -180,10 +165,7 @@
 
 - (void)recordNTPDidChangeVisibility:(BOOL)visible {
   self.isNTPVisible = visible;
-  // Invalidate the timer when the user returns to the feed since the feed
-  // should not be refreshed when the user is viewing it.
   if (visible) {
-    [self.refreshTimer invalidate];
     [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::
                                                     kOpenedFeedSurface
                                   asInteraction:NO];
@@ -584,10 +566,6 @@
 
 - (void)recordFeedWillRefresh {
   base::RecordAction(base::UserMetricsAction(kFeedWillRefresh));
-  // The feed will have new content so reset the engagement tracking variable.
-  // TODO(crbug.com/1423467): We need to know whether the feed was actually
-  // refreshed, and not just when it was triggered.
-  self.engagedWithLatestRefreshedContent = NO;
 }
 
 - (void)recordFeedSelected:(FeedType)feedType
@@ -1040,10 +1018,6 @@
   // Chrome run.
   if (scrollDistance > 0 || interacted) {
     [self recordEngagedSimple];
-    if (GetFeedRefreshEngagementCriteriaType() ==
-        FeedRefreshEngagementCriteriaType::kSimpleEngagement) {
-      self.engagedWithLatestRefreshedContent = YES;
-    }
   }
 
   // Report the user as engaged if they have scrolled more than the threshold or
@@ -1051,20 +1025,9 @@
   // Chrome run.
   if (scrollDistance > kMinScrollThreshold || interacted) {
     [self recordEngaged];
-    if (GetFeedRefreshEngagementCriteriaType() ==
-        FeedRefreshEngagementCriteriaType::kEngagement) {
-      self.engagedWithLatestRefreshedContent = YES;
-    }
   }
 
   [self.sessionRecorder recordUserInteractionOrScrolling];
-
-  // This must be called after setting `engagedWithLatestRefreshedContent`
-  // properly after scrolling or interactions.
-  if (IsFeedSessionCloseForegroundRefreshEnabled() &&
-      [self hasEngagedWithLatestRefreshedContent]) {
-    [self setOrExtendRefreshTimer];
-  }
 }
 
 // Checks if a Good Visit should be recorded. `interacted` is YES if it was
@@ -1250,10 +1213,6 @@
     UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedEngagementTypeHistogram,
                               FeedEngagementType::kGoodVisit);
     self.goodVisitReportedDiscover = YES;
-    if (GetFeedRefreshEngagementCriteriaType() ==
-        FeedRefreshEngagementCriteriaType::kGoodVisit) {
-      self.engagedWithLatestRefreshedContent = YES;
-    }
   }
 
   // Log interaction for Following feed.
@@ -1429,29 +1388,6 @@
   }
 }
 
-// Sets or extends the refresh timer.
-- (void)setOrExtendRefreshTimer {
-  [self.refreshTimer invalidate];
-  __weak FeedMetricsRecorder* weakSelf = self;
-  self.refreshTimer = [NSTimer
-      scheduledTimerWithTimeInterval:GetFeedRefreshTimerTimeoutInSeconds()
-                              target:weakSelf
-                            selector:@selector(refreshTimerEnded)
-                            userInfo:nil
-                             repeats:NO];
-}
-
-// Signals that the refresh timer ended.
-- (void)refreshTimerEnded {
-  [self.refreshTimer invalidate];
-  self.refreshTimer = nil;
-  if (!self.isNTPVisible) {
-    // The feed refresher checks feed engagement criteria.
-    self.feedRefresher->RefreshFeed(
-        FeedRefreshTrigger::kForegroundFeedNotVisible);
-  }
-}
-
 #pragma mark - Converters
 
 // Converts a FollowingFeedSortType NSEnum into a FeedSortType enum.
diff --git a/ios/chrome/browser/ui/ntp/metrics/feed_refresh_state_tracker.h b/ios/chrome/browser/ui/ntp/metrics/feed_refresh_state_tracker.h
index 6956d5b..2a173dc2 100644
--- a/ios/chrome/browser/ui/ntp/metrics/feed_refresh_state_tracker.h
+++ b/ios/chrome/browser/ui/ntp/metrics/feed_refresh_state_tracker.h
@@ -10,10 +10,6 @@
 // content.
 @protocol FeedRefreshStateTracker
 
-// Returns YES if the user has engaged with the latest refreshed content. The
-// term "engaged" is an implementation detail of the receiver.
-- (BOOL)hasEngagedWithLatestRefreshedContent;
-
 // Returns YES if the NTP is visible to the user.
 - (BOOL)isNTPVisible;