Index: chrome/browser/chromeos/dbus/power_manager_client.cc |
diff --git a/chrome/browser/chromeos/dbus/power_manager_client.cc b/chrome/browser/chromeos/dbus/power_manager_client.cc |
index fce1c132aabfa452eedce05fc269e1978e8ced4c..916051e3cdcea41003e1868969e8dbf612973d9b 100644 |
--- a/chrome/browser/chromeos/dbus/power_manager_client.cc |
+++ b/chrome/browser/chromeos/dbus/power_manager_client.cc |
@@ -15,6 +15,7 @@ |
#include "base/time.h" |
#include "base/timer.h" |
#include "chrome/browser/chromeos/system/runtime_environment.h" |
+#include "content/public/browser/browser_thread.h" |
satorux1
2011/11/29 01:29:12
don't need this.
Simon Que
2011/11/29 01:47:32
Done.
|
#include "dbus/bus.h" |
#include "dbus/message.h" |
#include "dbus/object_proxy.h" |
@@ -92,6 +93,29 @@ class PowerManagerClientImpl : public PowerManagerClient { |
weak_ptr_factory_.GetWeakPtr()), |
base::Bind(&PowerManagerClientImpl::SignalConnected, |
weak_ptr_factory_.GetWeakPtr())); |
+ |
+ // Monitor the D-Bus signal for screen lock and unlock signals. |
+ power_manager_proxy_->ConnectToSignal( |
+ chromium::kChromiumInterface, |
+ chromium::kLockScreenSignal, |
+ base::Bind(&PowerManagerClientImpl::ScreenLockSignalReceived, |
+ weak_ptr_factory_.GetWeakPtr()), |
+ base::Bind(&PowerManagerClientImpl::SignalConnected, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ power_manager_proxy_->ConnectToSignal( |
+ chromium::kChromiumInterface, |
+ chromium::kUnlockScreenSignal, |
+ base::Bind(&PowerManagerClientImpl::ScreenLockSignalReceived, |
+ weak_ptr_factory_.GetWeakPtr()), |
+ base::Bind(&PowerManagerClientImpl::SignalConnected, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ power_manager_proxy_->ConnectToSignal( |
+ chromium::kChromiumInterface, |
+ chromium::kUnlockScreenFailedSignal, |
+ base::Bind(&PowerManagerClientImpl::ScreenLockSignalReceived, |
+ weak_ptr_factory_.GetWeakPtr()), |
+ base::Bind(&PowerManagerClientImpl::SignalConnected, |
+ weak_ptr_factory_.GetWeakPtr())); |
} |
virtual ~PowerManagerClientImpl() { |
@@ -176,6 +200,22 @@ class PowerManagerClientImpl : public PowerManagerClient { |
weak_ptr_factory_.GetWeakPtr(), callback)); |
} |
+ virtual void NotifyScreenLockRequested() OVERRIDE { |
+ SimpleMethodCallToPowerManager(power_manager::kRequestLockScreenMethod); |
+ } |
+ |
+ virtual void NotifyScreenLockCompleted() OVERRIDE { |
+ SimpleMethodCallToPowerManager(power_manager::kScreenIsLockedMethod); |
+ } |
+ |
+ virtual void NotifyScreenUnlockRequested() OVERRIDE { |
+ SimpleMethodCallToPowerManager(power_manager::kRequestUnlockScreenMethod); |
+ } |
+ |
+ virtual void NotifyScreenUnlockCompleted() OVERRIDE { |
+ SimpleMethodCallToPowerManager(power_manager::kScreenIsUnlockedMethod); |
+ } |
+ |
private: |
// Called when a dbus signal is initially connected. |
void SignalConnected(const std::string& interface_name, |
@@ -185,6 +225,16 @@ class PowerManagerClientImpl : public PowerManagerClient { |
<< signal_name << "."; |
} |
+ // Make a method call to power manager with no arguments and no response. |
+ void SimpleMethodCallToPowerManager(const std::string& method_name) { |
+ dbus::MethodCall method_call(power_manager::kPowerManagerInterface, |
+ method_name); |
+ power_manager_proxy_->CallMethod( |
+ &method_call, |
+ dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
+ dbus::ObjectProxy::EmptyResponseCallback()); |
+ } |
+ |
// Called when a brightness change signal is received. |
void BrightnessChangedReceived(dbus::Signal* signal) { |
dbus::MessageReader reader(signal); |
@@ -288,6 +338,21 @@ class PowerManagerClientImpl : public PowerManagerClient { |
callback.Run(idle_time_ms/1000); |
} |
+ void ScreenLockSignalReceived(dbus::Signal* signal) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
satorux1
2011/11/29 01:29:12
Don't need this. We don't do this in other functio
Simon Que
2011/11/29 01:47:32
Done.
|
+ std::string signal_name = signal->GetMember(); |
+ if (signal_name == chromium::kLockScreenSignal) { |
+ FOR_EACH_OBSERVER(Observer, observers_, LockScreen()); |
+ } else if (signal_name == chromium::kUnlockScreenSignal) { |
+ FOR_EACH_OBSERVER(Observer, observers_, UnlockScreen()); |
+ } else if (signal_name == chromium::kUnlockScreenFailedSignal) { |
+ FOR_EACH_OBSERVER(Observer, observers_, UnlockScreenFailed()); |
+ } else { |
+ LOG(ERROR) << "Invalid signal name: " << signal_name; |
+ NOTREACHED(); |
+ } |
satorux1
2011/11/29 01:29:12
What about defining a function for each signal, ra
Simon Que
2011/11/29 01:47:32
Done.
|
+ } |
+ |
dbus::ObjectProxy* power_manager_proxy_; |
ObserverList<Observer> observers_; |
base::WeakPtrFactory<PowerManagerClientImpl> weak_ptr_factory_; |
@@ -348,6 +413,14 @@ class PowerManagerClientStubImpl : public PowerManagerClient { |
callback.Run(0); |
} |
+ virtual void NotifyScreenLockRequested() OVERRIDE {} |
+ |
+ virtual void NotifyScreenLockCompleted() OVERRIDE {} |
+ |
+ virtual void NotifyScreenUnlockRequested() OVERRIDE {} |
+ |
+ virtual void NotifyScreenUnlockCompleted() OVERRIDE {} |
+ |
private: |
void Update() { |
// We pause at 0 and 100% so that it's easier to check those conditions. |