blob: 276e03dd9509a5019102245ab4a18ae27885d991 [file] [log] [blame]
miguelg23cd2dd72016-04-21 15:24:031// 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
miguelgabf610a2017-06-02 17:31:438#include <map>
miguelgbfe768352017-03-20 15:34:319#include <memory>
miguelg23cd2dd72016-04-21 15:24:0310#include <set>
11#include <string>
miguelg87e986d2016-07-08 18:04:4412
miguelgbfe768352017-03-20 15:34:3113#include "base/callback_forward.h"
miguelg23cd2dd72016-04-21 15:24:0314#include "base/macros.h"
Peter Beverlooae64ba92017-09-08 21:02:4515#include "base/optional.h"
16#include "base/strings/string16.h"
miguelg87e986d2016-07-08 18:04:4417#include "chrome/browser/notifications/notification_common.h"
miguelg23cd2dd72016-04-21 15:24:0318#include "components/keyed_service/core/keyed_service.h"
19
20class Notification;
miguelgabf610a2017-06-02 17:31:4321class NotificationHandler;
miguelg23cd2dd72016-04-21 15:24:0322class Profile;
23
24// Profile-bound service that enables notifications to be displayed and
25// interacted with on the user's screen, orthogonal of whether this
26// functionality is provided by the browser or by the operating system. An
27// instance can be retrieved through the NotificationDisplayServiceFactory.
28//
29// TODO(peter): Add a NotificationHandler mechanism for registering listeners.
miguelg23cd2dd72016-04-21 15:24:0330class NotificationDisplayService : public KeyedService {
31 public:
miguelgbfe768352017-03-20 15:34:3132 using DisplayedNotificationsCallback =
33 base::Callback<void(std::unique_ptr<std::set<std::string>>,
34 bool /* supports_synchronization */)>;
miguelgabf610a2017-06-02 17:31:4335 explicit NotificationDisplayService(Profile* profile);
36 ~NotificationDisplayService() override;
miguelg23cd2dd72016-04-21 15:24:0337
38 // Displays the |notification| identified by |notification_id|.
Evan Stade4ebefdf42017-09-21 23:50:1839 virtual void Display(
40 NotificationCommon::Type notification_type,
41 const std::string& notification_id,
42 const Notification& notification,
43 std::unique_ptr<NotificationCommon::Metadata> metadata = nullptr) = 0;
miguelg23cd2dd72016-04-21 15:24:0344
45 // Closes the notification identified by |notification_id|.
miguelg87e986d2016-07-08 18:04:4446 virtual void Close(NotificationCommon::Type notification_type,
47 const std::string& notification_id) = 0;
miguelg23cd2dd72016-04-21 15:24:0348
miguelgbfe768352017-03-20 15:34:3149 // Writes the ids of all currently displaying notifications and
50 // invokes |callback| with the result once known.
peterb5298ae2017-04-11 21:52:5151 virtual void GetDisplayed(const DisplayedNotificationsCallback& callback) = 0;
miguelg23cd2dd72016-04-21 15:24:0352
miguelgabf610a2017-06-02 17:31:4353 // Used to propagate back events originate from the user (click, close...).
54 // The events are received and dispatched to the right consumer depending on
55 // the type of notification. Consumers include, service workers, pages,
56 // extensions...
57 void ProcessNotificationOperation(NotificationCommon::Operation operation,
58 NotificationCommon::Type notification_type,
59 const std::string& origin,
60 const std::string& notification_id,
Peter Beverlooae64ba92017-09-08 21:02:4561 const base::Optional<int>& action_index,
62 const base::Optional<base::string16>& reply,
63 const base::Optional<bool>& by_user);
miguelgabf610a2017-06-02 17:31:4364
miguelg30dfc2e2017-06-14 18:18:0965 // Return whether a notification of |notification_type| should be displayed
66 // for |origin| when the browser is in full screen mode.
67 bool ShouldDisplayOverFullscreen(const GURL& origin,
68 NotificationCommon::Type notification_type);
69
Evan Stadecc63b182017-09-26 16:05:1270 // Returns the notification handler that was registered for the given type.
71 // May return null.
miguelgabf610a2017-06-02 17:31:4372 NotificationHandler* GetNotificationHandler(
73 NotificationCommon::Type notification_type);
74
miguelgabf610a2017-06-02 17:31:4375 // Registers an implementation object to handle notification operations
76 // for |notification_type|.
77 void AddNotificationHandler(NotificationCommon::Type notification_type,
78 std::unique_ptr<NotificationHandler> handler);
79
Evan Stade0bf465e52017-10-03 18:12:0080 // Removes an implementation object added via AddNotificationHandler.
81 void RemoveNotificationHandler(NotificationCommon::Type notification_type);
82
Evan Stadecc63b182017-09-26 16:05:1283 private:
miguelgabf610a2017-06-02 17:31:4384 std::map<NotificationCommon::Type, std::unique_ptr<NotificationHandler>>
85 notification_handlers_;
86 Profile* profile_;
87
miguelg23cd2dd72016-04-21 15:24:0388 DISALLOW_COPY_AND_ASSIGN(NotificationDisplayService);
89};
90
91#endif // CHROME_BROWSER_NOTIFICATIONS_NOTIFICATION_DISPLAY_SERVICE_H_