blob: b2c9d287c6b04eb9b42b05b8383aea91bf162b93 [file] [log] [blame]
// Copyright 2017 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_CHANGE_QUEUE_H_
#define UI_MESSAGE_CENTER_CHANGE_QUEUE_H_
#include <vector>
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "ui/message_center/message_center_export.h"
namespace message_center {
class MessageCenterImpl;
class Notification;
// ChangeQueue keeps track of all the changes. This class can be used for
// queuing changes during the message center can't be updated.
class MESSAGE_CENTER_EXPORT ChangeQueue {
public:
enum ChangeType {
CHANGE_TYPE_ADD = 0,
CHANGE_TYPE_UPDATE,
CHANGE_TYPE_DELETE
};
// Change represents an operation made on a notification. Since it contains
// the final state of the notification, we only keep the last change for a
// particular notification that is in the notification list around. There are
// two ids; |id_| is the newest notification id that has been assigned by an
// update, and |notification_list_id_| is the id of the notification it should
// be updating as it exists in the notification list.
class Change;
ChangeQueue();
~ChangeQueue();
// Called when the message center has appropriate visibility. Modifies
// |message_center| but does not retain it. This also causes the queue to
// empty itself.
void ApplyChanges(MessageCenterImpl* message_center);
// Causes a TYPE_ADD change to be added to the queue.
void AddNotification(std::unique_ptr<Notification> notification);
// Causes a TYPE_UPDATE change to be added to the queue.
void UpdateNotification(const std::string& old_id,
std::unique_ptr<Notification> notification);
// Causes a TYPE_DELETE change to be added to the queue.
void RemoveNotification(const std::string& id, bool by_user);
// Returns the pointer to the Notification in the latest Change which has the
// given ID. If the Change is UPDATE, the ID after the change is searched.
// If the Change id REMOVE, this returns nullptr.
// ChangeQueue keeps retaining ownership of the Notification. The returned
// notification can be modified or be copied by caller.
Notification* GetLatestNotification(const std::string& id) const;
private:
void ApplyChangeInternal(MessageCenterImpl* message_center,
std::unique_ptr<Change> change);
std::vector<std::unique_ptr<Change>> changes_;
DISALLOW_COPY_AND_ASSIGN(ChangeQueue);
};
} // namespace message_center
#endif // UI_MESSAGE_CENTER_CHANGE_QUEUE_H_