blob: 65bdea032b04c0da634425f3644cc9f585c6525c [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <string>
#include "base/memory/scoped_ptr.h"
#include "base/prefs/pref_member.h"
#include "base/timer/timer.h"
#include "chrome/browser/prefs/pref_service_syncable_observer.h"
#include "ui/message_center/notifier_settings.h"
namespace base {
typedef Callback<void(void)> Closure;
namespace message_center {
class MessageCenter;
namespace tracked_objects {
class Location;
namespace user_prefs {
class PrefRegistrySyncable;
class Notification;
class Profile;
// ExtensionWelcomeNotification is a part of DesktopNotificationService and
// manages showing and hiding a welcome notification for built-in components
// that show notifications. The Welcome Notification presumes network
// connectivity since it relies on synced preferences to work. This is generally
// fine since the current consumers on the welcome notification also presume
// network connectivity.
// This class expects to be created and called from the UI thread.
class ExtensionWelcomeNotification : public PrefServiceSyncableObserver {
// Allows for overriding global calls.
class Delegate {
Delegate() {}
virtual ~Delegate() {}
virtual message_center::MessageCenter* GetMessageCenter() = 0;
virtual base::Time GetCurrentTime() = 0;
virtual void PostTask(
const tracked_objects::Location& from_here,
const base::Closure& task) = 0;
// Requested time from showing the welcome notification to expiration.
static const int kRequestedShowTimeDays;
virtual ~ExtensionWelcomeNotification();
// To workaround the lack of delegating constructors prior to C++11, we use
// static Create methods.
// Creates an ExtensionWelcomeNotification owned by the specified
// extension id with the default delegate.
static scoped_ptr<ExtensionWelcomeNotification> Create(
const std::string& extension_id,
Profile* const profile);
// Creates an ExtensionWelcomeNotification owned by the specified
// extension id with the specified delegate.
static scoped_ptr<ExtensionWelcomeNotification> Create(
const std::string& extension_id,
Profile* const profile,
Delegate* const delegate);
// PrefServiceSyncableObserver
virtual void OnIsSyncingChanged() OVERRIDE;
// Adds in the welcome notification if required for components built
// into Chrome that show notifications like Chrome Now.
void ShowWelcomeNotificationIfNecessary(const Notification& notification);
// Handles Preference Registration for the Welcome Notification.
static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* prefs);
enum PopUpRequest { POP_UP_HIDDEN = 0, POP_UP_SHOWN = 1, };
const std::string& extension_id,
Profile* const profile,
ExtensionWelcomeNotification::Delegate* const delegate);
// Gets the message center from the delegate.
message_center::MessageCenter* GetMessageCenter() const;
// Unconditionally shows the welcome notification.
void ShowWelcomeNotification(const base::string16& display_source,
const PopUpRequest pop_up_request);
// Hides the welcome notification.
void HideWelcomeNotification();
// Whether the notification has been dismissed.
bool UserHasDismissedWelcomeNotification() const;
// Called when the Welcome Notification Dismissed pref has been changed.
void OnWelcomeNotificationDismissedChanged();
// Starts the welcome notification expiration timer.
void StartExpirationTimer();
// Stops the welcome notification expiration timer.
void StopExpirationTimer();
// Expires the welcome notification by hiding it and marking it dismissed.
void ExpireWelcomeNotification();
// Gets the expiration timestamp or a null time is there is none.
base::Time GetExpirationTimestamp() const;
// Sets the expiration timestamp from now.
void SetExpirationTimestampFromNow();
// True if the welcome notification has expired, false otherwise.
bool IsWelcomeNotificationExpired() const;
// Prefs listener for welcome_notification_dismissed.
BooleanPrefMember welcome_notification_dismissed_pref_;
// Prefs listener for welcome_notification_dismissed_local.
// Dismissal flag migrated from a synced pref to a local one.
BooleanPrefMember welcome_notification_dismissed_local_pref_;
// The notifier for the extension that we're listening for.
message_center::NotifierId notifier_id_;
// The profile which owns this object.
Profile* profile_;
// Notification ID of the Welcome Notification.
std::string welcome_notification_id_;
// If the preferences are still syncing, store the last notification here
// so we can replay ShowWelcomeNotificationIfNecessary once the sync finishes.
// Simplifying Assumption: The delayed notification has passed the
// extension ID check. This means we do not need to store all of the
// notifications that may also show a welcome notification.
scoped_ptr<Notification> delayed_notification_;
// If the welcome notification is shown, this timer tracks when to hide the
// welcome notification.
scoped_ptr<base::OneShotTimer<ExtensionWelcomeNotification> >
// Delegate for Chrome global calls like base::Time::GetTime() for
// testability.
scoped_ptr<Delegate> delegate_;