blob: dd7db5dd20e7706d895bf74414b3a1cab8f036ab [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/extensions/system_display/display_info_provider_lacros.h"
#include <utility>
#include "base/bind.h"
#include "base/logging.h"
#include "chrome/browser/extensions/system_display/system_display_serialization.h"
#include "chromeos/lacros/lacros_service.h"
#include "extensions/common/api/system_display.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/mojom/geometry.mojom.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
namespace extensions {
DisplayInfoProviderLacros::DisplayInfoProviderLacros() {
// Relies on the fact that the instance is a singleton managed by
// DisplayInfoProvider::Get(), and assumes that instantiation takes place
// after LacrosService has been initialized.
auto* lacros_service = chromeos::LacrosService::Get();
DCHECK(lacros_service);
if (lacros_service->IsAvailable<crosapi::mojom::SystemDisplay>() &&
lacros_service->GetInterfaceVersion(
crosapi::mojom::SystemDisplay::Uuid_) >=
static_cast<int>(crosapi::mojom::SystemDisplay::
kAddDisplayChangeObserverMinVersion)) {
lacros_service->GetRemote<crosapi::mojom::SystemDisplay>()
->AddDisplayChangeObserver(
receiver_.BindNewPipeAndPassRemoteWithVersion());
}
}
DisplayInfoProviderLacros::~DisplayInfoProviderLacros() = default;
void DisplayInfoProviderLacros::GetAllDisplaysInfo(
bool single_unified,
base::OnceCallback<void(DisplayUnitInfoList)> callback) {
auto* lacros_service = chromeos::LacrosService::Get();
if (lacros_service->IsAvailable<crosapi::mojom::SystemDisplay>()) {
auto cb =
base::BindOnce(&DisplayInfoProviderLacros::OnCrosapiResult,
weak_ptr_factory_.GetWeakPtr(), std::move(callback));
lacros_service->GetRemote<crosapi::mojom::SystemDisplay>()
->GetDisplayUnitInfoList(single_unified, std::move(cb));
} else {
std::move(callback).Run(DisplayUnitInfoList());
}
}
void DisplayInfoProviderLacros::OnCrosapiResult(
base::OnceCallback<void(DisplayUnitInfoList)> callback,
std::vector<crosapi::mojom::DisplayUnitInfoPtr> src_info_list) {
DisplayUnitInfoList dst_info_list(src_info_list.size());
for (size_t i = 0; i < src_info_list.size(); ++i) {
DCHECK(src_info_list[i]);
extensions::api::system_display::DeserializeDisplayUnitInfo(
*src_info_list[i], &dst_info_list[i]);
}
std::move(callback).Run(std::move(dst_info_list));
}
void DisplayInfoProviderLacros::OnCrosapiDisplayChanged() {
DispatchOnDisplayChangedEvent();
}
std::unique_ptr<DisplayInfoProvider> CreateChromeDisplayInfoProvider() {
return std::make_unique<DisplayInfoProviderLacros>();
}
} // namespace extensions