| // Copyright 2020 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 "chromeos/components/phonehub/notification_manager.h" |
| |
| #include "chromeos/components/multidevice/logging/logging.h" |
| |
| #include <sstream> |
| |
| namespace chromeos { |
| namespace phonehub { |
| namespace { |
| std::string GetIdStream(const base::flat_set<int64_t>& notification_ids) { |
| std::ostringstream output(std::ostringstream::ate); |
| for (const auto& id : notification_ids) { |
| output << id << " "; |
| } |
| return output.str(); |
| } |
| } // namespace |
| |
| NotificationManager::NotificationManager() = default; |
| |
| NotificationManager::~NotificationManager() = default; |
| |
| void NotificationManager::AddObserver(Observer* observer) { |
| observer_list_.AddObserver(observer); |
| } |
| |
| void NotificationManager::RemoveObserver(Observer* observer) { |
| observer_list_.RemoveObserver(observer); |
| } |
| |
| void NotificationManager::NotifyNotificationsAdded( |
| const base::flat_set<int64_t>& notification_ids) { |
| PA_LOG(INFO) << "Added the following notification ids: " |
| << GetIdStream(notification_ids); |
| |
| for (auto& observer : observer_list_) |
| observer.OnNotificationsAdded(notification_ids); |
| } |
| |
| void NotificationManager::NotifyNotificationsUpdated( |
| const base::flat_set<int64_t>& notification_ids) { |
| PA_LOG(INFO) << "Updated the following notification id: " |
| << GetIdStream(notification_ids); |
| |
| for (auto& observer : observer_list_) |
| observer.OnNotificationsUpdated(notification_ids); |
| } |
| |
| void NotificationManager::NotifyNotificationsRemoved( |
| const base::flat_set<int64_t>& notification_ids) { |
| PA_LOG(INFO) << "Removed the following notification id: " |
| << GetIdStream(notification_ids); |
| |
| for (auto& observer : observer_list_) |
| observer.OnNotificationsRemoved(notification_ids); |
| } |
| |
| void NotificationManager::SetNotificationsInternal( |
| const base::flat_set<Notification>& notifications) { |
| |
| base::flat_set<int64_t> added_ids; |
| base::flat_set<int64_t> updated_ids; |
| |
| for (const Notification& notification : notifications) { |
| int64_t id = notification.id(); |
| auto it = id_to_notification_map_.find(id); |
| |
| if (it == id_to_notification_map_.end()) { |
| id_to_notification_map_.emplace(id, notification); |
| added_ids.emplace(id); |
| continue; |
| } |
| |
| it->second = notification; |
| updated_ids.emplace(id); |
| } |
| |
| if (!added_ids.empty()) |
| NotifyNotificationsAdded(added_ids); |
| if (!updated_ids.empty()) |
| NotifyNotificationsUpdated(updated_ids); |
| } |
| |
| void NotificationManager::RemoveNotificationsInternal( |
| const base::flat_set<int64_t>& notification_ids) { |
| if (notification_ids.empty()) |
| return; |
| |
| for (int64_t id : notification_ids) { |
| auto it = id_to_notification_map_.find(id); |
| if (it == id_to_notification_map_.end()) |
| continue; |
| |
| id_to_notification_map_.erase(it); |
| } |
| |
| NotifyNotificationsRemoved(notification_ids); |
| } |
| |
| void NotificationManager::ClearNotificationsInternal() { |
| base::flat_set<int64_t> removed_ids; |
| for (const auto& pair : id_to_notification_map_) { |
| removed_ids.emplace(pair.first); |
| } |
| |
| if (!removed_ids.empty()) { |
| id_to_notification_map_.clear(); |
| NotifyNotificationsRemoved(removed_ids); |
| } |
| } |
| |
| const Notification* NotificationManager::GetNotification( |
| int64_t notification_id) const { |
| auto it = id_to_notification_map_.find(notification_id); |
| if (it == id_to_notification_map_.end()) |
| return nullptr; |
| return &it->second; |
| } |
| |
| } // namespace phonehub |
| } // namespace chromeos |