[B4B] Prepare prefs to rate limit BatchUpload promo
These prefs will be used when deciding whether to show the promo or not.
The logic for the promo rate limiting will be:
- Initial assumption is that the user has local data and is signed in
with B4B enabled.
- Show the promo a maximum of 3 times.
- Do not show the promo before 1 week of it being dismissed.
For that we store the number of dismisses and the last time it was
dismissed.
Bug: 411578592
Change-Id: I5360c915c77329a39e2e0e9f9ba39c8ef7915e9a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6469636
Commit-Queue: Ryan Sultanem <rsult@google.com>
Reviewed-by: Amelie Schneider <amelies@google.com>
Cr-Commit-Position: refs/heads/main@{#1450232}
diff --git a/components/signin/public/base/signin_prefs.cc b/components/signin/public/base/signin_prefs.cc
index 4e122c1..9f961026 100644
--- a/components/signin/public/base/signin_prefs.cc
+++ b/components/signin/public/base/signin_prefs.cc
@@ -92,6 +92,13 @@
constexpr std::string_view kSyncPromoIdentityPillUsedCount =
"ChromeSigninSyncPromoIdentityPillUsedCount";
+// Number of times the Bookmark Batch Upload promo was dismissed.
+constexpr std::string_view kBookmarkBatchUploadPromoDismissCount =
+ "BookmarkBatchUploadPromoDismissCount";
+// The time at which the last Bookmark Batch Upload promo was dismissed.
+constexpr std::string_view kBookmarkBatchUploadPromoLastDismissTime =
+ "BookmarkBatchUploadPromoLastDismissTime";
+
} // namespace
SigninPrefs::SigninPrefs(PrefService& pref_service)
@@ -366,6 +373,20 @@
return GetIntPrefForAccount(gaia_id, kSyncPromoIdentityPillUsedCount);
}
+void SigninPrefs::IncrementBookmarkBatchUploadPromoDismissCountWithLastTime(
+ const GaiaId& gaia_id) {
+ IncrementIntPrefForAccount(gaia_id, kBookmarkBatchUploadPromoDismissCount);
+ SetTimePref(base::Time::Now(), gaia_id,
+ kBookmarkBatchUploadPromoLastDismissTime);
+}
+
+std::pair<int, std::optional<base::Time>>
+SigninPrefs::GetBookmarkBatchUploadPromoDismissCountWithLastTime(
+ const GaiaId& gaia_id) {
+ return {GetIntPrefForAccount(gaia_id, kBookmarkBatchUploadPromoDismissCount),
+ GetTimePref(gaia_id, kBookmarkBatchUploadPromoLastDismissTime)};
+}
+
void SigninPrefs::SetTimePref(base::Time time,
const GaiaId& gaia_id,
std::string_view pref) {
diff --git a/components/signin/public/base/signin_prefs.h b/components/signin/public/base/signin_prefs.h
index 9453069..f336a82ae 100644
--- a/components/signin/public/base/signin_prefs.h
+++ b/components/signin/public/base/signin_prefs.h
@@ -122,6 +122,14 @@
void IncrementSyncPromoIdentityPillUsedCount(const GaiaId& gaia_id);
int GetSyncPromoIdentityPillUsedCount(const GaiaId& gaia_id) const;
+ // Updates the dismiss count of the promo and last time it was dismissed.
+ void IncrementBookmarkBatchUploadPromoDismissCountWithLastTime(
+ const GaiaId& gaia_id);
+ // Returns the number of time the promo was dismissed and the last time it was
+ // dismissed.
+ std::pair<int, std::optional<base::Time>>
+ GetBookmarkBatchUploadPromoDismissCountWithLastTime(const GaiaId& gaia_id);
+
// Note: `callback` will be notified on every change in the main dictionary
// and sub-dictionries (account dictionaries).
static void ObserveSigninPrefsChanges(PrefChangeRegistrar& registrar,
diff --git a/components/signin/public/base/signin_prefs_unittest.cc b/components/signin/public/base/signin_prefs_unittest.cc
index 1742ccf..b968c8e 100644
--- a/components/signin/public/base/signin_prefs_unittest.cc
+++ b/components/signin/public/base/signin_prefs_unittest.cc
@@ -265,3 +265,39 @@
signin_prefs().IncrementSyncPromoIdentityPillUsedCount(gaia_id_2);
EXPECT_EQ(signin_prefs().GetSyncPromoIdentityPillUsedCount(gaia_id_2), 2);
}
+
+TEST_F(SigninPrefsTest, BookmarkBatchUploadPromo) {
+ const GaiaId gaia_id_1("gaia_id_1");
+ auto initial_bookmark_batch_upload_info1 =
+ signin_prefs().GetBookmarkBatchUploadPromoDismissCountWithLastTime(
+ gaia_id_1);
+ EXPECT_EQ(initial_bookmark_batch_upload_info1.first, 0);
+ EXPECT_FALSE(initial_bookmark_batch_upload_info1.second.has_value());
+
+ base::Time reference = base::Time::Now();
+ signin_prefs().IncrementBookmarkBatchUploadPromoDismissCountWithLastTime(
+ gaia_id_1);
+ auto bookmark_batch_upload_info =
+ signin_prefs().GetBookmarkBatchUploadPromoDismissCountWithLastTime(
+ gaia_id_1);
+ EXPECT_EQ(bookmark_batch_upload_info.first, 1);
+ ASSERT_TRUE(bookmark_batch_upload_info.second.has_value());
+ EXPECT_GT(bookmark_batch_upload_info.second.value(), reference);
+
+ const GaiaId gaia_id_2("gaia_id_2");
+ auto initial_bookmark_batch_upload_info2 =
+ signin_prefs().GetBookmarkBatchUploadPromoDismissCountWithLastTime(
+ gaia_id_2);
+ EXPECT_EQ(initial_bookmark_batch_upload_info2.first, 0);
+ EXPECT_FALSE(initial_bookmark_batch_upload_info2.second.has_value());
+
+ base::Time reference2 = base::Time::Now();
+ signin_prefs().IncrementBookmarkBatchUploadPromoDismissCountWithLastTime(
+ gaia_id_2);
+ auto bookmark_batch_upload_info2 =
+ signin_prefs().GetBookmarkBatchUploadPromoDismissCountWithLastTime(
+ gaia_id_2);
+ EXPECT_EQ(bookmark_batch_upload_info2.first, 1);
+ ASSERT_TRUE(bookmark_batch_upload_info2.second.has_value());
+ EXPECT_GT(bookmark_batch_upload_info2.second.value(), reference2);
+}