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 new_notification()63 bool new_notification() const { return new_notification_; } 64 promo_text()65 const std::string& promo_text() const { return promo_text_; } promo_type()66 PromoType promo_type() const { return promo_type_; } promo_payload()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_ 131