Use a Dict pref for feature use recency.

This avoid needing prefs for each capability.

Bug: 375036701

Change-Id: I0cc34951edcbb2f5d6a1a5c8dafe6d3c799fb2a6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6007301
Reviewed-by: Jonathan Ross <[email protected]>
Code-Coverage: [email protected] <[email protected]>
Auto-Submit: Steven Holte <[email protected]>
Reviewed-by: Gabriel Charette <[email protected]>
Commit-Queue: Steven Holte <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1387732}
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 00a6e02e..040070c 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -1637,6 +1637,10 @@
   registry->RegisterBooleanPref(kDiscountConsentShowInterest, false);
   registry->RegisterIntegerPref(kDiscountConsentShowInterestIn, 0);
 #endif  // !BUILDFLAG(IS_ANDROID)
+
+  // Deprecated 11/2024
+  optimization_guide::model_execution::prefs::
+      RegisterLegacyUsagePrefsForMigration(registry);
 }
 
 void ClearSyncRequestedPrefAndMaybeMigrate(PrefService* profile_prefs) {
@@ -2571,6 +2575,10 @@
   // Added 11/2024
   local_state->ClearPref(kOnDeviceModelTimeoutCount);
 
+  // Added 11/2024
+  optimization_guide::model_execution::prefs::MigrateLegacyUsagePrefs(
+      local_state);
+
   // Please don't delete the following line. It is used by PRESUBMIT.py.
   // END_MIGRATE_OBSOLETE_LOCAL_STATE_PREFS
 
diff --git a/components/optimization_guide/DEPS b/components/optimization_guide/DEPS
index c8d7c55..e684f52 100644
--- a/components/optimization_guide/DEPS
+++ b/components/optimization_guide/DEPS
@@ -8,6 +8,7 @@
   "+google_apis",
   "+net",
   "+services/network",
+  "+services/preferences/public/cpp",
   "+third_party/metrics_proto",
   "+third_party/re2",
   "+third_party/smhasher",
diff --git a/components/optimization_guide/core/BUILD.gn b/components/optimization_guide/core/BUILD.gn
index 96f18e3..68a9834 100644
--- a/components/optimization_guide/core/BUILD.gn
+++ b/components/optimization_guide/core/BUILD.gn
@@ -150,6 +150,7 @@
     "//components/variations",
     "//google_apis",
     "//net",
+    "//services/preferences/public/cpp",
     "//third_party/metrics_proto:metrics_proto",
     "//ui/base",
   ]
diff --git a/components/optimization_guide/core/model_execution/model_execution_features.cc b/components/optimization_guide/core/model_execution/model_execution_features.cc
index b2f91d5..577f1b2 100644
--- a/components/optimization_guide/core/model_execution/model_execution_features.cc
+++ b/components/optimization_guide/core/model_execution/model_execution_features.cc
@@ -132,11 +132,8 @@
       *visibility_feature, "enable_feature_when_main_toggle_on", true));
 }
 
-// LINT.IfChange(IsOnDeviceModelEnabled)
-//
 // To enable on-device execution for a feature, update this to return a
-// non-null target. `GetOnDeviceFeatureRecentlyUsedPref` must also be updated to
-// return a valid pref for each on-device feature.
+// non-null target.
 std::optional<proto::OptimizationTarget> GetOptimizationTargetForCapability(
     ModelBasedCapabilityKey feature_key) {
   switch (feature_key) {
@@ -170,6 +167,5 @@
       return std::nullopt;
   }
 }
-// LINT.ThenChange(//components/optimization_guide/core/model_execution/model_execution_prefs.cc:GetOnDeviceFeatureRecentlyUsedPref)
 
 }  // namespace optimization_guide::features::internal
diff --git a/components/optimization_guide/core/model_execution/model_execution_prefs.cc b/components/optimization_guide/core/model_execution/model_execution_prefs.cc
index bb467e0..b5ed4eb2 100644
--- a/components/optimization_guide/core/model_execution/model_execution_prefs.cc
+++ b/components/optimization_guide/core/model_execution/model_execution_prefs.cc
@@ -4,16 +4,71 @@
 
 #include "components/optimization_guide/core/model_execution/model_execution_prefs.h"
 
+#include "base/json/values_util.h"
 #include "base/notreached.h"
+#include "base/strings/strcat.h"
+#include "base/time/time.h"
 #include "components/optimization_guide/core/feature_registry/enterprise_policy_registry.h"
 #include "components/optimization_guide/core/feature_registry/feature_registration.h"
 #include "components/optimization_guide/core/model_execution/feature_keys.h"
 #include "components/optimization_guide/core/optimization_guide_features.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
+#include "services/preferences/public/cpp/dictionary_value_update.h"
+#include "services/preferences/public/cpp/scoped_pref_update.h"
 
 namespace optimization_guide::model_execution::prefs {
 
+namespace {
+
+struct LegacyUsagePref {
+  const char* path;
+  ModelBasedCapabilityKey feature;
+};
+
+constexpr LegacyUsagePref kLegacyUsagePrefs[] = {
+    {"optimization_guide.last_time_on_device_eligible_feature_used",
+     ModelBasedCapabilityKey::kCompose},
+    {"optimization_guide.model_execution.last_time_prompt_api_used",
+     ModelBasedCapabilityKey::kPromptApi},
+    {"optimization_guide.model_execution.last_time_summarize_api_used",
+     ModelBasedCapabilityKey::kSummarize},
+    {"optimization_guide.model_execution.last_time_test_used",
+     ModelBasedCapabilityKey::kTest},
+    {"optimization_guide.model_execution.last_time_history_search_used",
+     ModelBasedCapabilityKey::kHistorySearch},
+    {"optimization_guide.model_execution.last_time_history_query_intent_used",
+     ModelBasedCapabilityKey::kHistoryQueryIntent},
+};
+
+std::string PrefKey(ModelBasedCapabilityKey key) {
+  return base::NumberToString(
+      (static_cast<uint64_t>(ToModelExecutionFeatureProto(key))));
+}
+
+void SetLastUsage(PrefService* local_state,
+                  ModelBasedCapabilityKey feature,
+                  base::Time time) {
+  ::prefs::ScopedDictionaryPrefUpdate update(local_state,
+                                             localstate::kLastUsageByFeature);
+  update->Set(PrefKey(feature), base::TimeToValue(time));
+}
+
+bool IsUseRecent(std::optional<base::Time> last_use) {
+  if (!last_use) {
+    return false;
+  }
+  auto time_since_use = base::Time::Now() - *last_use;
+  base::TimeDelta recent_use_period =
+      features::GetOnDeviceEligibleModelFeatureRecentUsePeriod();
+  // Note: Since we're storing a base::Time, we need to consider the possibility
+  // of clock changes.
+  return time_since_use < recent_use_period &&
+         time_since_use > -recent_use_period;
+}
+
+}  // namespace
+
 void RegisterProfilePrefs(PrefRegistrySimple* registry) {
   RegisterGenAiFeatures(registry);
 }
@@ -41,32 +96,10 @@
 const char kOnDevicePerformanceClassVersion[] =
     "optimization_guide.on_device.performance_class_version";
 
-// A timestamp for the last time various features were used which could have
-// benefited from the on-device model. These are on-device eligible features,
-// and this will be used to help decide whether to acquire the on device base
-// model and the adaptation model.
-//
-// For historical reasons, the compose pref was named generically and is
-// continued to be used.
-
-const char kLastTimeComposeWasUsed[] =
-    "optimization_guide.last_time_on_device_eligible_feature_used";
-
-const char kLastTimePromptApiWasUsed[] =
-    "optimization_guide.model_execution.last_time_prompt_api_"
-    "used";
-
-const char kLastTimeSummarizeApiWasUsed[] =
-    "optimization_guide.model_execution.last_time_summarize_api_used";
-
-const char kLastTimeTestFeatureWasUsed[] =
-    "optimization_guide.model_execution.last_time_test_used";
-
-const char kLastTimeHistorySearchWasUsed[] =
-    "optimization_guide.model_execution.last_time_history_search_used";
-
-const char kLastTimeHistoryQueryIntentWasUsed[] =
-    "optimization_guide.model_execution.last_time_history_query_intent_used";
+// Timestamps for the last time each features was used while on-device eligible.
+// Used to decide which models are worth fetching.
+const char kLastUsageByFeature[] =
+    "optimization_guide.model_execution.last_usage_by_feature";
 
 // A timestamp for the last time the on-device model was eligible for download.
 const char kLastTimeEligibleForOnDeviceModelDownload[] =
@@ -90,54 +123,60 @@
   registry->RegisterIntegerPref(localstate::kOnDevicePerformanceClass, 0);
   registry->RegisterStringPref(localstate::kOnDevicePerformanceClassVersion,
                                std::string());
-  registry->RegisterTimePref(localstate::kLastTimeComposeWasUsed,
-                             base::Time::Min());
-  registry->RegisterTimePref(localstate::kLastTimePromptApiWasUsed,
-                             base::Time::Min());
-  registry->RegisterTimePref(localstate::kLastTimeSummarizeApiWasUsed,
-                             base::Time::Min());
-  registry->RegisterTimePref(localstate::kLastTimeTestFeatureWasUsed,
-                             base::Time::Min());
-  registry->RegisterTimePref(localstate::kLastTimeHistorySearchWasUsed,
-                             base::Time::Min());
-  registry->RegisterTimePref(localstate::kLastTimeHistoryQueryIntentWasUsed,
-                             base::Time::Min());
   registry->RegisterTimePref(
       localstate::kLastTimeEligibleForOnDeviceModelDownload, base::Time::Min());
   registry->RegisterDictionaryPref(localstate::kOnDeviceModelValidationResult);
+  registry->RegisterDictionaryPref(localstate::kLastUsageByFeature);
   registry->RegisterInt64Pref(localstate::kModelQualityLogggingClientId, 0,
                               PrefRegistry::LOSSY_PREF);
   registry->RegisterIntegerPref(
       localstate::kGenAILocalFoundationalModelEnterprisePolicySettings, 0);
 }
 
-// LINT.IfChange(GetOnDeviceFeatureRecentlyUsedPref)
-const char* GetOnDeviceFeatureRecentlyUsedPref(
-    ModelBasedCapabilityKey feature) {
-  switch (feature) {
-    case ModelBasedCapabilityKey::kCompose:
-      return prefs::localstate::kLastTimeComposeWasUsed;
-    case ModelBasedCapabilityKey::kPromptApi:
-      return prefs::localstate::kLastTimePromptApiWasUsed;
-    case ModelBasedCapabilityKey::kSummarize:
-      return prefs::localstate::kLastTimeSummarizeApiWasUsed;
-    case ModelBasedCapabilityKey::kTest:
-      return prefs::localstate::kLastTimeTestFeatureWasUsed;
-    case ModelBasedCapabilityKey::kHistorySearch:
-      return prefs::localstate::kLastTimeHistorySearchWasUsed;
-    case ModelBasedCapabilityKey::kHistoryQueryIntent:
-      return prefs::localstate::kLastTimeHistoryQueryIntentWasUsed;
-    case ModelBasedCapabilityKey::kFormsAnnotations:
-    case ModelBasedCapabilityKey::kFormsPredictions:
-    case ModelBasedCapabilityKey::kWallpaperSearch:
-    case ModelBasedCapabilityKey::kTabOrganization:
-    case ModelBasedCapabilityKey::kTextSafety:
-    case ModelBasedCapabilityKey::kBlingPrototyping:
-    case ModelBasedCapabilityKey::kPasswordChangeSubmission:
-      // This should not be called for features that are not on-device.
-      NOTREACHED();
+void RegisterLegacyUsagePrefsForMigration(PrefRegistrySimple* registry) {
+  for (auto& pref : kLegacyUsagePrefs) {
+    registry->RegisterTimePref(pref.path, base::Time::Min());
   }
 }
-// LINT.ThenChange(//components/optimization_guide/core/model_execution/model_execution_features.cc:IsOnDeviceModelEnabled)
+
+void MigrateLegacyUsagePrefs(PrefService* local_state) {
+  for (auto& pref : kLegacyUsagePrefs) {
+    if (local_state->HasPrefPath(pref.path)) {
+      DCHECK(!local_state->GetDict(localstate::kLastUsageByFeature)
+                  .Find(PrefKey(pref.feature)));
+      SetLastUsage(local_state, pref.feature, local_state->GetTime(pref.path));
+      local_state->ClearPref(pref.path);
+    }
+  }
+}
+
+void PruneOldUsagePrefs(PrefService* local_state) {
+  ::prefs::ScopedDictionaryPrefUpdate update(local_state,
+                                             localstate::kLastUsageByFeature);
+  std::vector<std::string> keys_to_prune_;  // Avoid iterator invalidation.
+  for (auto kv : *update->AsConstDict()) {
+    if (!IsUseRecent(base::ValueToTime(kv.second))) {
+      keys_to_prune_.emplace_back(kv.first);
+    }
+  }
+  for (const auto& key : keys_to_prune_) {
+    update->Remove(key);
+  }
+}
+
+void RecordFeatureUsage(PrefService* local_state,
+                        ModelBasedCapabilityKey feature) {
+  SetLastUsage(local_state, feature, base::Time::Now());
+}
+
+bool WasFeatureRecentlyUsed(const PrefService* local_state,
+                            ModelBasedCapabilityKey feature) {
+  const auto* value = local_state->GetDict(localstate::kLastUsageByFeature)
+                          .Find(PrefKey(feature));
+  if (!value) {
+    return false;
+  }
+  return IsUseRecent(base::ValueToTime(*value));
+}
 
 }  // namespace optimization_guide::model_execution::prefs
diff --git a/components/optimization_guide/core/model_execution/model_execution_prefs.h b/components/optimization_guide/core/model_execution/model_execution_prefs.h
index 4d44663..0be0487 100644
--- a/components/optimization_guide/core/model_execution/model_execution_prefs.h
+++ b/components/optimization_guide/core/model_execution/model_execution_prefs.h
@@ -6,8 +6,10 @@
 #define COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_MODEL_EXECUTION_PREFS_H_
 
 #include "base/component_export.h"
+#include "base/time/time.h"
 #include "components/optimization_guide/core/model_execution/feature_keys.h"
 #include "components/optimization_guide/proto/model_execution.pb.h"
+#include "components/prefs/prefs_export.h"
 
 class PrefRegistrySimple;
 class PrefService;
@@ -47,15 +49,7 @@
 COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
 extern const char kOnDevicePerformanceClassVersion[];
 COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
-extern const char kLastTimeComposeWasUsed[];
-COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
-extern const char kLastTimePromptApiWasUsed[];
-COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
-extern const char kLastTimeSummarizeApiWasUsed[];
-COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
-extern const char kLastTimeTestFeatureWasUsed[];
-COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
-extern const char kLastTimeHistorySearchWasUsed[];
+extern const char kLastUsageByFeature[];
 COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
 extern const char kLastTimeEligibleForOnDeviceModelDownload[];
 COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
@@ -71,11 +65,20 @@
 COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
 void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
 
-// Returns the value of the local state pref to check for whether an on-device
-// eligible `feature` was recently used. All on-device eligible features should
-// have this pref defined.
 COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
-const char* GetOnDeviceFeatureRecentlyUsedPref(ModelBasedCapabilityKey feature);
+void RegisterLegacyUsagePrefsForMigration(PrefRegistrySimple* registry);
+
+COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
+void MigrateLegacyUsagePrefs(PrefService* local_state);
+
+COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
+void PruneOldUsagePrefs(PrefService* local_state);
+COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
+void RecordFeatureUsage(PrefService* local_state,
+                        ModelBasedCapabilityKey feature);
+COMPONENT_EXPORT(OPTIMIZATION_GUIDE_FEATURES)
+bool WasFeatureRecentlyUsed(const PrefService* local_state,
+                            ModelBasedCapabilityKey feature);
 
 }  // namespace optimization_guide::model_execution::prefs
 
diff --git a/components/optimization_guide/core/model_execution/model_execution_util.cc b/components/optimization_guide/core/model_execution/model_execution_util.cc
index 5ba3311..61ba3bd 100644
--- a/components/optimization_guide/core/model_execution/model_execution_util.cc
+++ b/components/optimization_guide/core/model_execution/model_execution_util.cc
@@ -144,15 +144,7 @@
   if (!features::internal::GetOptimizationTargetForCapability(feature)) {
     return false;
   }
-  base::Time last_use = local_state.GetTime(
-      model_execution::prefs::GetOnDeviceFeatureRecentlyUsedPref(feature));
-  auto recent_use_period =
-      features::GetOnDeviceEligibleModelFeatureRecentUsePeriod();
-  auto time_since_use = base::Time::Now() - last_use;
-  // Note: Since we're storing a base::Time, we need to consider the possibility
-  // of clock changes.
-  return time_since_use < recent_use_period &&
-         time_since_use > -recent_use_period;
+  return model_execution::prefs::WasFeatureRecentlyUsed(&local_state, feature);
 }
 
 }  // namespace optimization_guide
diff --git a/components/optimization_guide/core/model_execution/on_device_model_adaptation_loader_unittest.cc b/components/optimization_guide/core/model_execution/on_device_model_adaptation_loader_unittest.cc
index 0de19c9..69fa6d0b 100644
--- a/components/optimization_guide/core/model_execution/on_device_model_adaptation_loader_unittest.cc
+++ b/components/optimization_guide/core/model_execution/on_device_model_adaptation_loader_unittest.cc
@@ -340,7 +340,7 @@
        AdaptationModelDownloadRegisteredWhenFeatureFirstUsed) {
   // With the feature as not used yet, model observer won't be registered.
   local_state_.ClearPref(
-      model_execution::prefs::localstate::kLastTimeTestFeatureWasUsed);
+      model_execution::prefs::localstate::kLastUsageByFeature);
   SetBaseModelStateChanged();
   EXPECT_FALSE(model_provider_.optimization_target_);
   histogram_tester_.ExpectUniqueSample(
@@ -349,9 +349,8 @@
       OnDeviceModelAdaptationAvailability::kFeatureNotRecentlyUsed, 1);
 
   // When the feature is used, observer will be registered.
-  local_state_.SetTime(
-      model_execution::prefs::localstate::kLastTimeTestFeatureWasUsed,
-      base::Time::Now());
+  model_execution::prefs::RecordFeatureUsage(&local_state_,
+                                             ModelBasedCapabilityKey::kTest);
   InvokeOnDeviceEligibleFeatureFirstUsed();
   EXPECT_EQ(proto::OptimizationTarget::OPTIMIZATION_TARGET_MODEL_VALIDATION,
             model_provider_.optimization_target_);
diff --git a/components/optimization_guide/core/model_execution/on_device_model_component.cc b/components/optimization_guide/core/model_execution/on_device_model_component.cc
index 1a349fb..2276f3ef 100644
--- a/components/optimization_guide/core/model_execution/on_device_model_component.cc
+++ b/components/optimization_guide/core/model_execution/on_device_model_component.cc
@@ -175,9 +175,7 @@
                                   GetWeakPtr(), feature));
   }
 
-  local_state_->SetTime(
-      model_execution::prefs::GetOnDeviceFeatureRecentlyUsedPref(feature),
-      base::Time::Now());
+  model_execution::prefs::RecordFeatureUsage(local_state_, feature);
 
   base::UmaHistogramEnumeration(
       "OptimizationGuide.ModelExecution.OnDeviceModelStatusAtUseTime",
@@ -211,6 +209,7 @@
 
 void OnDeviceModelComponentStateManager::OnStartup() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  model_execution::prefs::PruneOldUsagePrefs(local_state_);
   if (auto model_path_override_switch =
           switches::GetOnDeviceModelExecutionOverride()) {
     is_model_allowed_ = true;
diff --git a/components/optimization_guide/core/model_execution/on_device_model_component_unittest.cc b/components/optimization_guide/core/model_execution/on_device_model_component_unittest.cc
index 3b93a65..c13e70f 100644
--- a/components/optimization_guide/core/model_execution/on_device_model_component_unittest.cc
+++ b/components/optimization_guide/core/model_execution/on_device_model_component_unittest.cc
@@ -48,10 +48,8 @@
     local_state_.SetInteger(
         model_execution::prefs::localstate::kOnDevicePerformanceClass,
         base::to_underlying(OnDeviceModelPerformanceClass::kLow));
-    local_state_.SetTime(
-        model_execution::prefs::GetOnDeviceFeatureRecentlyUsedPref(
-            ModelBasedCapabilityKey::kCompose),
-        base::Time::Now());
+    model_execution::prefs::RecordFeatureUsage(
+        &local_state_, ModelBasedCapabilityKey::kCompose);
 
     feature_list_.InitWithFeaturesAndParameters(
         {{features::kOptimizationGuideModelExecution, {}},
@@ -228,8 +226,7 @@
 
 TEST_F(OnDeviceModelComponentTest, NoEligibleFeatureUse) {
   local_state_.ClearPref(
-      model_execution::prefs::GetOnDeviceFeatureRecentlyUsedPref(
-          ModelBasedCapabilityKey::kCompose));
+      model_execution::prefs::localstate::kLastUsageByFeature);
 
   manager()->OnStartup();
   WaitForStartup();
@@ -242,15 +239,17 @@
 }
 
 TEST_F(OnDeviceModelComponentTest, EligibleFeatureUseTooOld) {
-  local_state_.SetTime(
-      model_execution::prefs::GetOnDeviceFeatureRecentlyUsedPref(
-          ModelBasedCapabilityKey::kCompose),
-      base::Time::Now() - base::Days(31));
+  task_environment_.FastForwardBy(base::Days(31));
 
   manager()->OnStartup();
   WaitForStartup();
 
   EXPECT_FALSE(on_device_component_state_manager_.IsInstallerRegistered());
+  // The usage should also get pruned from the pref.
+  ASSERT_TRUE(
+      local_state_
+          .GetDict(model_execution::prefs::localstate::kLastUsageByFeature)
+          .empty());
 }
 
 TEST_F(OnDeviceModelComponentTest, NoPerformanceClass) {
@@ -286,8 +285,7 @@
                        base::Time::Now() - base::Minutes(1) -
                            features::GetOnDeviceModelRetentionTime());
   local_state_.ClearPref(
-      model_execution::prefs::GetOnDeviceFeatureRecentlyUsedPref(
-          ModelBasedCapabilityKey::kCompose));
+      model_execution::prefs::localstate::kLastUsageByFeature);
 
   // Should uninstall the first time, and skip uninstallation the next time.
   manager()->OnStartup();
@@ -333,8 +331,7 @@
   // is no longer eligible for download.
   on_device_component_state_manager_.Reset();
   local_state_.ClearPref(
-      model_execution::prefs::GetOnDeviceFeatureRecentlyUsedPref(
-          ModelBasedCapabilityKey::kCompose));
+      model_execution::prefs::localstate::kLastUsageByFeature);
   manager()->OnStartup();
   WaitForStartup();
 
@@ -493,8 +490,7 @@
 
 TEST_F(OnDeviceModelComponentTest, InstallAfterEligibleFeatureWasUsed) {
   local_state_.ClearPref(
-      model_execution::prefs::GetOnDeviceFeatureRecentlyUsedPref(
-          ModelBasedCapabilityKey::kCompose));
+      model_execution::prefs::localstate::kLastUsageByFeature);
   manager()->OnStartup();
   WaitForStartup();
 
diff --git a/components/optimization_guide/core/model_execution/on_device_model_service_controller_unittest.cc b/components/optimization_guide/core/model_execution/on_device_model_service_controller_unittest.cc
index a51cd2bd..4162b7d6 100644
--- a/components/optimization_guide/core/model_execution/on_device_model_service_controller_unittest.cc
+++ b/components/optimization_guide/core/model_execution/on_device_model_service_controller_unittest.cc
@@ -222,10 +222,8 @@
     pref_service_.SetInteger(
         model_execution::prefs::localstate::kOnDevicePerformanceClass,
         base::to_underlying(OnDeviceModelPerformanceClass::kHigh));
-    pref_service_.SetTime(
-        model_execution::prefs::GetOnDeviceFeatureRecentlyUsedPref(
-            ModelBasedCapabilityKey::kCompose),
-        base::Time::Now());
+    model_execution::prefs::RecordFeatureUsage(
+        &pref_service_, ModelBasedCapabilityKey::kCompose);
   }
 
   void TearDown() override {