blob: 028864bb16aaa48cc893b0be80baf464cbeaf89c (
plain)
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
|
// Copyright 2013 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 UI_MESSAGE_CENTER_PUBLIC_CPP_NOTIFICATION_DELEGATE_H_
#define UI_MESSAGE_CENTER_PUBLIC_CPP_NOTIFICATION_DELEGATE_H_
#include <memory>
#include <string>
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "ui/message_center/public/cpp/message_center_public_export.h"
namespace message_center {
// Handles actions performed on a notification.
class MESSAGE_CENTER_PUBLIC_EXPORT NotificationObserver {
public:
// Called when the desktop notification is closed. If closed by a user
// explicitly (as opposed to timeout/script), |by_user| should be true.
virtual void Close(bool by_user) {}
// Called when a desktop notification is clicked. |button_index| is filled in
// if a button was clicked (as opposed to the body of the notification) while
// |reply| is filled in if there was an input field associated with the
// button.
virtual void Click(const base::Optional<int>& button_index,
const base::Optional<std::u16string>& reply) {}
// Called when the user clicks the settings button in a notification which has
// a DELEGATE settings button action.
virtual void SettingsClick() {}
// Called when the user attempts to disable the notification.
virtual void DisableNotification() {}
};
// Ref counted version of NotificationObserver, required to satisfy
// message_center::Notification::delegate_.
class MESSAGE_CENTER_PUBLIC_EXPORT NotificationDelegate
: public NotificationObserver,
public base::RefCountedThreadSafe<NotificationDelegate> {
protected:
virtual ~NotificationDelegate() = default;
private:
friend class base::RefCountedThreadSafe<NotificationDelegate>;
};
// A pass-through which converts the RefCounted requirement to a WeakPtr
// requirement. This class replaces the need for individual delegates that pass
// through to an actual controller class, and which only exist because the
// actual controller has a strong ownership model.
class MESSAGE_CENTER_PUBLIC_EXPORT ThunkNotificationDelegate
: public NotificationDelegate {
public:
explicit ThunkNotificationDelegate(base::WeakPtr<NotificationObserver> impl);
// NotificationDelegate:
void Close(bool by_user) override;
void Click(const base::Optional<int>& button_index,
const base::Optional<std::u16string>& reply) override;
void SettingsClick() override;
void DisableNotification() override;
protected:
~ThunkNotificationDelegate() override;
private:
base::WeakPtr<NotificationObserver> impl_;
DISALLOW_COPY_AND_ASSIGN(ThunkNotificationDelegate);
};
// A simple notification delegate which invokes the passed closure when the body
// or a button is clicked.
class MESSAGE_CENTER_PUBLIC_EXPORT HandleNotificationClickDelegate
: public NotificationDelegate {
public:
// The parameter is the index of the button that was clicked, or nullopt if
// the body was clicked.
using ButtonClickCallback =
base::RepeatingCallback<void(base::Optional<int>)>;
// Creates a delegate that handles clicks on a button or on the body.
explicit HandleNotificationClickDelegate(const ButtonClickCallback& callback);
// Creates a delegate that only handles clicks on the body of the
// notification.
explicit HandleNotificationClickDelegate(
const base::RepeatingClosure& closure);
// Overrides the callback with one that handles clicks on a button or on the
// body.
void SetCallback(const ButtonClickCallback& callback);
// Overrides the callback with one that only handles clicks on the body of the
// notification.
void SetCallback(const base::RepeatingClosure& closure);
// NotificationDelegate overrides:
void Click(const base::Optional<int>& button_index,
const base::Optional<std::u16string>& reply) override;
protected:
~HandleNotificationClickDelegate() override;
private:
ButtonClickCallback callback_;
DISALLOW_COPY_AND_ASSIGN(HandleNotificationClickDelegate);
};
} // namespace message_center
#endif // UI_MESSAGE_CENTER_PUBLIC_CPP_NOTIFICATION_DELEGATE_H_
|