1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
// 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.
#ifndef CHROME_BROWSER_NOTIFICATIONS_EXTENSION_WELCOME_NOTIFICATION_H_
#define CHROME_BROWSER_NOTIFICATIONS_EXTENSION_WELCOME_NOTIFICATION_H_
#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 "components/keyed_service/core/keyed_service.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 keyed service which 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 KeyedService,
public PrefServiceSyncableObserver {
public:
// Allows for overriding global calls.
class Delegate {
public:
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;
private:
DISALLOW_COPY_AND_ASSIGN(Delegate);
};
// Requested time from showing the welcome notification to expiration.
static const int kRequestedShowTimeDays;
// The extension Id associated with the Google Now extension.
static const char kChromeNowExtensionID[];
~ExtensionWelcomeNotification() override;
// To workaround the lack of delegating constructors prior to C++11, we use
// static Create methods.
// Creates an ExtensionWelcomeNotification with the default delegate.
static ExtensionWelcomeNotification* Create(Profile* const profile);
// Creates an ExtensionWelcomeNotification with the specified delegate.
static ExtensionWelcomeNotification* Create(Profile* const profile,
Delegate* const delegate);
// PrefServiceSyncableObserver
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);
private:
enum PopUpRequest { POP_UP_HIDDEN = 0, POP_UP_SHOWN = 1, };
ExtensionWelcomeNotification(
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> >
expiration_timer_;
// Delegate for Chrome global calls like base::Time::GetTime() for
// testability.
scoped_ptr<Delegate> delegate_;
DISALLOW_COPY_AND_ASSIGN(ExtensionWelcomeNotification);
};
#endif // CHROME_BROWSER_NOTIFICATIONS_EXTENSION_WELCOME_NOTIFICATION_H_
|