// 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);