blob: 3ae7f11c9a9dade17d8404149cc592a9f7d50cd1 [file] [log] [blame]
// Copyright (c) 2013 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/chromeos/power/suspend_observer.h"
#include "ash/shell.h"
#include "ash/wm/user_activity_detector.h"
#include "base/prefs/pref_service.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/extensions/api/system_private/system_private_api.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/common/pref_names.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/display/output_configurator.h"
namespace chromeos {
SuspendObserver::SuspendObserver()
: power_client_(DBusThreadManager::Get()->GetPowerManagerClient()),
session_client_(DBusThreadManager::Get()->GetSessionManagerClient()),
screen_locked_(false) {
power_client_->AddObserver(this);
session_client_->AddObserver(this);
}
SuspendObserver::~SuspendObserver() {
session_client_->RemoveObserver(this);
session_client_ = NULL;
power_client_->RemoveObserver(this);
power_client_ = NULL;
}
void SuspendObserver::SuspendImminent() {
// If the lock-before-suspending pref is set, get a callback to block
// suspend and ask the session manager to lock the screen.
Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord();
if (profile && profile->GetPrefs()->GetBoolean(prefs::kEnableScreenLock) &&
UserManager::Get()->CanCurrentUserLock() && !screen_locked_) {
screen_lock_callback_ = power_client_->GetSuspendReadinessCallback();
VLOG(1) << "Requesting screen lock from SuspendObserver";
session_client_->RequestLockScreen();
}
ash::Shell::GetInstance()->user_activity_detector()->OnDisplayPowerChanging();
ash::Shell::GetInstance()->output_configurator()->SuspendDisplays();
}
void SuspendObserver::ScreenIsLocked() {
screen_locked_ = true;
// Stop blocking suspend after the screen is locked.
if (!screen_lock_callback_.is_null()) {
VLOG(1) << "Screen locked due to suspend";
// Run the callback asynchronously. ScreenIsLocked() is currently
// called asynchronously after RequestLockScreen(), but this guards
// against it being made synchronous later.
base::MessageLoop::current()->PostTask(FROM_HERE, screen_lock_callback_);
screen_lock_callback_.Reset();
} else {
VLOG(1) << "Screen locked without suspend";
}
}
void SuspendObserver::ScreenIsUnlocked() {
screen_locked_ = false;
}
} // namespace chromeos