notification_promo.h revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotificationPromo();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~NotificationPromo();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize from json/prefs.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitFromJson(const base::DictionaryValue& json, PromoType promo_type);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitFromPrefs(PromoType promo_type);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can this promo be shown?
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CanShow() const;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calculates promo notification start time with group-based time slice
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // offset.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double StartTimeForGroup() const;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double EndTime() const;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helpers for NewTabPageHandler.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark the promo as closed when the user dismisses it.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void HandleClosed(PromoType promo_type);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark the promo has having been viewed. This returns true if views
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exceeds the maximum allowed.
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool HandleViewed(PromoType promo_type);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool new_notification() const { return new_notification_; }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& promo_text() const { return promo_text_; }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PromoType promo_type() const { return promo_type_; }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::DictionaryValue* promo_payload() const {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return promo_payload_.get();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register preferences.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void RegisterPrefs(PrefRegistrySimple* registry);
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static void RegisterUserPrefs(user_prefs::PrefRegistrySyncable* registry);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void MigrateUserPrefs(PrefService* user_prefs);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For testing.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class NotificationPromoTest;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if this promo notification is new based on start/end times,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and trigger events accordingly.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckForNewNotification();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Actions on receiving a new promo notification.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnNewNotification();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Flush data members to prefs for storage.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WritePrefs();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests group_ against max_group_.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When max_group_ is 0, all groups pass.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ExceedsMaxGroup() const;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests views_ against max_views_.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When max_views_ is 0, we don't cap the number of views.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ExceedsMaxViews() const;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns false if this promo should not be displayed because it is a promo
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for the app launcher, and the user has already enabled the app launcher.
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CheckAppLauncher() const;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PromoType promo_type_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string promo_text_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<const base::DictionaryValue> promo_payload_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double start_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double end_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_groups_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int initial_segment_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int increment_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int time_slice_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_group_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When max_views_ is 0, we don't cap the number of views.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_views_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int group_;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int views_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool closed_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool new_notification_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NotificationPromo);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_WEB_RESOURCE_NOTIFICATION_PROMO_H_
131