// Copyright (c) 2010 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/cros/screen_lock_library.h"
#include "base/message_loop.h"
#include "base/string_util.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
#include "content/browser/browser_thread.h"
namespace chromeos {
// This class handles the interaction with the ChromeOS screen lock APIs.
class ScreenLockLibraryImpl : public ScreenLockLibrary {
public:
ScreenLockLibraryImpl() {
if (CrosLibrary::Get()->EnsureLoaded()) {
Init();
}
}
~ScreenLockLibraryImpl() {
if (screen_lock_connection_) {
chromeos::DisconnectScreenLock(screen_lock_connection_);
}
}
void AddObserver(Observer* observer) {
observers_.AddObserver(observer);
}
void RemoveObserver(Observer* observer) {
observers_.RemoveObserver(observer);
}
void NotifyScreenLockRequested() {
chromeos::NotifyScreenLockRequested();
}
void NotifyScreenLockCompleted() {
chromeos::NotifyScreenLockCompleted();
}
void NotifyScreenUnlockRequested() {
chromeos::NotifyScreenUnlockRequested();
}
void NotifyScreenUnlockCompleted() {
chromeos::NotifyScreenUnlockCompleted();
}
private:
void Init() {
screen_lock_connection_ = chromeos::MonitorScreenLock(
&ScreenLockedHandler, this);
}
void LockScreen() {
// Make sure we run on UI thread.
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
NewRunnableMethod(this, &ScreenLockLibraryImpl::LockScreen));
return;
}
FOR_EACH_OBSERVER(Observer, observers_, LockScreen(this));
}
void UnlockScreen() {
// Make sure we run on UI thread.
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
NewRunnableMethod(this, &ScreenLockLibraryImpl::UnlockScreen));
return;
}
FOR_EACH_OBSERVER(Observer, observers_, UnlockScreen(this));
}
void UnlockScreenFailed() {
// Make sure we run on UI thread.
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
NewRunnableMethod(this, &ScreenLockLibraryImpl::UnlockScreenFailed));
return;
}
FOR_EACH_OBSERVER(Observer, observers_, UnlockScreenFailed(this));
}
static void ScreenLockedHandler(void* object, ScreenLockEvent event) {
ScreenLockLibraryImpl* self = static_cast<ScreenLockLibraryImpl*>(object);
switch (event) {
case chromeos::LockScreen:
self->LockScreen();
break;
case chromeos::UnlockScreen:
self->UnlockScreen();
break;
case chromeos::UnlockScreenFailed:
self->UnlockScreenFailed();
break;
default:
NOTREACHED();
}
}
ObserverList<Observer> observers_;
// A reference to the screen lock api
chromeos::ScreenLockConnection screen_lock_connection_;
DISALLOW_COPY_AND_ASSIGN(ScreenLockLibraryImpl);
};
class ScreenLockLibraryStubImpl : public ScreenLockLibrary {
public:
ScreenLockLibraryStubImpl() {}
~ScreenLockLibraryStubImpl() {}
void AddObserver(Observer* observer) {}
void RemoveObserver(Observer* observer) {}
void NotifyScreenLockRequested() {}
void NotifyScreenLockCompleted() {}
void NotifyScreenUnlockRequested() {}
void NotifyScreenUnlockCompleted() {}
};
// static
ScreenLockLibrary* ScreenLockLibrary::GetImpl(bool stub) {
if (stub)
return new ScreenLockLibraryStubImpl();
else
return new ScreenLockLibraryImpl();
}
} // namespace chromeos
// Allows InvokeLater without adding refcounting. This class is a Singleton and
// won't be deleted until it's last InvokeLater is run.
DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::ScreenLockLibraryImpl);