#ifndef ASH_APP_MENU_NOTIFICATION_MENU_VIEW_H_
#define ASH_APP_MENU_NOTIFICATION_MENU_VIEW_H_
#include <deque>
#include <string>
#include "ash/app_menu/app_menu_export.h"
#include "base/memory/raw_ptr.h"
#include "ui/views/view.h"
namespace message_center {
class Notification;
}
namespace views {
class MenuSeparator;
class SlideOutControllerDelegate;
}
namespace ash {
class NotificationMenuHeaderView;
class NotificationOverflowView;
class NotificationItemView;
class APP_MENU_EXPORT NotificationMenuView : public views::View {
public:
class Delegate {
public:
virtual ~Delegate() = default;
virtual void ActivateNotificationAndClose(
const std::string& notification_id) = 0;
virtual void OnOverflowAddedOrRemoved() = 0;
};
NotificationMenuView(
Delegate* notification_item_view_delegate,
views::SlideOutControllerDelegate* slide_out_controller_delegate,
const std::string& app_id);
NotificationMenuView(const NotificationMenuView&) = delete;
NotificationMenuView& operator=(const NotificationMenuView&) = delete;
~NotificationMenuView() override;
gfx::Size CalculatePreferredSize() const override;
void Layout() override;
bool IsEmpty() const;
void AddNotificationItemView(
const message_center::Notification& notification);
void UpdateNotificationItemView(
const message_center::Notification& notification);
void OnNotificationRemoved(const std::string& notification_id);
ui::Layer* GetSlideOutLayer();
const NotificationItemView* GetDisplayedNotificationItemView() const;
NotificationItemView* GetDisplayedNotificationItemView() {
return const_cast<NotificationItemView*>(
static_cast<const NotificationMenuView*>(this)
->GetDisplayedNotificationItemView());
}
const std::string& GetDisplayedNotificationID() const;
private:
friend class NotificationMenuViewTestAPI;
using NotificationItemViews = std::deque<NotificationItemView*>;
NotificationItemViews::iterator NotificationIterForId(const std::string& id);
const std::string app_id_;
const raw_ptr<NotificationMenuView::Delegate, ExperimentalAsh>
notification_item_view_delegate_;
const raw_ptr<views::SlideOutControllerDelegate, ExperimentalAsh>
slide_out_controller_delegate_;
NotificationItemViews notification_item_views_;
raw_ptr<views::MenuSeparator, ExperimentalAsh> double_separator_;
raw_ptr<NotificationMenuHeaderView, ExperimentalAsh> header_view_;
raw_ptr<NotificationOverflowView, ExperimentalAsh> overflow_view_ = nullptr;
};
}
#endif