| Index: ios/chrome/browser/notification_promo.cc
|
| diff --git a/ios/chrome/browser/notification_promo.cc b/ios/chrome/browser/notification_promo.cc
|
| index 11119b2332611769418c8002d528b06b9ee67c5b..e5f5d34392d5f2842382bd291056d0ed2bbc4b51 100644
|
| --- a/ios/chrome/browser/notification_promo.cc
|
| +++ b/ios/chrome/browser/notification_promo.cc
|
| @@ -25,6 +25,7 @@ const char kNTPPromoFinchExperiment[] = "IOSNTPPromotion";
|
| const char kPrefPromoObject[] = "ios.ntppromo";
|
|
|
| // Keys in the kPrefPromoObject dictionary; used only here.
|
| +const char kPrefPromoID[] = "id";
|
| const char kPrefPromoFirstViewTime[] = "first_view_time";
|
| const char kPrefPromoViews[] = "views";
|
| const char kPrefPromoClosed[] = "closed";
|
| @@ -135,14 +136,21 @@ void NotificationPromo::MigrateUserPrefs(PrefService* user_prefs) {
|
| }
|
|
|
| void NotificationPromo::WritePrefs() {
|
| + WritePrefs(promo_id_, first_view_time_, views_, closed_);
|
| +}
|
| +
|
| +void NotificationPromo::WritePrefs(int promo_id,
|
| + double first_view_time,
|
| + int views,
|
| + bool closed) {
|
| base::DictionaryValue* ntp_promo = new base::DictionaryValue;
|
| - ntp_promo->SetDouble(kPrefPromoFirstViewTime, first_view_time_);
|
| - ntp_promo->SetInteger(kPrefPromoViews, views_);
|
| - ntp_promo->SetBoolean(kPrefPromoClosed, closed_);
|
| + ntp_promo->SetDouble(kPrefPromoFirstViewTime, first_view_time);
|
| + ntp_promo->SetInteger(kPrefPromoViews, views);
|
| + ntp_promo->SetBoolean(kPrefPromoClosed, closed);
|
|
|
| base::DictionaryValue promo_dict;
|
| promo_dict.MergeDictionary(local_state_->GetDictionary(kPrefPromoObject));
|
| - promo_dict.Set(base::IntToString(promo_id_), ntp_promo);
|
| + promo_dict.Set(base::IntToString(promo_id), ntp_promo);
|
| local_state_->Set(kPrefPromoObject, promo_dict);
|
| DVLOG(1) << "WritePrefs " << promo_dict;
|
| }
|
| @@ -150,6 +158,10 @@ void NotificationPromo::WritePrefs() {
|
| void NotificationPromo::InitFromPrefs(PromoType promo_type) {
|
| promo_type_ = promo_type;
|
|
|
| + // Check if data is stored in the old prefs structure, and migrate it before
|
| + // reading from prefs.
|
| + MigrateOldPrefs();
|
| +
|
| // If |promo_id_| is not set, do nothing.
|
| if (promo_id_ == -1)
|
| return;
|
| @@ -169,6 +181,48 @@ void NotificationPromo::InitFromPrefs(PromoType promo_type) {
|
| ntp_promo->GetBoolean(kPrefPromoClosed, &closed_);
|
| }
|
|
|
| +void NotificationPromo::MigrateOldPrefs() {
|
| + const base::DictionaryValue* promo_dict =
|
| + local_state_->GetDictionary(kPrefPromoObject);
|
| + if (!promo_dict)
|
| + return;
|
| +
|
| + const base::ListValue* promo_list = NULL;
|
| + promo_dict->GetList("mobile_ntp_whats_new_promo", &promo_list);
|
| + if (!promo_list)
|
| + return;
|
| +
|
| + const base::DictionaryValue* ntp_promo = NULL;
|
| + promo_list->GetDictionary(0, &ntp_promo);
|
| + if (!ntp_promo) {
|
| + // If the list is saved but there is no promo dictionary, clear prefs to
|
| + // delete the empty list.
|
| + NotificationPromo::MigrateUserPrefs(local_state_);
|
| + return;
|
| + }
|
| +
|
| + int promo_id = -1;
|
| + ntp_promo->GetInteger(kPrefPromoID, &promo_id);
|
| + if (promo_id == -1) {
|
| + // If there is no promo id saved in prefs, then data is corrupt and the
|
| + // prefs can be discarded.
|
| + NotificationPromo::MigrateUserPrefs(local_state_);
|
| + return;
|
| + }
|
| +
|
| + double first_view_time = 0;
|
| + ntp_promo->GetDouble(kPrefPromoFirstViewTime, &first_view_time);
|
| + int views = 0;
|
| + ntp_promo->GetInteger(kPrefPromoViews, &views);
|
| + bool closed = false;
|
| + ntp_promo->GetBoolean(kPrefPromoClosed, &closed);
|
| +
|
| + // Clear prefs to discard the old structure before saving the data in the new
|
| + // structure.
|
| + NotificationPromo::MigrateUserPrefs(local_state_);
|
| + WritePrefs(promo_id, first_view_time, views, closed);
|
| +}
|
| +
|
| bool NotificationPromo::CanShow() const {
|
| return !closed_ && !promo_text_.empty() && !ExceedsMaxViews() &&
|
| !ExceedsMaxSeconds() &&
|
|
|