12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- // Copyright 2018 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.
- #include "components/exo/notification.h"
- #include <memory>
- #include "ash/session/session_controller_impl.h"
- #include "ash/shell.h"
- #include "base/strings/utf_string_conversions.h"
- #include "ui/message_center/message_center.h"
- #include "ui/message_center/public/cpp/notification.h"
- #include "ui/message_center/public/cpp/notification_delegate.h"
- namespace exo {
- namespace {
- // Ref-counted delegate for handling events on notification with callbacks.
- class NotificationDelegate : public message_center::NotificationDelegate {
- public:
- NotificationDelegate(
- const base::RepeatingCallback<void(bool)>& close_callback,
- const base::RepeatingCallback<void(const absl::optional<int>&)>&
- click_callback)
- : close_callback_(close_callback), click_callback_(click_callback) {}
- NotificationDelegate(const NotificationDelegate&) = delete;
- NotificationDelegate& operator=(const NotificationDelegate&) = delete;
- // message_center::NotificationDelegate:
- void Close(bool by_user) override {
- if (!close_callback_)
- return;
- close_callback_.Run(by_user);
- }
- void Click(const absl::optional<int>& button_index,
- const absl::optional<std::u16string>& reply) override {
- if (!click_callback_)
- return;
- click_callback_.Run(button_index);
- }
- private:
- // The destructor is private since this class is ref-counted.
- ~NotificationDelegate() override = default;
- const base::RepeatingCallback<void(bool)> close_callback_;
- const base::RepeatingCallback<void(const absl::optional<int>&)>
- click_callback_;
- };
- } // namespace
- Notification::Notification(
- const std::string& title,
- const std::string& message,
- const std::string& display_source,
- const std::string& notification_id,
- const std::string& notifier_id,
- const std::vector<std::string>& buttons,
- const base::RepeatingCallback<void(bool)>& close_callback,
- const base::RepeatingCallback<void(const absl::optional<int>&)>&
- click_callback)
- : notification_id_(notification_id) {
- // Currently, exo::Notification is used only for Crostini notifications.
- // TODO(toshikikikuchi): When this class is used for other reasons,
- // re-consider the way to set the notifier type.
- auto notifier = message_center::NotifierId(
- message_center::NotifierType::CROSTINI_APPLICATION, notifier_id);
- notifier.profile_id = ash::Shell::Get()
- ->session_controller()
- ->GetPrimaryUserSession()
- ->user_info.account_id.GetUserEmail();
- message_center::RichNotificationData data;
- for (const auto& button : buttons)
- data.buttons.emplace_back(base::UTF8ToUTF16(button));
- auto notification = std::make_unique<message_center::Notification>(
- message_center::NOTIFICATION_TYPE_SIMPLE, notification_id,
- base::UTF8ToUTF16(title), base::UTF8ToUTF16(message), ui::ImageModel(),
- base::UTF8ToUTF16(display_source), GURL(), notifier, data,
- base::MakeRefCounted<NotificationDelegate>(close_callback,
- click_callback));
- message_center::MessageCenter::Get()->AddNotification(
- std::move(notification));
- }
- void Notification::Close() {
- message_center::MessageCenter::Get()->RemoveNotification(notification_id_,
- false /* by_user */);
- }
- } // namespace exo
|