Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(221)

Side by Side Diff: chrome/browser/web_resource/notification_promo.cc

Issue 10790089: Preferences support for multiple promos. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/web_resource/notification_promo.h" 5 #include "chrome/browser/web_resource/notification_promo.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 17 matching lines...) Expand all
28 #endif // defined(OS_ANDROID) 28 #endif // defined(OS_ANDROID)
29 29
30 using content::UserMetricsAction; 30 using content::UserMetricsAction;
31 31
32 namespace { 32 namespace {
33 33
34 const int kDefaultGroupSize = 100; 34 const int kDefaultGroupSize = 100;
35 35
36 const char promo_server_url[] = "https://clients3.google.com/crsignal/client"; 36 const char promo_server_url[] = "https://clients3.google.com/crsignal/client";
37 37
38 const char kPrefPromoObject[] = "promo";
39 const char kPrefPromoText[] = "text";
40 #if defined(OS_ANDROID)
41 const char kPrefPromoTextLong[] = "text_long";
42 const char kPrefPromoActionType[] = "action_type";
43 const char kPrefPromoActionArgs[] = "action_args";
44 #endif
45 const char kPrefPromoStart[] = "start";
46 const char kPrefPromoEnd[] = "end";
47 const char kPrefPromoNumGroups[] = "num_groups";
48 const char kPrefPromoSegment[] = "segment";
49 const char kPrefPromoIncrement[] = "increment";
50 const char kPrefPromoIncrementFrequency[] = "increment_frequency";
51 const char kPrefPromoIncrementMax[] = "increment_max";
52 const char kPrefPromoMaxViews[] = "max_views";
53 const char kPrefPromoGroup[] = "group";
54 const char kPrefPromoViews[] = "views";
55 const char kPrefPromoClosed[] = "closed";
56 const char kPrefPromoGPlusRequired[] = "gplus_required";
57
38 #if defined(OS_ANDROID) 58 #if defined(OS_ANDROID)
39 const int kCurrentMobilePayloadFormatVersion = 3; 59 const int kCurrentMobilePayloadFormatVersion = 3;
40 #endif // defined(OS_ANDROID) 60 #endif // defined(OS_ANDROID)
41 61
42 double GetTimeFromPrefs(PrefService* prefs, const char* pref) {
43 return prefs->HasPrefPath(pref) ? prefs->GetDouble(pref) : 0.0;
44 }
45
46 // Returns a string suitable for the Promo Server URL 'osname' value. 62 // Returns a string suitable for the Promo Server URL 'osname' value.
47 std::string PlatformString() { 63 std::string PlatformString() {
48 #if defined(OS_WIN) 64 #if defined(OS_WIN)
49 return "win"; 65 return "win";
50 #elif defined(OS_IOS) 66 #elif defined(OS_IOS)
51 // TODO(noyau): add iOS-specific implementation 67 // TODO(noyau): add iOS-specific implementation
52 const bool isTablet = false; 68 const bool isTablet = false;
53 return std::string("ios-") + (isTablet ? "tablet" : "phone"); 69 return std::string("ios-") + (isTablet ? "tablet" : "phone");
54 #elif defined(OS_MACOSX) 70 #elif defined(OS_MACOSX)
55 return "mac"; 71 return "mac";
(...skipping 26 matching lines...) Expand all
82 return "dev"; 98 return "dev";
83 case chrome::VersionInfo::CHANNEL_BETA: 99 case chrome::VersionInfo::CHANNEL_BETA:
84 return "beta"; 100 return "beta";
85 case chrome::VersionInfo::CHANNEL_STABLE: 101 case chrome::VersionInfo::CHANNEL_STABLE:
86 return "stable"; 102 return "stable";
87 default: 103 default:
88 return "none"; 104 return "none";
89 } 105 }
90 } 106 }
91 107
108 // TODO(achuith): remove this in m23.
109 void ClearDeprecatedPrefs(PrefService* prefs) {
110 prefs->RegisterStringPref(prefs::kNtpPromoLine,
111 std::string(),
112 PrefService::UNSYNCABLE_PREF);
113 prefs->ClearPref(prefs::kNtpPromoLine);
114 #if defined(OS_ANDROID)
115 prefs->RegisterStringPref(prefs::kNtpPromoLineLong,
116 std::string(),
117 PrefService::UNSYNCABLE_PREF);
118 prefs->RegisterStringPref(prefs::kNtpPromoActionType,
119 std::string(),
120 PrefService::UNSYNCABLE_PREF);
121 prefs->RegisterListPref(prefs::kNtpPromoActionArgs,
122 new base::ListValue,
123 PrefService::UNSYNCABLE_PREF);
124 prefs->ClearPref(prefs::kNtpPromoLineLong);
125 prefs->ClearPref(prefs::kNtpPromoActionType);
126 prefs->ClearPref(prefs::kNtpPromoActionArgs);
127 #endif // defined(OS_ANDROID)
128
129 prefs->RegisterDoublePref(prefs::kNtpPromoStart,
130 0,
131 PrefService::UNSYNCABLE_PREF);
132 prefs->RegisterDoublePref(prefs::kNtpPromoEnd,
133 0,
134 PrefService::UNSYNCABLE_PREF);
135
136 prefs->RegisterIntegerPref(prefs::kNtpPromoNumGroups,
137 0,
138 PrefService::UNSYNCABLE_PREF);
139 prefs->RegisterIntegerPref(prefs::kNtpPromoInitialSegment,
140 0,
141 PrefService::UNSYNCABLE_PREF);
142 prefs->RegisterIntegerPref(prefs::kNtpPromoIncrement,
143 1,
144 PrefService::UNSYNCABLE_PREF);
145 prefs->RegisterIntegerPref(prefs::kNtpPromoGroupTimeSlice,
146 0,
147 PrefService::UNSYNCABLE_PREF);
148 prefs->RegisterIntegerPref(prefs::kNtpPromoGroupMax,
149 0,
150 PrefService::UNSYNCABLE_PREF);
151
152 prefs->RegisterIntegerPref(prefs::kNtpPromoViewsMax,
153 0,
154 PrefService::UNSYNCABLE_PREF);
155
156 prefs->RegisterIntegerPref(prefs::kNtpPromoGroup,
157 0,
158 PrefService::UNSYNCABLE_PREF);
159 prefs->RegisterIntegerPref(prefs::kNtpPromoViews,
160 0,
161 PrefService::UNSYNCABLE_PREF);
162 prefs->RegisterBooleanPref(prefs::kNtpPromoClosed,
163 false,
164 PrefService::UNSYNCABLE_PREF);
165
166 prefs->RegisterBooleanPref(prefs::kNtpPromoGplusRequired,
167 false,
168 PrefService::UNSYNCABLE_PREF);
169
170 prefs->ClearPref(prefs::kNtpPromoStart);
171 prefs->ClearPref(prefs::kNtpPromoEnd);
172 prefs->ClearPref(prefs::kNtpPromoNumGroups);
173 prefs->ClearPref(prefs::kNtpPromoInitialSegment);
174 prefs->ClearPref(prefs::kNtpPromoIncrement);
175 prefs->ClearPref(prefs::kNtpPromoGroupTimeSlice);
176 prefs->ClearPref(prefs::kNtpPromoGroupMax);
177 prefs->ClearPref(prefs::kNtpPromoViewsMax);
178 prefs->ClearPref(prefs::kNtpPromoGroup);
179 prefs->ClearPref(prefs::kNtpPromoViews);
180 prefs->ClearPref(prefs::kNtpPromoClosed);
181 prefs->ClearPref(prefs::kNtpPromoGplusRequired);
182 }
183
92 } // namespace 184 } // namespace
93 185
186 const char NotificationPromo::kNtpNotificationPromoType[] =
187 "ntp_notification_promo";
188 const char NotificationPromo::kBubblePromoType[] = "bubble_promo";
189
94 NotificationPromo::NotificationPromo(Profile* profile) 190 NotificationPromo::NotificationPromo(Profile* profile)
95 : profile_(profile), 191 : profile_(profile),
96 prefs_(profile_->GetPrefs()), 192 prefs_(profile_->GetPrefs()),
193 promo_type_(kNtpNotificationPromoType),
97 #if defined(OS_ANDROID) 194 #if defined(OS_ANDROID)
98 promo_action_args_(new base::ListValue), 195 promo_action_args_(new base::ListValue),
99 #endif // defined(OS_ANDROID) 196 #endif // defined(OS_ANDROID)
100 start_(0.0), 197 start_(0.0),
101 end_(0.0), 198 end_(0.0),
102 num_groups_(kDefaultGroupSize), 199 num_groups_(kDefaultGroupSize),
103 initial_segment_(0), 200 initial_segment_(0),
104 increment_(1), 201 increment_(1),
105 time_slice_(0), 202 time_slice_(0),
106 max_group_(0), 203 max_group_(0),
107 max_views_(0), 204 max_views_(0),
108 group_(0), 205 group_(0),
109 views_(0), 206 views_(0),
110 closed_(false), 207 closed_(false),
111 gplus_required_(false), 208 gplus_required_(false),
112 new_notification_(false) { 209 new_notification_(false) {
113 DCHECK(profile); 210 DCHECK(profile);
114 DCHECK(prefs_); 211 DCHECK(prefs_);
115 } 212 }
116 213
117 NotificationPromo::~NotificationPromo() {} 214 NotificationPromo::~NotificationPromo() {}
118 215
119 void NotificationPromo::InitFromJson(const DictionaryValue& json) { 216 void NotificationPromo::InitFromJson(const DictionaryValue& json) {
120 ListValue* promo_list = NULL; 217 ListValue* promo_list = NULL;
121 #if !defined(OS_ANDROID) 218 #if !defined(OS_ANDROID)
122 if (!json.GetList("ntp_notification_promo", &promo_list)) 219 if (!json.GetList(promo_type_, &promo_list))
123 return; 220 return;
124 #else 221 #else
125 if (!json.GetList("mobile_ntp_sync_promo", &promo_list)) { 222 if (!json.GetList("mobile_ntp_sync_promo", &promo_list)) {
126 LOG(ERROR) << "Malfromed JSON: not a mobile_ntp_sync_promo"; 223 LOG(ERROR) << "Malfromed JSON: not a mobile_ntp_sync_promo";
127 return; 224 return;
128 } 225 }
129 #endif // !defined(OS_ANDROID) 226 #endif // !defined(OS_ANDROID)
130 227
131 // No support for multiple promos yet. Only consider the first one. 228 // No support for multiple promos yet. Only consider the first one.
132 DictionaryValue* promo = NULL; 229 DictionaryValue* promo = NULL;
(...skipping 14 matching lines...) Expand all
147 ListValue* date_list = NULL; 244 ListValue* date_list = NULL;
148 if (promo->GetList("date", &date_list)) { 245 if (promo->GetList("date", &date_list)) {
149 DictionaryValue* date; 246 DictionaryValue* date;
150 if (date_list->GetDictionary(0, &date)) { 247 if (date_list->GetDictionary(0, &date)) {
151 std::string time_str; 248 std::string time_str;
152 base::Time time; 249 base::Time time;
153 if (date->GetString("start", &time_str) && 250 if (date->GetString("start", &time_str) &&
154 base::Time::FromString(time_str.c_str(), &time)) { 251 base::Time::FromString(time_str.c_str(), &time)) {
155 start_ = time.ToDoubleT(); 252 start_ = time.ToDoubleT();
156 DVLOG(1) << "start str=" << time_str 253 DVLOG(1) << "start str=" << time_str
157 << ", start_="<< base::DoubleToString(start_); 254 << ", start_="<< base::DoubleToString(start_);
158 } 255 }
159 if (date->GetString("end", &time_str) && 256 if (date->GetString("end", &time_str) &&
160 base::Time::FromString(time_str.c_str(), &time)) { 257 base::Time::FromString(time_str.c_str(), &time)) {
161 end_ = time.ToDoubleT(); 258 end_ = time.ToDoubleT();
162 DVLOG(1) << "end str =" << time_str 259 DVLOG(1) << "end str =" << time_str
163 << ", end_=" << base::DoubleToString(end_); 260 << ", end_=" << base::DoubleToString(end_);
164 } 261 }
165 } 262 }
166 } 263 }
167 264
168 // Grouping. 265 // Grouping.
169 DictionaryValue* grouping = NULL; 266 DictionaryValue* grouping = NULL;
170 if (promo->GetDictionary("grouping", &grouping)) { 267 if (promo->GetDictionary("grouping", &grouping)) {
171 grouping->GetInteger("buckets", &num_groups_); 268 grouping->GetInteger("buckets", &num_groups_);
172 grouping->GetInteger("segment", &initial_segment_); 269 grouping->GetInteger("segment", &initial_segment_);
173 grouping->GetInteger("increment", &increment_); 270 grouping->GetInteger("increment", &increment_);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 } 335 }
239 promo_action_args_->Append(base::Value::CreateStringValue(value)); 336 promo_action_args_->Append(base::Value::CreateStringValue(value));
240 } 337 }
241 } 338 }
242 #endif // defined(OS_ANDROID) 339 #endif // defined(OS_ANDROID)
243 340
244 CheckForNewNotification(); 341 CheckForNewNotification();
245 } 342 }
246 343
247 void NotificationPromo::CheckForNewNotification() { 344 void NotificationPromo::CheckForNewNotification() {
248 const double old_start = GetTimeFromPrefs(prefs_, prefs::kNtpPromoStart); 345 NotificationPromo old_promo(profile_);
249 const double old_end = GetTimeFromPrefs(prefs_, prefs::kNtpPromoEnd); 346 old_promo.InitFromPrefs();
250 const std::string old_promo_text = prefs_->GetString(prefs::kNtpPromoLine); 347 const double old_start = old_promo.start_;
348 const double old_end = old_promo.end_;
349 const std::string old_promo_text = old_promo.promo_text_;
251 350
252 new_notification_ = 351 new_notification_ =
253 old_start != start_ || old_end != end_ || old_promo_text != promo_text_; 352 old_start != start_ || old_end != end_ || old_promo_text != promo_text_;
254 if (new_notification_) 353 if (new_notification_)
255 OnNewNotification(); 354 OnNewNotification();
256 } 355 }
257 356
258 void NotificationPromo::OnNewNotification() { 357 void NotificationPromo::OnNewNotification() {
259 // Create a new promo group. 358 // Create a new promo group.
260 group_ = base::RandInt(0, num_groups_ - 1); 359 group_ = base::RandInt(0, num_groups_ - 1);
261 WritePrefs(); 360 WritePrefs();
262 } 361 }
263 362
264 // static 363 // static
265 void NotificationPromo::RegisterUserPrefs(PrefService* prefs) { 364 void NotificationPromo::RegisterUserPrefs(PrefService* prefs) {
266 prefs->RegisterStringPref(prefs::kNtpPromoLine, 365 ClearDeprecatedPrefs(prefs);
267 std::string(), 366 prefs->RegisterDictionaryPref("promo",
268 PrefService::UNSYNCABLE_PREF); 367 new base::DictionaryValue,
269 #if defined(OS_ANDROID) 368 PrefService::UNSYNCABLE_PREF);
270 prefs->RegisterStringPref(prefs::kNtpPromoLineLong,
271 std::string(),
272 PrefService::UNSYNCABLE_PREF);
273 prefs->RegisterStringPref(prefs::kNtpPromoActionType,
274 std::string(),
275 PrefService::UNSYNCABLE_PREF);
276 prefs->RegisterListPref(prefs::kNtpPromoActionArgs,
277 new base::ListValue,
278 PrefService::UNSYNCABLE_PREF);
279 #endif // defined(OS_ANDROID)
280
281 prefs->RegisterDoublePref(prefs::kNtpPromoStart,
282 0,
283 PrefService::UNSYNCABLE_PREF);
284 prefs->RegisterDoublePref(prefs::kNtpPromoEnd,
285 0,
286 PrefService::UNSYNCABLE_PREF);
287
288 prefs->RegisterIntegerPref(prefs::kNtpPromoNumGroups,
289 0,
290 PrefService::UNSYNCABLE_PREF);
291 prefs->RegisterIntegerPref(prefs::kNtpPromoInitialSegment,
292 0,
293 PrefService::UNSYNCABLE_PREF);
294 prefs->RegisterIntegerPref(prefs::kNtpPromoIncrement,
295 1,
296 PrefService::UNSYNCABLE_PREF);
297 prefs->RegisterIntegerPref(prefs::kNtpPromoGroupTimeSlice,
298 0,
299 PrefService::UNSYNCABLE_PREF);
300 prefs->RegisterIntegerPref(prefs::kNtpPromoGroupMax,
301 0,
302 PrefService::UNSYNCABLE_PREF);
303
304 prefs->RegisterIntegerPref(prefs::kNtpPromoViewsMax,
305 0,
306 PrefService::UNSYNCABLE_PREF);
307
308 prefs->RegisterIntegerPref(prefs::kNtpPromoGroup,
309 0,
310 PrefService::UNSYNCABLE_PREF);
311 prefs->RegisterIntegerPref(prefs::kNtpPromoViews,
312 0,
313 PrefService::UNSYNCABLE_PREF);
314 prefs->RegisterBooleanPref(prefs::kNtpPromoClosed,
315 false,
316 PrefService::UNSYNCABLE_PREF);
317
318 prefs->RegisterBooleanPref(prefs::kNtpPromoGplusRequired,
319 false,
320 PrefService::UNSYNCABLE_PREF);
321
322 // TODO(achuith): Delete this in M22.
323 prefs->RegisterIntegerPref(prefs::kNtpPromoBuild,
324 0,
325 PrefService::UNSYNCABLE_PREF);
326 prefs->RegisterIntegerPref(prefs::kNtpPromoPlatform,
327 0,
328 PrefService::UNSYNCABLE_PREF);
329 prefs->ClearPref(prefs::kNtpPromoBuild);
330 prefs->ClearPref(prefs::kNtpPromoPlatform);
331 } 369 }
332 370
333 void NotificationPromo::WritePrefs() { 371 void NotificationPromo::WritePrefs() {
334 prefs_->SetString(prefs::kNtpPromoLine, promo_text_); 372 DVLOG(1) << "WritePrefs";
373 base::DictionaryValue* ntp_promo = new base::DictionaryValue;
374 ntp_promo->SetString(kPrefPromoText, promo_text_);
335 #if defined(OS_ANDROID) 375 #if defined(OS_ANDROID)
336 prefs_->SetString(prefs::kNtpPromoLineLong, promo_text_long_); 376 ntp_promo->SetString(kPrefPromoTextLong, promo_text_long_);
337 prefs_->SetString(prefs::kNtpPromoActionType, promo_action_type_); 377 ntp_promo->SetString(kPrefPromoActionType, promo_action_type_);
338 DCHECK(promo_action_args_.get() != NULL); 378 DCHECK(promo_action_args_.get());
339 prefs_->Set(prefs::kNtpPromoActionArgs, *promo_action_args_.get()); 379 ntp_promo->Set(kPrefPromoActionArgs, promo_action_args_->DeepCopy());
340 #endif // defined(OS_ANDROID) 380 #endif // defined(OS_ANDROID)
381 ntp_promo->SetDouble(kPrefPromoStart, start_);
382 ntp_promo->SetDouble(kPrefPromoEnd, end_);
341 383
342 prefs_->SetDouble(prefs::kNtpPromoStart, start_); 384 ntp_promo->SetInteger(kPrefPromoNumGroups, num_groups_);
343 prefs_->SetDouble(prefs::kNtpPromoEnd, end_); 385 ntp_promo->SetInteger(kPrefPromoSegment, initial_segment_);
386 ntp_promo->SetInteger(kPrefPromoIncrement, increment_);
387 ntp_promo->SetInteger(kPrefPromoIncrementFrequency, time_slice_);
388 ntp_promo->SetInteger(kPrefPromoIncrementMax, max_group_);
344 389
345 prefs_->SetInteger(prefs::kNtpPromoNumGroups, num_groups_); 390 ntp_promo->SetInteger(kPrefPromoMaxViews, max_views_);
346 prefs_->SetInteger(prefs::kNtpPromoInitialSegment, initial_segment_);
347 prefs_->SetInteger(prefs::kNtpPromoIncrement, increment_);
348 prefs_->SetInteger(prefs::kNtpPromoGroupTimeSlice, time_slice_);
349 prefs_->SetInteger(prefs::kNtpPromoGroupMax, max_group_);
350 391
351 prefs_->SetInteger(prefs::kNtpPromoViewsMax, max_views_); 392 ntp_promo->SetInteger(kPrefPromoGroup, group_);
393 ntp_promo->SetInteger(kPrefPromoViews, views_);
394 ntp_promo->SetBoolean(kPrefPromoClosed, closed_);
352 395
353 prefs_->SetInteger(prefs::kNtpPromoGroup, group_); 396 ntp_promo->SetBoolean(kPrefPromoGPlusRequired, gplus_required_);
354 prefs_->SetInteger(prefs::kNtpPromoViews, views_);
355 prefs_->SetBoolean(prefs::kNtpPromoClosed, closed_);
356 397
357 prefs_->SetBoolean(prefs::kNtpPromoGplusRequired, gplus_required_); 398 base::ListValue* promo_list = new base::ListValue;
399 promo_list->Set(0, ntp_promo); // Only support 1 promo for now.
400
401 base::DictionaryValue promo_dict;
402 promo_dict.Set(promo_type_, promo_list);
403 prefs_->Set(kPrefPromoObject, promo_dict);
358 } 404 }
359 405
360 void NotificationPromo::InitFromPrefs() { 406 void NotificationPromo::InitFromPrefs() {
361 promo_text_ = prefs_->GetString(prefs::kNtpPromoLine); 407 const base::DictionaryValue* promo_dict =
408 prefs_->GetDictionary(kPrefPromoObject);
409 if (!promo_dict)
410 return;
411
412 base::ListValue* promo_list(NULL);
413 promo_dict->GetList(promo_type_, &promo_list);
414 if (!promo_list)
415 return;
416
417 base::DictionaryValue* ntp_promo(NULL);
418 promo_list->GetDictionary(0, &ntp_promo);
419 if (!ntp_promo)
420 return;
421
422 ntp_promo->GetString(kPrefPromoText, &promo_text_);
362 #if defined(OS_ANDROID) 423 #if defined(OS_ANDROID)
363 promo_text_long_ = prefs_->GetString(prefs::kNtpPromoLineLong); 424 ntp_promo->GetString(kPrefPromoTextLong, &promo_text_long_);
364 promo_action_type_ = prefs_->GetString(prefs::kNtpPromoActionType); 425 ntp_promo->GetString(kPrefPromoActionType, &promo_action_type_);
365 const base::ListValue* lv = prefs_->GetList(prefs::kNtpPromoActionArgs); 426 base::ListValue* lv(NULL);
427 ntp_promo->GetList(kPrefPromoActionArgs, &lv);
366 DCHECK(lv != NULL); 428 DCHECK(lv != NULL);
367 promo_action_args_.reset(lv->DeepCopy()); 429 promo_action_args_.reset(lv->DeepCopy());
368 #endif // defined(OS_ANDROID) 430 #endif // defined(OS_ANDROID)
369 431
370 start_ = prefs_->GetDouble(prefs::kNtpPromoStart); 432 ntp_promo->GetDouble(kPrefPromoStart, &start_);
371 end_ = prefs_->GetDouble(prefs::kNtpPromoEnd); 433 ntp_promo->GetDouble(kPrefPromoEnd, &end_);
372 434
373 num_groups_ = prefs_->GetInteger(prefs::kNtpPromoNumGroups); 435 ntp_promo->GetInteger(kPrefPromoNumGroups, &num_groups_);
374 initial_segment_ = prefs_->GetInteger(prefs::kNtpPromoInitialSegment); 436 ntp_promo->GetInteger(kPrefPromoSegment, &initial_segment_);
375 increment_ = prefs_->GetInteger(prefs::kNtpPromoIncrement); 437 ntp_promo->GetInteger(kPrefPromoIncrement, &increment_);
376 time_slice_ = prefs_->GetInteger(prefs::kNtpPromoGroupTimeSlice); 438 ntp_promo->GetInteger(kPrefPromoIncrementFrequency, &time_slice_);
377 max_group_ = prefs_->GetInteger(prefs::kNtpPromoGroupMax); 439 ntp_promo->GetInteger(kPrefPromoIncrementMax, &max_group_);
378 440
379 max_views_ = prefs_->GetInteger(prefs::kNtpPromoViewsMax); 441 ntp_promo->GetInteger(kPrefPromoMaxViews, &max_views_);
380 442
381 group_ = prefs_->GetInteger(prefs::kNtpPromoGroup); 443 ntp_promo->GetInteger(kPrefPromoGroup, &group_);
382 views_ = prefs_->GetInteger(prefs::kNtpPromoViews); 444 ntp_promo->GetInteger(kPrefPromoViews, &views_);
383 closed_ = prefs_->GetBoolean(prefs::kNtpPromoClosed); 445 ntp_promo->GetBoolean(kPrefPromoClosed, &closed_);
384 446
385 gplus_required_ = prefs_->GetBoolean(prefs::kNtpPromoGplusRequired); 447 ntp_promo->GetBoolean(kPrefPromoGPlusRequired, &gplus_required_);
386 } 448 }
387 449
388 bool NotificationPromo::CanShow() const { 450 bool NotificationPromo::CanShow() const {
389 return !closed_ && 451 return !closed_ &&
390 !promo_text_.empty() && 452 !promo_text_.empty() &&
391 !ExceedsMaxGroup() && 453 !ExceedsMaxGroup() &&
392 !ExceedsMaxViews() && 454 !ExceedsMaxViews() &&
393 base::Time::FromDoubleT(StartTimeForGroup()) < base::Time::Now() && 455 base::Time::FromDoubleT(StartTimeForGroup()) < base::Time::Now() &&
394 base::Time::FromDoubleT(EndTime()) > base::Time::Now() && 456 base::Time::FromDoubleT(EndTime()) > base::Time::Now() &&
395 IsGPlusRequired(); 457 IsGPlusRequired();
396 } 458 }
397 459
398 void NotificationPromo::HandleClosed() { 460 void NotificationPromo::HandleClosed() {
399 content::RecordAction(UserMetricsAction("NTPPromoClosed")); 461 content::RecordAction(UserMetricsAction("NTPPromoClosed"));
400 prefs_->SetBoolean(prefs::kNtpPromoClosed, true); 462 InitFromPrefs();
463 if (!closed_) {
464 closed_ = true;
465 WritePrefs();
466 }
401 } 467 }
402 468
403 bool NotificationPromo::HandleViewed() { 469 bool NotificationPromo::HandleViewed() {
404 content::RecordAction(UserMetricsAction("NTPPromoShown")); 470 content::RecordAction(UserMetricsAction("NTPPromoShown"));
405 if (prefs_->HasPrefPath(prefs::kNtpPromoViewsMax)) 471 InitFromPrefs();
406 max_views_ = prefs_->GetInteger(prefs::kNtpPromoViewsMax); 472 ++views_;
407 473 WritePrefs();
408 if (prefs_->HasPrefPath(prefs::kNtpPromoViews))
409 views_ = prefs_->GetInteger(prefs::kNtpPromoViews);
410
411 prefs_->SetInteger(prefs::kNtpPromoViews, ++views_);
412 return ExceedsMaxViews(); 474 return ExceedsMaxViews();
413 } 475 }
414 476
415 bool NotificationPromo::ExceedsMaxGroup() const { 477 bool NotificationPromo::ExceedsMaxGroup() const {
416 return (max_group_ == 0) ? false : group_ >= max_group_; 478 return (max_group_ == 0) ? false : group_ >= max_group_;
417 } 479 }
418 480
419 bool NotificationPromo::ExceedsMaxViews() const { 481 bool NotificationPromo::ExceedsMaxViews() const {
420 return (max_views_ == 0) ? false : views_ >= max_views_; 482 return (max_views_ == 0) ? false : views_ >= max_views_;
421 } 483 }
(...skipping 20 matching lines...) Expand all
442 if (group_ < initial_segment_) 504 if (group_ < initial_segment_)
443 return start_; 505 return start_;
444 return start_ + 506 return start_ +
445 std::ceil(static_cast<float>(group_ - initial_segment_ + 1) / increment_) 507 std::ceil(static_cast<float>(group_ - initial_segment_ + 1) / increment_)
446 * time_slice_; 508 * time_slice_;
447 } 509 }
448 510
449 double NotificationPromo::EndTime() const { 511 double NotificationPromo::EndTime() const {
450 return end_; 512 return end_;
451 } 513 }
OLDNEW
« no previous file with comments | « chrome/browser/web_resource/notification_promo.h ('k') | chrome/browser/web_resource/promo_resource_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698