// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_SYSTEM_UNIFIED_QUICK_SETTINGS_VIEW_H_
#define ASH_SYSTEM_UNIFIED_QUICK_SETTINGS_VIEW_H_
#include "ash/ash_export.h"
#include "ash/public/cpp/pagination/pagination_model_observer.h"
#include "ash/system/brightness/unified_brightness_view.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/views/view_utils.h"
namespace views {
class FlexLayoutView;
} // namespace views
namespace ash {
class FeatureTile;
class FeatureTilesContainerView;
class PaginationView;
class QuickSettingsFooter;
class QuickSettingsHeader;
class QuickSettingsMediaViewContainer;
class UnifiedSystemTrayController;
// View class of the bubble in status area tray.
//
// The `QuickSettingsView` contains the quick settings controls
class ASH_EXPORT QuickSettingsView : public views::View,
public PaginationModelObserver {
METADATA_HEADER(QuickSettingsView, views::View)
public:
explicit QuickSettingsView(UnifiedSystemTrayController* controller);
QuickSettingsView(const QuickSettingsView&) = delete;
QuickSettingsView& operator=(const QuickSettingsView&) = delete;
~QuickSettingsView() override;
// Sets the maximum height that the view can take.
void SetMaxHeight(int max_height);
// Adds tiles to the FeatureTile container view.
void AddTiles(std::vector<std::unique_ptr<FeatureTile>> tiles);
// Adds slider view.
views::View* AddSliderView(std::unique_ptr<views::View> slider_view);
// Adds media view to `media_view_container_`.
void AddMediaView(std::unique_ptr<views::View> media_view);
// Sets whether the quick settings view should show the media view.
void SetShowMediaView(bool show_media_view);
// Hides the main view and shows the given `detailed_view`.
void SetDetailedView(std::unique_ptr<views::View> detailed_view);
// Removes the detailed view set by SetDetailedView, and shows the main view.
// It deletes `detailed_view` and children.
void ResetDetailedView();
// Saves and restores keyboard focus of the currently focused element. Called
// before transitioning into a detailed view.
void SaveFocus();
void RestoreFocus();
// Gets current height of the view (including the message center).
int GetCurrentHeight() const;
// Calculates how many rows to use based on the max available height.
// FeatureTilesContainer can adjust it's height by reducing the number of rows
// it uses.
int CalculateHeightForFeatureTilesContainer();
// Gets the accessible name for the currently shown detailed view.
std::u16string GetDetailedViewAccessibleName() const;
// Returns true if a detailed view is being shown in the tray. (e.g Bluetooth
// Settings).
bool IsDetailedViewShown() const;
// PaginationModelObserver:
void TotalPagesChanged(int previous_page_count, int new_page_count) override;
FeatureTilesContainerView* feature_tiles_container() {
return feature_tiles_container_;
}
views::View* detailed_view_container() { return detailed_view_container_; }
// Returns the current tray detailed view.
template <typename T>
T* GetDetailedViewForTest() {
CHECK(!detailed_view_container_->children().empty());
views::View* view = detailed_view_container_->children()[0];
CHECK(views::IsViewClass<T>(view));
return static_cast<T*>(view);
}
PaginationView* pagination_view_for_test() { return pagination_view_; }
QuickSettingsMediaViewContainer* media_view_container_for_testing() {
return media_view_container_;
}
QuickSettingsHeader* header_for_testing() { return header_; }
QuickSettingsFooter* footer_for_testing() { return footer_; }
views::View* GetAccessibilityFocusHelperViewForTesting();
private:
class SystemTrayContainer;
friend class UnifiedBrightnessViewTest;
friend class UnifiedVolumeViewTest;
// Owned by UnifiedSystemTrayBubble.
const raw_ptr<UnifiedSystemTrayController> controller_;
// Owned by views hierarchy.
raw_ptr<views::FlexLayoutView> system_tray_container_ = nullptr;
raw_ptr<QuickSettingsHeader> header_ = nullptr;
raw_ptr<FeatureTilesContainerView> feature_tiles_container_ = nullptr;
raw_ptr<PaginationView> pagination_view_ = nullptr;
raw_ptr<views::FlexLayoutView> sliders_container_ = nullptr;
raw_ptr<QuickSettingsFooter> footer_ = nullptr;
raw_ptr<views::View> detailed_view_container_ = nullptr;
raw_ptr<QuickSettingsMediaViewContainer> media_view_container_ = nullptr;
// The maximum height available to the view.
int max_height_ = 0;
// The view that is saved by calling SaveFocus().
raw_ptr<views::View> saved_focused_view_ = nullptr;
const std::unique_ptr<ui::EventHandler> interacted_by_tap_recorder_;
};
} // namespace ash
#endif // ASH_SYSTEM_UNIFIED_QUICK_SETTINGS_VIEW_H_