#ifndef EXTENSIONS_BROWSER_API_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_H_
#define EXTENSIONS_BROWSER_API_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_H_
#include <stdint.h>
#include <optional>
#include <string>
#include <vector>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "extensions/buildflags/buildflags.h"
#include "extensions/common/api/system_display.h"
#include "ui/display/display_observer.h"
static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE));
namespace display {
class Display;
class Screen;
}
namespace extensions {
class DisplayInfoProvider : public display::DisplayObserver {
public:
using DisplayUnitInfoList = std::vector<api::system_display::DisplayUnitInfo>;
using DisplayLayoutList = std::vector<api::system_display::DisplayLayout>;
using ErrorCallback = base::OnceCallback<void(std::optional<std::string>)>;
DisplayInfoProvider(const DisplayInfoProvider&) = delete;
DisplayInfoProvider& operator=(const DisplayInfoProvider&) = delete;
~DisplayInfoProvider() override;
static DisplayInfoProvider* Get();
static void InitializeForTesting(DisplayInfoProvider* display_info_provider);
static void ResetForTesting();
virtual void SetDisplayProperties(
const std::string& display_id,
const api::system_display::DisplayProperties& properties,
ErrorCallback callback);
virtual void SetDisplayLayout(const DisplayLayoutList& layouts,
ErrorCallback callback);
virtual void EnableUnifiedDesktop(bool enable);
virtual void GetAllDisplaysInfo(
bool single_unified,
base::OnceCallback<void(DisplayUnitInfoList result)> callback);
virtual void GetDisplayLayout(
base::OnceCallback<void(DisplayLayoutList result)> callback);
virtual void StartObserving();
virtual void StopObserving();
virtual bool OverscanCalibrationStart(const std::string& id);
virtual bool OverscanCalibrationAdjust(
const std::string& id,
const api::system_display::Insets& delta);
virtual bool OverscanCalibrationReset(const std::string& id);
virtual bool OverscanCalibrationComplete(const std::string& id);
virtual void ShowNativeTouchCalibration(const std::string& id,
ErrorCallback callback);
virtual bool StartCustomTouchCalibration(const std::string& id);
virtual bool CompleteCustomTouchCalibration(
const api::system_display::TouchCalibrationPairQuad& pairs,
const api::system_display::Bounds& bounds);
virtual bool ClearTouchCalibration(const std::string& id);
virtual void SetMirrorMode(const api::system_display::MirrorModeInfo& info,
ErrorCallback callback);
protected:
explicit DisplayInfoProvider(display::Screen* screen);
virtual void DispatchOnDisplayChangedEvent() = 0;
DisplayUnitInfoList GetAllDisplaysInfoList(
const std::vector<display::Display>& displays,
int64_t primary_id) const;
static api::system_display::DisplayUnitInfo CreateDisplayUnitInfo(
const display::Display& display,
int64_t primary_display_id);
private:
virtual void UpdateDisplayUnitInfoForPlatform(
const std::vector<display::Display>& displays,
DisplayUnitInfoList& units) const;
void OnDisplayAdded(const display::Display& new_display) override;
void OnDisplaysRemoved(const display::Displays& removed_displays) override;
void OnDisplayMetricsChanged(const display::Display& display,
uint32_t metrics) override;
raw_ptr<display::Screen> provided_screen_ = nullptr;
std::optional<display::ScopedDisplayObserver> display_observer_;
static DisplayInfoProvider* g_display_info_provider;
};
}
#endif