miguelg | 23cd2dd7 | 2016-04-21 15:24:03 | [diff] [blame] | 1 | // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #ifndef CHROME_BROWSER_NOTIFICATIONS_NOTIFICATION_DISPLAY_SERVICE_H_ |
| 6 | #define CHROME_BROWSER_NOTIFICATIONS_NOTIFICATION_DISPLAY_SERVICE_H_ |
| 7 | |
miguelg | abf610a | 2017-06-02 17:31:43 | [diff] [blame] | 8 | #include <map> |
miguelg | bfe76835 | 2017-03-20 15:34:31 | [diff] [blame] | 9 | #include <memory> |
miguelg | 23cd2dd7 | 2016-04-21 15:24:03 | [diff] [blame] | 10 | #include <set> |
| 11 | #include <string> |
miguelg | 87e986d | 2016-07-08 18:04:44 | [diff] [blame] | 12 | |
miguelg | bfe76835 | 2017-03-20 15:34:31 | [diff] [blame] | 13 | #include "base/callback_forward.h" |
miguelg | 23cd2dd7 | 2016-04-21 15:24:03 | [diff] [blame] | 14 | #include "base/macros.h" |
Peter Beverloo | ae64ba9 | 2017-09-08 21:02:45 | [diff] [blame] | 15 | #include "base/optional.h" |
| 16 | #include "base/strings/string16.h" |
miguelg | 87e986d | 2016-07-08 18:04:44 | [diff] [blame] | 17 | #include "chrome/browser/notifications/notification_common.h" |
miguelg | 23cd2dd7 | 2016-04-21 15:24:03 | [diff] [blame] | 18 | #include "components/keyed_service/core/keyed_service.h" |
| 19 | |
miguelg | abf610a | 2017-06-02 17:31:43 | [diff] [blame] | 20 | class NotificationHandler; |
miguelg | 23cd2dd7 | 2016-04-21 15:24:03 | [diff] [blame] | 21 | class Profile; |
| 22 | |
Evan Stade | 4755cf2 | 2017-10-17 18:35:43 | [diff] [blame^] | 23 | namespace message_center { |
| 24 | class Notification; |
| 25 | } |
| 26 | |
miguelg | 23cd2dd7 | 2016-04-21 15:24:03 | [diff] [blame] | 27 | // Profile-bound service that enables notifications to be displayed and |
| 28 | // interacted with on the user's screen, orthogonal of whether this |
| 29 | // functionality is provided by the browser or by the operating system. An |
| 30 | // instance can be retrieved through the NotificationDisplayServiceFactory. |
| 31 | // |
| 32 | // TODO(peter): Add a NotificationHandler mechanism for registering listeners. |
miguelg | 23cd2dd7 | 2016-04-21 15:24:03 | [diff] [blame] | 33 | class NotificationDisplayService : public KeyedService { |
| 34 | public: |
miguelg | bfe76835 | 2017-03-20 15:34:31 | [diff] [blame] | 35 | using DisplayedNotificationsCallback = |
| 36 | base::Callback<void(std::unique_ptr<std::set<std::string>>, |
| 37 | bool /* supports_synchronization */)>; |
miguelg | abf610a | 2017-06-02 17:31:43 | [diff] [blame] | 38 | explicit NotificationDisplayService(Profile* profile); |
| 39 | ~NotificationDisplayService() override; |
miguelg | 23cd2dd7 | 2016-04-21 15:24:03 | [diff] [blame] | 40 | |
| 41 | // Displays the |notification| identified by |notification_id|. |
Evan Stade | 4ebefdf4 | 2017-09-21 23:50:18 | [diff] [blame] | 42 | virtual void Display( |
| 43 | NotificationCommon::Type notification_type, |
| 44 | const std::string& notification_id, |
Evan Stade | 4755cf2 | 2017-10-17 18:35:43 | [diff] [blame^] | 45 | const message_center::Notification& notification, |
Evan Stade | 4ebefdf4 | 2017-09-21 23:50:18 | [diff] [blame] | 46 | std::unique_ptr<NotificationCommon::Metadata> metadata = nullptr) = 0; |
miguelg | 23cd2dd7 | 2016-04-21 15:24:03 | [diff] [blame] | 47 | |
| 48 | // Closes the notification identified by |notification_id|. |
miguelg | 87e986d | 2016-07-08 18:04:44 | [diff] [blame] | 49 | virtual void Close(NotificationCommon::Type notification_type, |
| 50 | const std::string& notification_id) = 0; |
miguelg | 23cd2dd7 | 2016-04-21 15:24:03 | [diff] [blame] | 51 | |
miguelg | bfe76835 | 2017-03-20 15:34:31 | [diff] [blame] | 52 | // Writes the ids of all currently displaying notifications and |
| 53 | // invokes |callback| with the result once known. |
peter | b5298ae | 2017-04-11 21:52:51 | [diff] [blame] | 54 | virtual void GetDisplayed(const DisplayedNotificationsCallback& callback) = 0; |
miguelg | 23cd2dd7 | 2016-04-21 15:24:03 | [diff] [blame] | 55 | |
miguelg | abf610a | 2017-06-02 17:31:43 | [diff] [blame] | 56 | // Used to propagate back events originate from the user (click, close...). |
| 57 | // The events are received and dispatched to the right consumer depending on |
| 58 | // the type of notification. Consumers include, service workers, pages, |
| 59 | // extensions... |
| 60 | void ProcessNotificationOperation(NotificationCommon::Operation operation, |
| 61 | NotificationCommon::Type notification_type, |
| 62 | const std::string& origin, |
| 63 | const std::string& notification_id, |
Peter Beverloo | ae64ba9 | 2017-09-08 21:02:45 | [diff] [blame] | 64 | const base::Optional<int>& action_index, |
| 65 | const base::Optional<base::string16>& reply, |
| 66 | const base::Optional<bool>& by_user); |
miguelg | abf610a | 2017-06-02 17:31:43 | [diff] [blame] | 67 | |
miguelg | 30dfc2e | 2017-06-14 18:18:09 | [diff] [blame] | 68 | // Return whether a notification of |notification_type| should be displayed |
| 69 | // for |origin| when the browser is in full screen mode. |
| 70 | bool ShouldDisplayOverFullscreen(const GURL& origin, |
| 71 | NotificationCommon::Type notification_type); |
| 72 | |
Evan Stade | cc63b18 | 2017-09-26 16:05:12 | [diff] [blame] | 73 | // Returns the notification handler that was registered for the given type. |
| 74 | // May return null. |
miguelg | abf610a | 2017-06-02 17:31:43 | [diff] [blame] | 75 | NotificationHandler* GetNotificationHandler( |
| 76 | NotificationCommon::Type notification_type); |
| 77 | |
miguelg | abf610a | 2017-06-02 17:31:43 | [diff] [blame] | 78 | // Registers an implementation object to handle notification operations |
| 79 | // for |notification_type|. |
| 80 | void AddNotificationHandler(NotificationCommon::Type notification_type, |
| 81 | std::unique_ptr<NotificationHandler> handler); |
| 82 | |
Evan Stade | 0bf465e5 | 2017-10-03 18:12:00 | [diff] [blame] | 83 | // Removes an implementation object added via AddNotificationHandler. |
| 84 | void RemoveNotificationHandler(NotificationCommon::Type notification_type); |
| 85 | |
Evan Stade | cc63b18 | 2017-09-26 16:05:12 | [diff] [blame] | 86 | private: |
miguelg | abf610a | 2017-06-02 17:31:43 | [diff] [blame] | 87 | std::map<NotificationCommon::Type, std::unique_ptr<NotificationHandler>> |
| 88 | notification_handlers_; |
| 89 | Profile* profile_; |
| 90 | |
miguelg | 23cd2dd7 | 2016-04-21 15:24:03 | [diff] [blame] | 91 | DISALLOW_COPY_AND_ASSIGN(NotificationDisplayService); |
| 92 | }; |
| 93 | |
| 94 | #endif // CHROME_BROWSER_NOTIFICATIONS_NOTIFICATION_DISPLAY_SERVICE_H_ |