notification_promo.h revision 116680a4aac90f2aa7413d9095a592090648e557
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)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns false if this promo should not be displayed because it is a promo
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for the app launcher, and the user has already enabled the app launcher.
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CheckAppLauncher() const;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs_;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PromoType promo_type_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string promo_text_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<const base::DictionaryValue> promo_payload_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double start_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double end_;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_groups_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int initial_segment_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int increment_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int time_slice_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_group_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When max_views_ is 0, we don't cap the number of views.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_views_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int group_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int views_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool closed_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool new_notification_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NotificationPromo);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_WEB_RESOURCE_NOTIFICATION_PROMO_H_
132