1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_WEB_RESOURCE_NOTIFICATION_PROMO_H_
#define CHROME_BROWSER_WEB_RESOURCE_NOTIFICATION_PROMO_H_
#include <string>
#include "base/basictypes.h"
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "url/gurl.h"
class PrefRegistrySimple;
class PrefService;
namespace base {
class DictionaryValue;
class ListValue;
}
namespace user_prefs {
class PrefRegistrySyncable;
}
// Helper class for PromoResourceService that parses promo notification info
// from json or prefs.
class NotificationPromo {
public:
static GURL PromoServerURL();
enum PromoType {
NO_PROMO,
NTP_NOTIFICATION_PROMO,
NTP_BUBBLE_PROMO,
MOBILE_NTP_SYNC_PROMO,
MOBILE_NTP_WHATS_NEW_PROMO,
};
NotificationPromo();
~NotificationPromo();
// Initialize from json/prefs.
void InitFromJson(const base::DictionaryValue& json, PromoType promo_type);
void InitFromPrefs(PromoType promo_type);
// Can this promo be shown?
bool CanShow() const;
// Calculates promo notification start time with group-based time slice
// offset.
double StartTimeForGroup() const;
double EndTime() const;
// Helpers for NewTabPageHandler.
// Mark the promo as closed when the user dismisses it.
static void HandleClosed(PromoType promo_type);
// Mark the promo has having been viewed. This returns true if views
// exceeds the maximum allowed.
static bool HandleViewed(PromoType promo_type);
bool new_notification() const { return new_notification_; }
const std::string& promo_text() const { return promo_text_; }
PromoType promo_type() const { return promo_type_; }
const base::DictionaryValue* promo_payload() const {
return promo_payload_.get();
}
// Register preferences.
static void RegisterPrefs(PrefRegistrySimple* registry);
static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
static void MigrateUserPrefs(PrefService* user_prefs);
private:
// For testing.
friend class NotificationPromoTest;
// Check if this promo notification is new based on start/end times,
// and trigger events accordingly.
void CheckForNewNotification();
// Actions on receiving a new promo notification.
void OnNewNotification();
// Flush data members to prefs for storage.
void WritePrefs();
// Tests group_ against max_group_.
// When max_group_ is 0, all groups pass.
bool ExceedsMaxGroup() const;
// Tests views_ against max_views_.
// When max_views_ is 0, we don't cap the number of views.
bool ExceedsMaxViews() const;
// Tests |first_view_time_| + |max_seconds_| and -now().
// When either is 0, we don't cap the number of seconds.
bool ExceedsMaxSeconds() const;
// Returns false if this promo should not be displayed because it is a promo
// for the app launcher, and the user has already enabled the app launcher.
bool CheckAppLauncher() const;
PrefService* prefs_;
PromoType promo_type_;
std::string promo_text_;
scoped_ptr<const base::DictionaryValue> promo_payload_;
double start_;
double end_;
int num_groups_;
int initial_segment_;
int increment_;
int time_slice_;
int max_group_;
// When max_views_ is 0, we don't cap the number of views.
int max_views_;
// When max_seconds_ is 0 or not set, we don't cap the number of seconds a
// promo can be visible.
int max_seconds_;
// Set when the promo is viewed for the first time.
double first_view_time_;
int group_;
int views_;
bool closed_;
bool new_notification_;
DISALLOW_COPY_AND_ASSIGN(NotificationPromo);
};
#endif // CHROME_BROWSER_WEB_RESOURCE_NOTIFICATION_PROMO_H_
|