15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_WEB_RESOURCE_NOTIFICATION_PROMO_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_WEB_RESOURCE_NOTIFICATION_PROMO_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySimple; 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefService; 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefRegistrySyncable; 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class for PromoResourceService that parses promo notification info 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from json or prefs. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotificationPromo { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static GURL PromoServerURL(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum PromoType { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_PROMO, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NTP_NOTIFICATION_PROMO, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NTP_BUBBLE_PROMO, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOBILE_NTP_SYNC_PROMO, 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MOBILE_NTP_WHATS_NEW_PROMO, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotificationPromo(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~NotificationPromo(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize from json/prefs. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitFromJson(const base::DictionaryValue& json, PromoType promo_type); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitFromPrefs(PromoType promo_type); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can this promo be shown? 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CanShow() const; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculates promo notification start time with group-based time slice 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // offset. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double StartTimeForGroup() const; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double EndTime() const; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helpers for NewTabPageHandler. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mark the promo as closed when the user dismisses it. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void HandleClosed(PromoType promo_type); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mark the promo has having been viewed. This returns true if views 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exceeds the maximum allowed. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool HandleViewed(PromoType promo_type); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool new_notification() const { return new_notification_; } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& promo_text() const { return promo_text_; } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PromoType promo_type() const { return promo_type_; } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* promo_payload() const { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return promo_payload_.get(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Register preferences. 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void RegisterPrefs(PrefRegistrySimple* registry); 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void MigrateUserPrefs(PrefService* user_prefs); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For testing. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class NotificationPromoTest; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if this promo notification is new based on start/end times, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and trigger events accordingly. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckForNewNotification(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Actions on receiving a new promo notification. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnNewNotification(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Flush data members to prefs for storage. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WritePrefs(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests group_ against max_group_. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When max_group_ is 0, all groups pass. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ExceedsMaxGroup() const; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests views_ against max_views_. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When max_views_ is 0, we don't cap the number of views. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ExceedsMaxViews() const; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Tests |first_view_time_| + |max_seconds_| and -now(). 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // When either is 0, we don't cap the number of seconds. 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool ExceedsMaxSeconds() const; 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns false if this promo should not be displayed because it is a promo 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for the app launcher, and the user has already enabled the app launcher. 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool CheckAppLauncher() const; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs_; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PromoType promo_type_; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string promo_text_; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<const base::DictionaryValue> promo_payload_; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double start_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double end_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_groups_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int initial_segment_; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int increment_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int time_slice_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_group_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When max_views_ is 0, we don't cap the number of views. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_views_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // When max_seconds_ is 0 or not set, we don't cap the number of seconds a 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // promo can be visible. 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int max_seconds_; 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Set when the promo is viewed for the first time. 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) double first_view_time_; 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int group_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int views_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool closed_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool new_notification_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NotificationPromo); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_WEB_RESOURCE_NOTIFICATION_PROMO_H_ 143