190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#ifndef UI_MESSAGE_CENTER_NOTIFICATION_DELEGATE_H_
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define UI_MESSAGE_CENTER_NOTIFICATION_DELEGATE_H_
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <string>
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/callback.h"
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/ref_counted.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/message_center/message_center_export.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace content {
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class RenderViewHost;
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace message_center {
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Delegate for a notification. This class has two roles: to implement callback
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// methods for notification, and to provide an identity of the associated
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// notification.
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class MESSAGE_CENTER_EXPORT NotificationDelegate
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : public base::RefCountedThreadSafe<NotificationDelegate> {
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // To be called when the desktop notification is actually shown.
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void Display() = 0;
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // To be called when the desktop notification cannot be shown due to an
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // error.
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void Error() = 0;
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // To be called when the desktop notification is closed.  If closed by a
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // user explicitly (as opposed to timeout/script), |by_user| should be true.
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void Close(bool by_user) = 0;
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Returns true if the delegate can handle click event.
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool HasClickedListener();
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // To be called when a desktop notification is clicked.
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void Click() = 0;
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // To be called when the user clicks a button in a notification. TODO(miket):
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // consider providing default implementations of the pure virtuals of this
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // interface, to avoid pinging so many OWNERs each time we enhance it.
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void ButtonClick(int button_index);
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected:
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~NotificationDelegate() {}
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class base::RefCountedThreadSafe<NotificationDelegate>;
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// A simple notification delegate which invokes the passed closure when clicked.
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class MESSAGE_CENTER_EXPORT HandleNotificationClickedDelegate
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : public NotificationDelegate {
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  explicit HandleNotificationClickedDelegate(const base::Closure& closure);
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // message_center::NotificationDelegate overrides:
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void Display() OVERRIDE;
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void Error() OVERRIDE;
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void Close(bool by_user) OVERRIDE;
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual bool HasClickedListener() OVERRIDE;
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void Click() OVERRIDE;
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void ButtonClick(int button_index) OVERRIDE;
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected:
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual ~HandleNotificationClickedDelegate();
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string id_;
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::Closure closure_;
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HandleNotificationClickedDelegate);
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// A notification delegate which invokes a callback when a notification button
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// has been clicked.
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MESSAGE_CENTER_EXPORT HandleNotificationButtonClickDelegate
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : public NotificationDelegate {
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  typedef base::Callback<void(int)> ButtonClickCallback;
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  explicit HandleNotificationButtonClickDelegate(
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      const ButtonClickCallback& button_callback);
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // message_center::NotificationDelegate overrides:
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void Display() OVERRIDE;
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void Error() OVERRIDE;
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void Close(bool by_user) OVERRIDE;
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void Click() OVERRIDE;
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void ButtonClick(int button_index) OVERRIDE;
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected:
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~HandleNotificationButtonClickDelegate();
98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private:
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ButtonClickCallback button_callback_;
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DISALLOW_COPY_AND_ASSIGN(HandleNotificationButtonClickDelegate);
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  //  namespace message_center
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // UI_MESSAGE_CENTER_NOTIFICATION_DELEGATE_H_
108