notification_promo.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefService;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class for PromoResourceService that parses promo notification info
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from json or prefs.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotificationPromo {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GURL PromoServerURL();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum PromoType {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NO_PROMO,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NTP_NOTIFICATION_PROMO,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NTP_BUBBLE_PROMO,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MOBILE_NTP_SYNC_PROMO,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit NotificationPromo(Profile* profile);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~NotificationPromo();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize from json/prefs.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitFromJson(const base::DictionaryValue& json, PromoType promo_type);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitFromPrefs(PromoType promo_type);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can this promo be shown?
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CanShow() const;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calculates promo notification start time with group-based time slice
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // offset.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double StartTimeForGroup() const;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double EndTime() const;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helpers for NewTabPageHandler.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark the promo as closed when the user dismisses it.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void HandleClosed(Profile* profile, PromoType promo_type);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark the promo has having been viewed. This returns true if views
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exceeds the maximum allowed.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool HandleViewed(Profile* profile, PromoType promo_type);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool new_notification() const { return new_notification_; }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& promo_text() const { return promo_text_; }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PromoType promo_type() const { return promo_type_; }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::DictionaryValue* promo_payload() const {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return promo_payload_.get();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register preferences.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterUserPrefs(PrefService* prefs);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For testing.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class NotificationPromoTest;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if this promo notification is new based on start/end times,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and trigger events accordingly.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckForNewNotification();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Actions on receiving a new promo notification.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnNewNotification();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Flush data members to prefs for storage.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WritePrefs();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests group_ against max_group_.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When max_group_ is 0, all groups pass.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ExceedsMaxGroup() const;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests views_ against max_views_.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When max_views_ is 0, we don't cap the number of views.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ExceedsMaxViews() const;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if this promo is not targeted to G+ users, or if this is a G+ user.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsGPlusRequired() const;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PromoType promo_type_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string promo_text_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that promo_payload_ isn't currently used for desktop promos.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<const base::DictionaryValue> promo_payload_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double start_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double end_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_groups_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int initial_segment_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int increment_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int time_slice_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_group_;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When max_views_ is 0, we don't cap the number of views.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_views_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int group_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int views_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool closed_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool gplus_required_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool new_notification_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NotificationPromo);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_WEB_RESOURCE_NOTIFICATION_PROMO_H_
128