Chromium Code Reviews| Index: chrome/browser/web_resource/notification_promo.cc |
| =================================================================== |
| --- chrome/browser/web_resource/notification_promo.cc (revision 147498) |
| +++ chrome/browser/web_resource/notification_promo.cc (working copy) |
| @@ -35,14 +35,30 @@ |
| const char promo_server_url[] = "https://clients3.google.com/crsignal/client"; |
| +const char kPrefPromoObject[] = "promo"; |
| +const char kPrefPromoText[] = "text"; |
| #if defined(OS_ANDROID) |
| +const char kPrefPromoTextLong[] = "text_long"; |
| +const char kPrefPromoActionType[] = "action_type"; |
| +const char kPrefPromoActionArgs[] = "action_args"; |
| +#endif |
| +const char kPrefPromoStart[] = "start"; |
| +const char kPrefPromoEnd[] = "end"; |
| +const char kPrefPromoNumGroups[] = "num_groups"; |
| +const char kPrefPromoSegment[] = "segment"; |
| +const char kPrefPromoIncrement[] = "increment"; |
| +const char kPrefPromoIncrementFrequency[] = "increment_frequency"; |
| +const char kPrefPromoIncrementMax[] = "increment_max"; |
| +const char kPrefPromoMaxViews[] = "max_views"; |
| +const char kPrefPromoGroup[] = "group"; |
| +const char kPrefPromoViews[] = "views"; |
| +const char kPrefPromoClosed[] = "closed"; |
| +const char kPrefPromoGPlusRequired[] = "gplus_required"; |
| + |
| +#if defined(OS_ANDROID) |
| const int kCurrentMobilePayloadFormatVersion = 3; |
| #endif // defined(OS_ANDROID) |
| -double GetTimeFromPrefs(PrefService* prefs, const char* pref) { |
| - return prefs->HasPrefPath(pref) ? prefs->GetDouble(pref) : 0.0; |
| -} |
| - |
| // Returns a string suitable for the Promo Server URL 'osname' value. |
| std::string PlatformString() { |
| #if defined(OS_WIN) |
| @@ -89,11 +105,91 @@ |
| } |
| } |
| +void ClearDeprecatedPrefs(PrefService* prefs) { |
|
Robert Sesek
2012/07/23 20:38:50
Add a TODO for when to remove this.
achuithb
2012/07/23 23:12:02
Done.
|
| + prefs->RegisterStringPref(prefs::kNtpPromoLine, |
| + std::string(), |
| + PrefService::UNSYNCABLE_PREF); |
| + prefs->ClearPref(prefs::kNtpPromoLine); |
| +#if defined(OS_ANDROID) |
| + prefs->RegisterStringPref(prefs::kNtpPromoLineLong, |
| + std::string(), |
| + PrefService::UNSYNCABLE_PREF); |
| + prefs->RegisterStringPref(prefs::kNtpPromoActionType, |
| + std::string(), |
| + PrefService::UNSYNCABLE_PREF); |
| + prefs->RegisterListPref(prefs::kNtpPromoActionArgs, |
| + new base::ListValue, |
| + PrefService::UNSYNCABLE_PREF); |
| + prefs->ClearPref(prefs::kNtpPromoLineLong); |
| + prefs->ClearPref(prefs::kNtpPromoActionType); |
| + prefs->ClearPref(prefs::kNtpPromoActionArgs); |
| +#endif // defined(OS_ANDROID) |
| + |
| + prefs->RegisterDoublePref(prefs::kNtpPromoStart, |
| + 0, |
| + PrefService::UNSYNCABLE_PREF); |
| + prefs->RegisterDoublePref(prefs::kNtpPromoEnd, |
| + 0, |
| + PrefService::UNSYNCABLE_PREF); |
| + |
| + prefs->RegisterIntegerPref(prefs::kNtpPromoNumGroups, |
| + 0, |
| + PrefService::UNSYNCABLE_PREF); |
| + prefs->RegisterIntegerPref(prefs::kNtpPromoInitialSegment, |
| + 0, |
| + PrefService::UNSYNCABLE_PREF); |
| + prefs->RegisterIntegerPref(prefs::kNtpPromoIncrement, |
| + 1, |
| + PrefService::UNSYNCABLE_PREF); |
| + prefs->RegisterIntegerPref(prefs::kNtpPromoGroupTimeSlice, |
| + 0, |
| + PrefService::UNSYNCABLE_PREF); |
| + prefs->RegisterIntegerPref(prefs::kNtpPromoGroupMax, |
| + 0, |
| + PrefService::UNSYNCABLE_PREF); |
| + |
| + prefs->RegisterIntegerPref(prefs::kNtpPromoViewsMax, |
| + 0, |
| + PrefService::UNSYNCABLE_PREF); |
| + |
| + prefs->RegisterIntegerPref(prefs::kNtpPromoGroup, |
| + 0, |
| + PrefService::UNSYNCABLE_PREF); |
| + prefs->RegisterIntegerPref(prefs::kNtpPromoViews, |
| + 0, |
| + PrefService::UNSYNCABLE_PREF); |
| + prefs->RegisterBooleanPref(prefs::kNtpPromoClosed, |
| + false, |
| + PrefService::UNSYNCABLE_PREF); |
| + |
| + prefs->RegisterBooleanPref(prefs::kNtpPromoGplusRequired, |
| + false, |
| + PrefService::UNSYNCABLE_PREF); |
| + |
| + prefs->ClearPref(prefs::kNtpPromoStart); |
| + prefs->ClearPref(prefs::kNtpPromoEnd); |
| + prefs->ClearPref(prefs::kNtpPromoNumGroups); |
| + prefs->ClearPref(prefs::kNtpPromoInitialSegment); |
| + prefs->ClearPref(prefs::kNtpPromoIncrement); |
| + prefs->ClearPref(prefs::kNtpPromoGroupTimeSlice); |
| + prefs->ClearPref(prefs::kNtpPromoGroupMax); |
| + prefs->ClearPref(prefs::kNtpPromoViewsMax); |
| + prefs->ClearPref(prefs::kNtpPromoGroup); |
| + prefs->ClearPref(prefs::kNtpPromoViews); |
| + prefs->ClearPref(prefs::kNtpPromoClosed); |
| + prefs->ClearPref(prefs::kNtpPromoGplusRequired); |
| +} |
| + |
| } // namespace |
| +const char NotificationPromo::kNtpNotificationPromoType[] = |
| + "ntp_notification_promo"; |
| +const char NotificationPromo::kBubblePromoType[] = "bubble_promo"; |
| + |
| NotificationPromo::NotificationPromo(Profile* profile) |
| : profile_(profile), |
| prefs_(profile_->GetPrefs()), |
| + promo_type_(kNtpNotificationPromoType), |
| #if defined(OS_ANDROID) |
| promo_action_args_(new base::ListValue), |
| #endif // defined(OS_ANDROID) |
| @@ -119,7 +215,7 @@ |
| void NotificationPromo::InitFromJson(const DictionaryValue& json) { |
| ListValue* promo_list = NULL; |
| #if !defined(OS_ANDROID) |
| - if (!json.GetList("ntp_notification_promo", &promo_list)) |
| + if (!json.GetList(promo_type_, &promo_list)) |
| return; |
| #else |
| if (!json.GetList("mobile_ntp_sync_promo", &promo_list)) { |
| @@ -154,13 +250,13 @@ |
| base::Time::FromString(time_str.c_str(), &time)) { |
| start_ = time.ToDoubleT(); |
| DVLOG(1) << "start str=" << time_str |
| - << ", start_="<< base::DoubleToString(start_); |
| + << ", start_="<< base::DoubleToString(start_); |
| } |
| if (date->GetString("end", &time_str) && |
| base::Time::FromString(time_str.c_str(), &time)) { |
| end_ = time.ToDoubleT(); |
| DVLOG(1) << "end str =" << time_str |
| - << ", end_=" << base::DoubleToString(end_); |
| + << ", end_=" << base::DoubleToString(end_); |
| } |
| } |
| } |
| @@ -245,9 +341,11 @@ |
| } |
| void NotificationPromo::CheckForNewNotification() { |
| - const double old_start = GetTimeFromPrefs(prefs_, prefs::kNtpPromoStart); |
| - const double old_end = GetTimeFromPrefs(prefs_, prefs::kNtpPromoEnd); |
| - const std::string old_promo_text = prefs_->GetString(prefs::kNtpPromoLine); |
| + NotificationPromo old_promo(profile_); |
| + old_promo.InitFromPrefs(); |
| + const double old_start = old_promo.start_; |
| + const double old_end = old_promo.end_; |
| + const std::string old_promo_text = old_promo.promo_text_; |
| new_notification_ = |
| old_start != start_ || old_end != end_ || old_promo_text != promo_text_; |
| @@ -263,152 +361,115 @@ |
| // static |
| void NotificationPromo::RegisterUserPrefs(PrefService* prefs) { |
| - prefs->RegisterStringPref(prefs::kNtpPromoLine, |
| - std::string(), |
| - PrefService::UNSYNCABLE_PREF); |
| + ClearDeprecatedPrefs(prefs); |
| + prefs->RegisterDictionaryPref("promo", |
| + new base::DictionaryValue, |
| + PrefService::UNSYNCABLE_PREF); |
| +} |
| + |
| +void NotificationPromo::WritePrefs() { |
| + DVLOG(1) << "WritePrefs"; |
| + base::DictionaryValue* ntp_promo(new base::DictionaryValue); |
|
Robert Sesek
2012/07/23 20:38:50
nit: I think it's more common to write this as an
achuithb
2012/07/23 23:12:02
Done.
|
| + ntp_promo->SetString(kPrefPromoText, promo_text_); |
| #if defined(OS_ANDROID) |
| - prefs->RegisterStringPref(prefs::kNtpPromoLineLong, |
| - std::string(), |
| - PrefService::UNSYNCABLE_PREF); |
| - prefs->RegisterStringPref(prefs::kNtpPromoActionType, |
| - std::string(), |
| - PrefService::UNSYNCABLE_PREF); |
| - prefs->RegisterListPref(prefs::kNtpPromoActionArgs, |
| - new base::ListValue, |
| - PrefService::UNSYNCABLE_PREF); |
| + ntp_promo->SetString(kPrefPromoTextLong, promo_text_long_); |
| + ntp_promo->SetString(kPrefPromoActionType, promo_action_type_); |
| + DCHECK(promo_action_args_.get()); |
| + ntp_promo->Set(kPrefPromoActionArgs, promo_action_args_->DeepCopy()); |
| #endif // defined(OS_ANDROID) |
| + ntp_promo->SetDouble(kPrefPromoStart, start_); |
| + ntp_promo->SetDouble(kPrefPromoEnd, end_); |
| - prefs->RegisterDoublePref(prefs::kNtpPromoStart, |
| - 0, |
| - PrefService::UNSYNCABLE_PREF); |
| - prefs->RegisterDoublePref(prefs::kNtpPromoEnd, |
| - 0, |
| - PrefService::UNSYNCABLE_PREF); |
| + ntp_promo->SetInteger(kPrefPromoNumGroups, num_groups_); |
| + ntp_promo->SetInteger(kPrefPromoSegment, initial_segment_); |
| + ntp_promo->SetInteger(kPrefPromoIncrement, increment_); |
| + ntp_promo->SetInteger(kPrefPromoIncrementFrequency, time_slice_); |
| + ntp_promo->SetInteger(kPrefPromoIncrementMax, max_group_); |
| - prefs->RegisterIntegerPref(prefs::kNtpPromoNumGroups, |
| - 0, |
| - PrefService::UNSYNCABLE_PREF); |
| - prefs->RegisterIntegerPref(prefs::kNtpPromoInitialSegment, |
| - 0, |
| - PrefService::UNSYNCABLE_PREF); |
| - prefs->RegisterIntegerPref(prefs::kNtpPromoIncrement, |
| - 1, |
| - PrefService::UNSYNCABLE_PREF); |
| - prefs->RegisterIntegerPref(prefs::kNtpPromoGroupTimeSlice, |
| - 0, |
| - PrefService::UNSYNCABLE_PREF); |
| - prefs->RegisterIntegerPref(prefs::kNtpPromoGroupMax, |
| - 0, |
| - PrefService::UNSYNCABLE_PREF); |
| + ntp_promo->SetInteger(kPrefPromoMaxViews, max_views_); |
| - prefs->RegisterIntegerPref(prefs::kNtpPromoViewsMax, |
| - 0, |
| - PrefService::UNSYNCABLE_PREF); |
| + ntp_promo->SetInteger(kPrefPromoGroup, group_); |
| + ntp_promo->SetInteger(kPrefPromoViews, views_); |
| + ntp_promo->SetBoolean(kPrefPromoClosed, closed_); |
| - prefs->RegisterIntegerPref(prefs::kNtpPromoGroup, |
| - 0, |
| - PrefService::UNSYNCABLE_PREF); |
| - prefs->RegisterIntegerPref(prefs::kNtpPromoViews, |
| - 0, |
| - PrefService::UNSYNCABLE_PREF); |
| - prefs->RegisterBooleanPref(prefs::kNtpPromoClosed, |
| - false, |
| - PrefService::UNSYNCABLE_PREF); |
| + ntp_promo->SetBoolean(kPrefPromoGPlusRequired, gplus_required_); |
| - prefs->RegisterBooleanPref(prefs::kNtpPromoGplusRequired, |
| - false, |
| - PrefService::UNSYNCABLE_PREF); |
| + base::ListValue* promo_list(new base::ListValue); |
|
Robert Sesek
2012/07/23 20:38:50
nit: here too
achuithb
2012/07/23 23:12:02
Done.
|
| + promo_list->Set(0, ntp_promo); // Only support 1 promo for now. |
| - // TODO(achuith): Delete this in M22. |
| - prefs->RegisterIntegerPref(prefs::kNtpPromoBuild, |
| - 0, |
| - PrefService::UNSYNCABLE_PREF); |
| - prefs->RegisterIntegerPref(prefs::kNtpPromoPlatform, |
| - 0, |
| - PrefService::UNSYNCABLE_PREF); |
| - prefs->ClearPref(prefs::kNtpPromoBuild); |
| - prefs->ClearPref(prefs::kNtpPromoPlatform); |
| + base::DictionaryValue promo_dict; |
| + promo_dict.Set(promo_type_, promo_list); |
| + prefs_->Set(kPrefPromoObject, promo_dict); |
| } |
| -void NotificationPromo::WritePrefs() { |
| - prefs_->SetString(prefs::kNtpPromoLine, promo_text_); |
| -#if defined(OS_ANDROID) |
| - prefs_->SetString(prefs::kNtpPromoLineLong, promo_text_long_); |
| - prefs_->SetString(prefs::kNtpPromoActionType, promo_action_type_); |
| - DCHECK(promo_action_args_.get() != NULL); |
| - prefs_->Set(prefs::kNtpPromoActionArgs, *promo_action_args_.get()); |
| -#endif // defined(OS_ANDROID) |
| +void NotificationPromo::InitFromPrefs() { |
| + const base::DictionaryValue* promo_dict = |
| + prefs_->GetDictionary(kPrefPromoObject); |
| + if (!promo_dict) |
| + return; |
| - prefs_->SetDouble(prefs::kNtpPromoStart, start_); |
| - prefs_->SetDouble(prefs::kNtpPromoEnd, end_); |
| + base::ListValue* promo_list(NULL); |
| + promo_dict->GetList(promo_type_, &promo_list); |
| + if (!promo_list) |
| + return; |
| - prefs_->SetInteger(prefs::kNtpPromoNumGroups, num_groups_); |
| - prefs_->SetInteger(prefs::kNtpPromoInitialSegment, initial_segment_); |
| - prefs_->SetInteger(prefs::kNtpPromoIncrement, increment_); |
| - prefs_->SetInteger(prefs::kNtpPromoGroupTimeSlice, time_slice_); |
| - prefs_->SetInteger(prefs::kNtpPromoGroupMax, max_group_); |
| + base::DictionaryValue* ntp_promo(NULL); |
| + promo_list->GetDictionary(0, &ntp_promo); |
| + if (!ntp_promo) |
| + return; |
| - prefs_->SetInteger(prefs::kNtpPromoViewsMax, max_views_); |
| - |
| - prefs_->SetInteger(prefs::kNtpPromoGroup, group_); |
| - prefs_->SetInteger(prefs::kNtpPromoViews, views_); |
| - prefs_->SetBoolean(prefs::kNtpPromoClosed, closed_); |
| - |
| - prefs_->SetBoolean(prefs::kNtpPromoGplusRequired, gplus_required_); |
| -} |
| - |
| -void NotificationPromo::InitFromPrefs() { |
| - promo_text_ = prefs_->GetString(prefs::kNtpPromoLine); |
| + ntp_promo->GetString(kPrefPromoText, &promo_text_); |
| #if defined(OS_ANDROID) |
| - promo_text_long_ = prefs_->GetString(prefs::kNtpPromoLineLong); |
| - promo_action_type_ = prefs_->GetString(prefs::kNtpPromoActionType); |
| - const base::ListValue* lv = prefs_->GetList(prefs::kNtpPromoActionArgs); |
| + ntp_promo->GetString(kPrefPromoTextLong, &promo_text_long_); |
| + ntp_promo->GetString(kPrefPromoActionType, &promo_action_type_); |
| + base::ListValue* lv(NULL); |
| + ntp_promo->GetList(kPrefPromoActionArgs, &lv); |
| DCHECK(lv != NULL); |
| promo_action_args_.reset(lv->DeepCopy()); |
| #endif // defined(OS_ANDROID) |
| - start_ = prefs_->GetDouble(prefs::kNtpPromoStart); |
| - end_ = prefs_->GetDouble(prefs::kNtpPromoEnd); |
| + ntp_promo->GetDouble(kPrefPromoStart, &start_); |
| + ntp_promo->GetDouble(kPrefPromoEnd, &end_); |
| - num_groups_ = prefs_->GetInteger(prefs::kNtpPromoNumGroups); |
| - initial_segment_ = prefs_->GetInteger(prefs::kNtpPromoInitialSegment); |
| - increment_ = prefs_->GetInteger(prefs::kNtpPromoIncrement); |
| - time_slice_ = prefs_->GetInteger(prefs::kNtpPromoGroupTimeSlice); |
| - max_group_ = prefs_->GetInteger(prefs::kNtpPromoGroupMax); |
| + ntp_promo->GetInteger(kPrefPromoNumGroups, &num_groups_); |
| + ntp_promo->GetInteger(kPrefPromoSegment, &initial_segment_); |
| + ntp_promo->GetInteger(kPrefPromoIncrement, &increment_); |
| + ntp_promo->GetInteger(kPrefPromoIncrementFrequency, &time_slice_); |
| + ntp_promo->GetInteger(kPrefPromoIncrementMax, &max_group_); |
| - max_views_ = prefs_->GetInteger(prefs::kNtpPromoViewsMax); |
| + ntp_promo->GetInteger(kPrefPromoMaxViews, &max_views_); |
| - group_ = prefs_->GetInteger(prefs::kNtpPromoGroup); |
| - views_ = prefs_->GetInteger(prefs::kNtpPromoViews); |
| - closed_ = prefs_->GetBoolean(prefs::kNtpPromoClosed); |
| + ntp_promo->GetInteger(kPrefPromoGroup, &group_); |
| + ntp_promo->GetInteger(kPrefPromoViews, &views_); |
| + ntp_promo->GetBoolean(kPrefPromoClosed, &closed_); |
| - gplus_required_ = prefs_->GetBoolean(prefs::kNtpPromoGplusRequired); |
| + ntp_promo->GetBoolean(kPrefPromoGPlusRequired, &gplus_required_); |
| } |
| bool NotificationPromo::CanShow() const { |
| return !closed_ && |
| - !promo_text_.empty() && |
| - !ExceedsMaxGroup() && |
| - !ExceedsMaxViews() && |
| - base::Time::FromDoubleT(StartTimeForGroup()) < base::Time::Now() && |
| - base::Time::FromDoubleT(EndTime()) > base::Time::Now() && |
| - IsGPlusRequired(); |
| + !promo_text_.empty() && |
| + !ExceedsMaxGroup() && |
| + !ExceedsMaxViews() && |
| + base::Time::FromDoubleT(StartTimeForGroup()) < base::Time::Now() && |
| + base::Time::FromDoubleT(EndTime()) > base::Time::Now() && |
| + IsGPlusRequired(); |
| } |
| void NotificationPromo::HandleClosed() { |
| content::RecordAction(UserMetricsAction("NTPPromoClosed")); |
| - prefs_->SetBoolean(prefs::kNtpPromoClosed, true); |
| + InitFromPrefs(); |
| + if (!closed_) { |
| + closed_ = true; |
| + WritePrefs(); |
| + } |
| } |
| bool NotificationPromo::HandleViewed() { |
| content::RecordAction(UserMetricsAction("NTPPromoShown")); |
| - if (prefs_->HasPrefPath(prefs::kNtpPromoViewsMax)) |
| - max_views_ = prefs_->GetInteger(prefs::kNtpPromoViewsMax); |
| - |
| - if (prefs_->HasPrefPath(prefs::kNtpPromoViews)) |
| - views_ = prefs_->GetInteger(prefs::kNtpPromoViews); |
| - |
| - prefs_->SetInteger(prefs::kNtpPromoViews, ++views_); |
| + InitFromPrefs(); |
| + ++views_; |
| + WritePrefs(); |
| return ExceedsMaxViews(); |
| } |