blob: 5aec57e9a59cab34fc7bf2d1a6fc9e92232c5b86 [file] [log] [blame]
// Copyright 2016 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 "ash/shutdown_controller.h"
#include <utility>
#include "ash/session/session_controller_impl.h"
#include "ash/shell.h"
#include "ash/shutdown_reason.h"
#include "ash/wm/lock_state_controller.h"
#include "base/metrics/user_metrics.h"
#include "base/strings/stringprintf.h"
#include "base/system/sys_info.h"
#include "chromeos/dbus/power/power_manager_client.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
namespace ash {
ShutdownController::ShutdownController() = default;
ShutdownController::~ShutdownController() = default;
void ShutdownController::AddObserver(Observer* observer) {
observers_.AddObserver(observer);
}
void ShutdownController::RemoveObserver(Observer* observer) {
observers_.RemoveObserver(observer);
}
void ShutdownController::ShutDownOrReboot(ShutdownReason reason) {
// For developers on Linux desktop just exit the app.
if (!base::SysInfo::IsRunningOnChromeOS()) {
Shell::Get()->session_controller()->RequestSignOut();
return;
}
if (reason == ShutdownReason::POWER_BUTTON)
base::RecordAction(base::UserMetricsAction("Accel_ShutDown_PowerButton"));
// On real Chrome OS hardware the power manager handles shutdown.
std::string description = base::StringPrintf("UI request from ash: %s",
ShutdownReasonToString(reason));
if (reboot_on_shutdown_) {
chromeos::PowerManagerClient::Get()->RequestRestart(
power_manager::REQUEST_RESTART_FOR_USER, description);
} else {
chromeos::PowerManagerClient::Get()->RequestShutdown(
power_manager::REQUEST_SHUTDOWN_FOR_USER, description);
}
}
void ShutdownController::BindRequest(mojom::ShutdownControllerRequest request) {
bindings_.AddBinding(this, std::move(request));
}
void ShutdownController::SetRebootOnShutdownForTesting(
bool reboot_on_shutdown) {
SetRebootOnShutdown(reboot_on_shutdown);
}
void ShutdownController::SetRebootOnShutdown(bool reboot_on_shutdown) {
if (reboot_on_shutdown_ == reboot_on_shutdown)
return;
reboot_on_shutdown_ = reboot_on_shutdown;
for (auto& observer : observers_)
observer.OnShutdownPolicyChanged(reboot_on_shutdown_);
}
void ShutdownController::RequestShutdownFromLoginScreen() {
Shell::Get()->lock_state_controller()->RequestShutdown(
ShutdownReason::LOGIN_SHUT_DOWN_BUTTON);
}
} // namespace ash