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 {