#ifndef ASH_SYSTEM_VIDEO_CONFERENCE_VIDEO_CONFERENCE_TRAY_H_
#define ASH_SYSTEM_VIDEO_CONFERENCE_VIDEO_CONFERENCE_TRAY_H_
#include <string>
#include "ash/ash_export.h"
#include "ash/public/cpp/session/session_observer.h"
#include "ash/style/icon_button.h"
#include "ash/system/tray/tray_background_view.h"
#include "ash/system/video_conference/effects/video_conference_tray_effects_manager.h"
#include "ash/system/video_conference/video_conference_tray_controller.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "ui/base/metadata/metadata_header_macros.h"
namespace gfx {
class Canvas;
struct VectorIcon;
}
namespace session_manager {
enum class SessionState;
}
namespace ui {
class Event;
}
namespace views {
class Widget;
}
namespace ash {
namespace video_conference {
class BubbleViewTest;
class ReturnToAppPanelTest;
class ResourceDependencyTest;
class ToggleEffectsViewTest;
}
class Shelf;
class TrayBubbleView;
class TrayBubbleWrapper;
using MediaApps = std::vector<crosapi::mojom::VideoConferenceMediaAppInfoPtr>;
class VideoConferenceTrayButton : public IconButton {
METADATA_HEADER(VideoConferenceTrayButton, IconButton)
public:
VideoConferenceTrayButton(PressedCallback callback,
const gfx::VectorIcon* icon,
const gfx::VectorIcon* toggled_icon,
const gfx::VectorIcon* capturing_icon,
const int accessible_name_id);
VideoConferenceTrayButton(const VideoConferenceTrayButton&) = delete;
VideoConferenceTrayButton& operator=(const VideoConferenceTrayButton&) =
delete;
~VideoConferenceTrayButton() override;
void set_toggle_is_one_way() { toggle_is_one_way_ = true; }
bool show_privacy_indicator() const { return show_privacy_indicator_; }
bool is_capturing() const { return is_capturing_; }
void SetIsCapturing(bool is_capturing);
void UpdateCapturingState();
void PaintButtonContents(gfx::Canvas* canvas) override;
private:
void UpdateTooltip();
bool is_capturing_ = false;
bool show_privacy_indicator_ = false;
bool toggle_is_one_way_ = false;
const int accessible_name_id_;
raw_ptr<const gfx::VectorIcon> icon_ = nullptr;
raw_ptr<const gfx::VectorIcon> capturing_icon_ = nullptr;
};
class ASH_EXPORT VideoConferenceTray
: public SessionObserver,
public TrayBackgroundView,
public VideoConferenceTrayController::Observer,
public VideoConferenceTrayEffectsManager::Observer {
METADATA_HEADER(VideoConferenceTray, TrayBackgroundView)
public:
explicit VideoConferenceTray(Shelf* shelf);
VideoConferenceTray(const VideoConferenceTray&) = delete;
VideoConferenceTray& operator=(const VideoConferenceTray&) = delete;
~VideoConferenceTray() override;
VideoConferenceTrayButton* audio_icon() { return audio_icon_; }
VideoConferenceTrayButton* camera_icon() { return camera_icon_; }
VideoConferenceTrayButton* screen_share_icon() { return screen_share_icon_; }
IconButton* toggle_bubble_button() { return toggle_bubble_button_; }
void CloseBubbleInternal() override;
TrayBubbleView* GetBubbleView() override;
views::Widget* GetBubbleWidget() const override;
std::u16string GetAccessibleNameForBubble() override;
void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
void HideBubble(const TrayBubbleView* bubble_view) override;
void ClickedOutsideBubble(const ui::LocatedEvent& event) override;
void UpdateTrayItemColor(bool is_active) override {}
void HandleLocaleChange() override;
void AnchorUpdated() override;
void OnAnimationEnded() override;
bool ShouldEnterPushedState(const ui::Event& event) override;
void OnHasMediaAppStateChange() override;
void OnCameraPermissionStateChange() override;
void OnMicrophonePermissionStateChange() override;
void OnCameraCapturingStateChange(bool is_capturing) override;
void OnMicrophoneCapturingStateChange(bool is_capturing) override;
void OnScreenSharingStateChange(bool is_capturing_screen) override;
void OnDlcDownloadStateChanged(
bool add_warning,
const std::u16string& feature_tile_title) override;
void OnEffectSupportStateChanged(VcEffectId effect_id,
bool is_supported) override;
SkScalar GetRotationValueForToggleBubbleButton();
void UpdateTrayAndIconsState();
void SetBackgroundReplaceUiVisible(bool visible);
IconButton* GetToggleBubbleButtonForTest();
private:
friend class video_conference::BubbleViewTest;
friend class video_conference::ReturnToAppPanelTest;
friend class video_conference::ResourceDependencyTest;
friend class video_conference::ToggleEffectsViewTest;
friend class VideoConferenceTrayControllerTest;
friend class VideoConferenceTrayTest;
void OnSessionStateChanged(session_manager::SessionState state) override;
void ToggleBubble(const ui::Event& event);
void OnCameraButtonClicked(const ui::Event& event);
void OnAudioButtonClicked(const ui::Event& event);
void OnScreenShareButtonClicked(const ui::Event& event);
void ConstructBubbleWithMediaApps(MediaApps apps);
raw_ptr<VideoConferenceTrayButton> audio_icon_ = nullptr;
raw_ptr<VideoConferenceTrayButton> camera_icon_ = nullptr;
raw_ptr<VideoConferenceTrayButton> screen_share_icon_ = nullptr;
raw_ptr<IconButton> toggle_bubble_button_ = nullptr;
std::unique_ptr<TrayBubbleWrapper> bubble_;
bool bubble_open_ = false;
bool getting_media_apps_ = false;
base::WeakPtrFactory<VideoConferenceTray> weak_ptr_factory_{this};
};
}
#endif