#ifndef CHROMEOS_UI_FRAME_HEADER_VIEW_H_
#define CHROMEOS_UI_FRAME_HEADER_VIEW_H_
#include <memory>
#include <utility>
#include <vector>
#include "base/component_export.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "chromeos/ui/frame/frame_header.h"
#include "chromeos/ui/frame/immersive/immersive_fullscreen_controller_delegate.h"
#include "ui/aura/window.h"
#include "ui/aura/window_observer.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/display/display_observer.h"
#include "ui/views/view.h"
namespace gfx {
class ImageSkia;
}
namespace views {
class FrameCaptionButton;
class ImageView;
class Widget;
class FrameView;
}
namespace chromeos {
class DefaultFrameHeader;
class FrameCaptionButtonContainerView;
enum class FrameBackButtonState;
class COMPONENT_EXPORT(CHROMEOS_UI_FRAME) HeaderView
: public views::View,
public chromeos::ImmersiveFullscreenControllerDelegate,
public aura::WindowObserver,
public display::DisplayObserver {
METADATA_HEADER(HeaderView, views::View)
public:
HeaderView(views::Widget* target_widget, views::FrameView* frame_view);
HeaderView(const HeaderView&) = delete;
HeaderView& operator=(const HeaderView&) = delete;
~HeaderView() override;
void Init();
void set_immersive_mode_changed_callback(base::RepeatingClosure callback) {
immersive_mode_changed_callback_ = std::move(callback);
}
bool should_paint() { return should_paint_; }
void SchedulePaintForTitle();
void ResetWindowControls();
int GetPreferredOnScreenHeight();
int GetPreferredHeight();
int GetMinimumWidth() const;
void SetAvatarIcon(const gfx::ImageSkia& avatar);
void UpdateCaptionButtons();
void SetWidthInPixels(int width_in_pixels);
void SetHeaderCornerRadius(int radius);
void Layout(PassKey) override;
void ChildPreferredSizeChanged(views::View* child) override;
bool IsDrawn() const override;
void OnWindowPropertyChanged(aura::Window* window,
const void* key,
intptr_t old) override;
void OnWindowDestroying(aura::Window* window) override;
void OnDisplayMetricsChanged(const display::Display& display,
uint32_t changed_metrics) override;
void OnDisplayTabletStateChanged(display::TabletState state) override;
chromeos::FrameCaptionButtonContainerView* caption_button_container() {
return caption_button_container_;
}
views::View* avatar_icon() const;
bool in_immersive_mode() const { return in_immersive_mode_; }
bool is_revealed() const { return fullscreen_visible_fraction_ > 0.0; }
void SetShouldPaintHeader(bool paint);
views::FrameCaptionButton* GetBackButton();
void OnImmersiveRevealStarted() override;
void OnImmersiveRevealEnded() override;
void OnImmersiveFullscreenEntered() override;
void OnImmersiveFullscreenExited() override;
void SetVisibleFraction(double visible_fraction) override;
std::vector<gfx::Rect> GetVisibleBoundsInScreen() const override;
void Relayout() override;
chromeos::DefaultFrameHeader* GetFrameHeader() { return frame_header_.get(); }
private:
class HeaderContentView;
friend class HeaderContentView;
void PaintHeaderContent(gfx::Canvas* canvas);
void UpdateBackButton();
void UpdateCenterButton();
void UpdateCaptionButtonsVisibility();
raw_ptr<views::Widget> target_widget_;
base::RepeatingClosure immersive_mode_changed_callback_;
std::unique_ptr<chromeos::DefaultFrameHeader> frame_header_;
raw_ptr<views::ImageView, DanglingUntriaged> avatar_icon_ = nullptr;
raw_ptr<HeaderContentView> header_content_view_ = nullptr;
raw_ptr<chromeos::FrameCaptionButtonContainerView> caption_button_container_ =
nullptr;
double fullscreen_visible_fraction_ = 0;
bool add_layer_for_immersive_ = false;
bool did_layout_ = false;
bool should_paint_ = true;
bool in_immersive_mode_ = false;
mutable bool is_drawn_override_ = false;
base::ScopedObservation<aura::Window, aura::WindowObserver>
window_observation_{this};
std::optional<display::ScopedDisplayObserver> display_observer_;
};
}
#endif