// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_ASH_COMPONENTS_PHONEHUB_NOTIFICATION_MANAGER_H_
#define CHROMEOS_ASH_COMPONENTS_PHONEHUB_NOTIFICATION_MANAGER_H_
#include <stdint.h>
#include <unordered_map>
#include "base/containers/flat_set.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "chromeos/ash/components/phonehub/notification.h"
namespace ash {
namespace phonehub {
// Tracks notifications which have been synced from a connected phone during a
// Phone Hub session. Clients can access notifications via GetNotification() and
// can be notified when the state of notifications changes by registering as
// observers.
//
// This class also provides functionality for interacting with notifications;
// namely, clients can dismiss notifications or send inline replies.
class NotificationManager {
public:
class Observer : public base::CheckedObserver {
public:
~Observer() override = default;
virtual void OnNotificationsAdded(
const base::flat_set<int64_t>& notification_ids) {}
virtual void OnNotificationsUpdated(
const base::flat_set<int64_t>& notification_ids) {}
virtual void OnNotificationsRemoved(
const base::flat_set<int64_t>& notification_ids) {}
};
NotificationManager(const NotificationManager&) = delete;
NotificationManager& operator=(const NotificationManager&) = delete;
virtual ~NotificationManager();
// Returns null if no notification exists with the given ID. Pointers returned
// by this function should not be cached, since the underlying Notification
// object may be deleted by a future update.
const Notification* GetNotification(int64_t notification_id) const;
// Dismisses the notification with the given ID; if no notification exists
// with this ID, this function is a no-op.
virtual void DismissNotification(int64_t notification_id) = 0;
// Sends an inline reply for the notificaiton with the given ID; if no
// notification exists with this ID, this function is a no-op.
virtual void SendInlineReply(int64_t notification_id,
const std::u16string& inline_reply_text) = 0;
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
protected:
friend class FakeNotificationProcessor;
friend class NotificationProcessor;
friend class NotificationManagerImplTest;
NotificationManager();
// Sets the internal collection of notifications. This does not send any
// requests to the remote phone device.
void SetNotificationsInternal(
const base::flat_set<Notification>& notifications);
// Removes the dismissed notifications from the internal collection of
// notifications. Does not send a request to remove notifications to the
// remote device.
void RemoveNotificationsInternal(
const base::flat_set<int64_t>& notification_ids);
// Clears the underlying internal collection of notifications. This does not
// send any requests to clear the phone's notifications.
void ClearNotificationsInternal();
void NotifyNotificationsAdded(
const base::flat_set<int64_t>& notification_ids);
void NotifyNotificationsUpdated(
const base::flat_set<int64_t>& notification_ids);
void NotifyNotificationsRemoved(
const base::flat_set<int64_t>& notification_ids);
std::unordered_map<int64_t, Notification> id_to_notification_map_;
private:
base::ObserverList<Observer> observer_list_;
};
} // namespace phonehub
} // namespace ash
#endif // CHROMEOS_ASH_COMPONENTS_PHONEHUB_NOTIFICATION_MANAGER_H_