#ifndef ASH_SYSTEM_UNIFIED_UNIFIED_SYSTEM_TRAY_BUBBLE_H_
#define ASH_SYSTEM_UNIFIED_UNIFIED_SYSTEM_TRAY_BUBBLE_H_
#include <memory>
#include <optional>
#include "ash/public/cpp/keyboard/keyboard_controller_observer.h"
#include "ash/public/cpp/tablet_mode_observer.h"
#include "ash/shelf/shelf_observer.h"
#include "ash/system/screen_layout_observer.h"
#include "ash/system/time/calendar_metrics.h"
#include "ash/system/tray/time_to_click_recorder.h"
#include "ash/system/tray/tray_bubble_base.h"
#include "ash/system/unified/quick_settings_view.h"
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/views/widget/widget_observer.h"
namespace ui {
class Event;
}
namespace views {
class Widget;
}
namespace ash {
class TrayEventFilter;
class UnifiedSystemTray;
class UnifiedSystemTrayController;
class QuickSettingsView;
class ASH_EXPORT UnifiedSystemTrayBubble : public TrayBubbleBase,
public ScreenLayoutObserver,
public ShelfObserver,
public TimeToClickRecorder::Delegate,
public KeyboardControllerObserver,
public TabletModeObserver {
public:
explicit UnifiedSystemTrayBubble(UnifiedSystemTray* tray);
UnifiedSystemTrayBubble(const UnifiedSystemTrayBubble&) = delete;
UnifiedSystemTrayBubble& operator=(const UnifiedSystemTrayBubble&) = delete;
~UnifiedSystemTrayBubble() override;
void InitializeObservers();
gfx::Rect GetBoundsInScreen() const;
bool IsBubbleActive() const;
void ShowAudioDetailedView();
void ShowDisplayDetailedView();
void ShowCalendarView(calendar_metrics::CalendarViewShowSource show_source,
calendar_metrics::CalendarEventSource event_source);
void ShowNetworkDetailedView();
void UpdateBubble();
int GetCurrentTrayHeight() const;
void NotifyAccessibilityEventDeprecated(ax::mojom::Event event,
bool send_native_event);
bool ShowingAudioDetailedView() const;
bool ShowingDisplayDetailedView() const;
bool ShowingCalendarView() const;
TrayBackgroundView* GetTray() const override;
TrayBubbleView* GetBubbleView() const override;
views::Widget* GetBubbleWidget() const override;
void OnDidApplyDisplayChanges() override;
void OnWidgetDestroying(views::Widget* widget) override;
void RecordTimeToClick() override;
void OnTabletPhysicalStateChanged() override;
void OnAutoHideStateChanged(ShelfAutoHideState new_state) override;
void OnKeyboardVisibilityChanged(bool visible) override;
void UpdateBubbleHeight(bool is_showing_detiled_view);
QuickSettingsView* quick_settings_view() { return quick_settings_view_; }
UnifiedSystemTrayController* unified_system_tray_controller() {
return controller_.get();
}
private:
friend class SystemTrayTestApi;
friend class UnifiedSystemTray;
void UpdateBubbleBounds();
std::unique_ptr<UnifiedSystemTrayController> controller_;
raw_ptr<UnifiedSystemTray> unified_system_tray_;
raw_ptr<views::Widget> bubble_widget_ = nullptr;
std::unique_ptr<TimeToClickRecorder> time_to_click_recorder_;
std::optional<base::TimeTicks> time_opened_;
raw_ptr<TrayBubbleView> bubble_view_ = nullptr;
raw_ptr<QuickSettingsView, DanglingUntriaged> quick_settings_view_ = nullptr;
std::unique_ptr<TrayEventFilter> tray_event_filter_;
base::WeakPtrFactory<UnifiedSystemTrayBubble> weak_factory_{this};
};
}
#endif