#include "ash/test/pixel/ash_pixel_test_helper.h"
#include "ash/shell.h"
#include "ash/style/dark_light_mode_controller_impl.h"
#include "ash/test/ash_test_util.h"
#include "ash/wallpaper/wallpaper_controller_impl.h"
#include "base/base_switches.h"
#include "base/byte_count.h"
#include "base/check_op.h"
#include "base/command_line.h"
#include "base/functional/callback.h"
#include "base/i18n/base_i18n_switches.h"
#include "base/run_loop.h"
#include "base/system/sys_info.h"
#include "chromeos/constants/chromeos_features.h"
#include "chromeos/dbus/power/fake_power_manager_client.h"
#include "chromeos/dbus/power_manager/power_supply_properties.pb.h"
namespace ash {
namespace {
constexpr SkColor kWallpaperColor = SK_ColorMAGENTA;
constexpr int kWallpaperSize = 1;
constexpr char kLocale[] = "en_US";
constexpr char kTimeZone[] = "America/Chicago";
}
AshPixelTestHelper::AshPixelTestHelper(pixel_test::InitParams params)
: params_(std::move(params)),
scoped_locale_(base::test::ScopedRestoreICUDefaultLocale(kLocale)),
time_zone_(base::test::ScopedRestoreDefaultTimezone(kTimeZone)) {
if (params_.under_rtl) {
base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
::switches::kForceUIDirection, ::switches::kForceDirectionRTL);
}
scoped_feature_list_.InitWithFeatureState(
chromeos::features::kDisableSystemBlur, !IsSystemBlurEnabled());
if (!IsSystemBlurEnabled()) {
base::CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kEnableLowEndDeviceMode);
CHECK_EQ(base::SysInfo::AmountOfPhysicalMemory(), base::MiB(512));
}
}
AshPixelTestHelper::~AshPixelTestHelper() = default;
void AshPixelTestHelper::StabilizeUi() {
base::RunLoop().RunUntilIdle();
MaybeSetDarkMode();
SetWallpaper();
SetBatteryState();
}
void AshPixelTestHelper::MaybeSetDarkMode() {
auto* dark_light_mode_controller = DarkLightModeControllerImpl::Get();
if (!dark_light_mode_controller->IsDarkModeEnabled())
dark_light_mode_controller->ToggleColorMode();
}
void AshPixelTestHelper::SetWallpaper() {
auto* controller = Shell::Get()->wallpaper_controller();
controller->CreateEmptyWallpaperForTesting();
controller->set_wallpaper_reload_no_delay_for_test();
switch (params_.wallpaper_init_type) {
case pixel_test::WallpaperInitType::kRegular: {
gfx::ImageSkia wallpaper_image = CreateSolidColorTestImage(
{kWallpaperSize, kWallpaperSize}, kWallpaperColor);
controller->blur_manager()->set_allow_blur_for_testing();
controller->set_allow_shield_for_testing();
controller->ShowWallpaperImage(
wallpaper_image,
WallpaperInfo{std::string(),
WALLPAPER_LAYOUT_TILE,
WallpaperType::kOneShot,
base::Time::Now().LocalMidnight()},
false, false);
if (controller->ShouldCalculateColors()) {
DCHECK(!wallpaper_controller_observation_.IsObserving());
wallpaper_controller_observation_.Observe(controller);
base::RunLoop loop;
DCHECK(!on_wallpaper_finalized_);
on_wallpaper_finalized_ = loop.QuitClosure();
loop.Run();
DCHECK(!wallpaper_controller_observation_.IsObserving());
}
break;
}
case pixel_test::WallpaperInitType::kPolicy:
controller->set_bypass_decode_for_testing();
controller->SetDevicePolicyWallpaperPath(base::FilePath("tmp.png"));
break;
}
}
void AshPixelTestHelper::SetBatteryState() {
power_manager::PowerSupplyProperties proto;
proto.set_external_power(
power_manager::PowerSupplyProperties_ExternalPower_DISCONNECTED);
proto.set_battery_state(
power_manager::PowerSupplyProperties_BatteryState_DISCHARGING);
proto.set_battery_percent(50.0);
chromeos::FakePowerManagerClient::Get()->UpdatePowerProperties(proto);
}
void AshPixelTestHelper::OnWallpaperColorsChanged() {
DCHECK(on_wallpaper_finalized_);
wallpaper_controller_observation_.Reset();
std::move(on_wallpaper_finalized_).Run();
}
}