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