| Index: chrome/browser/signin/easy_unlock_service.cc
|
| diff --git a/chrome/browser/signin/easy_unlock_service.cc b/chrome/browser/signin/easy_unlock_service.cc
|
| index f6deed01809333a3491ef95fa5b6b8ff78b61db5..ad20ddedcad7e274d9e9b6aa8b1513db73d1cfc8 100644
|
| --- a/chrome/browser/signin/easy_unlock_service.cc
|
| +++ b/chrome/browser/signin/easy_unlock_service.cc
|
| @@ -11,6 +11,8 @@
|
| #include "base/prefs/pref_registry_simple.h"
|
| #include "base/prefs/pref_service.h"
|
| #include "base/prefs/scoped_user_pref_update.h"
|
| +#include "base/thread_task_runner_handle.h"
|
| +#include "base/time/time.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/extensions/component_loader.h"
|
| @@ -143,7 +145,10 @@ class EasyUnlockService::BluetoothDetector
|
| class EasyUnlockService::PowerMonitor
|
| : public chromeos::PowerManagerClient::Observer {
|
| public:
|
| - explicit PowerMonitor(EasyUnlockService* service) : service_(service) {
|
| + explicit PowerMonitor(EasyUnlockService* service)
|
| + : service_(service),
|
| + waking_up_(false),
|
| + weak_ptr_factory_(this) {
|
| chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->
|
| AddObserver(this);
|
| }
|
| @@ -153,17 +158,33 @@ class EasyUnlockService::PowerMonitor
|
| RemoveObserver(this);
|
| }
|
|
|
| + bool waking_up() const { return waking_up_; }
|
| +
|
| private:
|
| // chromeos::PowerManagerClient::Observer:
|
| virtual void SuspendImminent() override {
|
| - service_->DisableAppIfLoaded();
|
| + service_->PrepareForSuspend();
|
| }
|
|
|
| virtual void SuspendDone(const base::TimeDelta& sleep_duration) override {
|
| - service_->LoadApp();
|
| + waking_up_ = true;
|
| + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
|
| + FROM_HERE,
|
| + base::Bind(&PowerMonitor::ResetWakingUp,
|
| + weak_ptr_factory_.GetWeakPtr()),
|
| + base::TimeDelta::FromSeconds(5));
|
| + service_->UpdateAppState();
|
| + // Note that |this| may get deleted after |UpdateAppState| is called.
|
| + }
|
| +
|
| + void ResetWakingUp() {
|
| + waking_up_ = false;
|
| + service_->UpdateAppState();
|
| }
|
|
|
| EasyUnlockService* service_;
|
| + bool waking_up_;
|
| + base::WeakPtrFactory<PowerMonitor> weak_ptr_factory_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(PowerMonitor);
|
| };
|
| @@ -423,9 +444,6 @@ void EasyUnlockService::LoadApp() {
|
| }
|
|
|
| void EasyUnlockService::DisableAppIfLoaded() {
|
| - // Make sure lock screen state set by the extension gets reset.
|
| - ResetScreenlockState();
|
| -
|
| extensions::ComponentLoader* loader = GetComponentLoader(profile_);
|
| if (!loader->Exists(extension_misc::kEasyUnlockAppId))
|
| return;
|
| @@ -458,14 +476,27 @@ void EasyUnlockService::UpdateAppState() {
|
| LoadApp();
|
|
|
| #if defined(OS_CHROMEOS)
|
| - if (!power_monitor_)
|
| - power_monitor_.reset(new PowerMonitor(this));
|
| + if (!power_monitor_)
|
| + power_monitor_.reset(new PowerMonitor(this));
|
| #endif
|
| } else {
|
| - DisableAppIfLoaded();
|
| + bool bluetooth_waking_up = false;
|
| +#if defined(OS_CHROMEOS)
|
| + // If the service is not allowed due to bluetooth not being detected just
|
| + // after system suspend is done, give bluetooth more time to be detected
|
| + // before disabling the app (and resetting screenlock state).
|
| + bluetooth_waking_up =
|
| + power_monitor_.get() && power_monitor_->waking_up() &&
|
| + !bluetooth_detector_->IsPresent();
|
| +#endif
|
| +
|
| + if (!bluetooth_waking_up) {
|
| + DisableAppIfLoaded();
|
| + ResetScreenlockState();
|
| #if defined(OS_CHROMEOS)
|
| - power_monitor_.reset();
|
| + power_monitor_.reset();
|
| #endif
|
| + }
|
| }
|
| }
|
|
|
| @@ -569,3 +600,11 @@ void EasyUnlockService::OnCryptohomeKeysFetchedForChecking(
|
| }
|
| #endif
|
|
|
| +void EasyUnlockService::PrepareForSuspend() {
|
| + DisableAppIfLoaded();
|
| + if (screenlock_state_handler_ && screenlock_state_handler_->IsActive()) {
|
| + UpdateScreenlockState(
|
| + EasyUnlockScreenlockStateHandler::STATE_BLUETOOTH_CONNECTING);
|
| + }
|
| +}
|
| +
|
|
|