Index: chrome/browser/signin/easy_unlock_screenlock_state_handler.cc |
diff --git a/chrome/browser/signin/easy_unlock_screenlock_state_handler.cc b/chrome/browser/signin/easy_unlock_screenlock_state_handler.cc |
index f2eb9ee0f914108946c4365121831e723379abac..8921a20a293bcd420d4ce0c23a59a557c0a53c62 100644 |
--- a/chrome/browser/signin/easy_unlock_screenlock_state_handler.cc |
+++ b/chrome/browser/signin/easy_unlock_screenlock_state_handler.cc |
@@ -19,6 +19,18 @@ size_t kIconSize = 27u; |
size_t kSpinnerResourceWidth = 1215u; |
size_t kSpinnerIntervalMs = 50u; |
+const char kHardlockIconResourceURL[] = |
+ "chrome://theme/IDR_EASY_UNLOCK_HARDLOCKED"; |
+ |
+const char kLockedIconResourceURL[] = |
+ "chrome://theme/IDR_EASY_UNLOCK_LOCKED"; |
+ |
+const char kSpinnerIconResourceURL[] = |
+ "chrome://theme/IDR_EASY_UNLOCK_SPINNER"; |
+ |
+const char kUnlockedIconResourceURL[] = |
+ "chrome://theme/IDR_EASY_UNLOCK_UNLOCKED"; |
+ |
std::string GetIconURLForState(EasyUnlockScreenlockStateHandler::State state) { |
switch (state) { |
case EasyUnlockScreenlockStateHandler::STATE_NO_BLUETOOTH: |
@@ -28,11 +40,11 @@ std::string GetIconURLForState(EasyUnlockScreenlockStateHandler::State state) { |
case EasyUnlockScreenlockStateHandler::STATE_PHONE_NOT_NEARBY: |
case EasyUnlockScreenlockStateHandler::STATE_PHONE_UNLOCKABLE: |
case EasyUnlockScreenlockStateHandler::STATE_PHONE_UNSUPPORTED: |
- return "chrome://theme/IDR_EASY_UNLOCK_LOCKED"; |
+ return kLockedIconResourceURL; |
case EasyUnlockScreenlockStateHandler::STATE_BLUETOOTH_CONNECTING: |
- return "chrome://theme/IDR_EASY_UNLOCK_SPINNER"; |
+ return kSpinnerIconResourceURL; |
case EasyUnlockScreenlockStateHandler::STATE_AUTHENTICATED: |
- return "chrome://theme/IDR_EASY_UNLOCK_UNLOCKED"; |
+ return kUnlockedIconResourceURL; |
default: |
return ""; |
} |
@@ -81,12 +93,15 @@ bool TooltipContainsDeviceType(EasyUnlockScreenlockStateHandler::State state) { |
EasyUnlockScreenlockStateHandler::EasyUnlockScreenlockStateHandler( |
const std::string& user_email, |
+ bool initially_hardlocked, |
PrefService* pref_service, |
ScreenlockBridge* screenlock_bridge) |
: state_(STATE_INACTIVE), |
user_email_(user_email), |
pref_service_(pref_service), |
- screenlock_bridge_(screenlock_bridge) { |
+ screenlock_bridge_(screenlock_bridge), |
+ hardlocked_(initially_hardlocked), |
+ hardlock_ui_shown_(false) { |
DCHECK(screenlock_bridge_); |
screenlock_bridge_->AddObserver(this); |
} |
@@ -105,9 +120,11 @@ void EasyUnlockScreenlockStateHandler::ChangeState(State new_state) { |
// If lock screen is not active or it forces offline password, just cache the |
// current state. The screenlock state will get refreshed in |ScreenDidLock|. |
- if (!screenlock_bridge_->IsLocked() || |
- screenlock_bridge_->lock_handler()->GetAuthType(user_email_) == |
- ScreenlockBridge::LockHandler::FORCE_OFFLINE_PASSWORD) { |
+ if (!screenlock_bridge_->IsLocked()) |
+ return; |
+ |
+ if (hardlocked_) { |
+ ShowHardlockUI(); |
return; |
} |
@@ -131,7 +148,7 @@ void EasyUnlockScreenlockStateHandler::ChangeState(State new_state) { |
if (HasAnimation(state_)) |
icon_options.SetAnimation(kSpinnerResourceWidth, kSpinnerIntervalMs); |
- // Hardlocking is disabled in trial run. |
+ // Don't hardlock on trial run. |
if (!trial_run && HardlockOnClick(state_)) |
icon_options.SetHardlockOnClick(); |
@@ -142,6 +159,22 @@ void EasyUnlockScreenlockStateHandler::ChangeState(State new_state) { |
icon_options); |
} |
+void EasyUnlockScreenlockStateHandler::SetHardlocked(bool value) { |
+ if (hardlocked_ == value) |
+ return; |
+ |
+ hardlocked_ = value; |
+ |
+ // If hardlocked_ was set to false, this means the screen is about to get |
+ // unlocked. No need to update it in this case. |
+ if (hardlocked_) { |
+ State last_state = state_; |
+ // This should force updating screenlock state. |
+ state_ = STATE_INACTIVE; |
+ ChangeState(last_state); |
+ } |
+} |
+ |
void EasyUnlockScreenlockStateHandler::OnScreenDidLock() { |
State last_state = state_; |
// This should force updating screenlock state. |
@@ -150,12 +183,50 @@ void EasyUnlockScreenlockStateHandler::OnScreenDidLock() { |
} |
void EasyUnlockScreenlockStateHandler::OnScreenDidUnlock() { |
+ hardlock_ui_shown_ = false; |
+ if (state_ != STATE_INACTIVE) |
+ MarkTrialRunComplete(); |
} |
void EasyUnlockScreenlockStateHandler::OnFocusedUserChanged( |
const std::string& user_id) { |
} |
+void EasyUnlockScreenlockStateHandler::ShowHardlockUI() { |
+ DCHECK(hardlocked_); |
+ |
+ if (!screenlock_bridge_->IsLocked()) |
+ return; |
+ |
+ if (screenlock_bridge_->lock_handler()->GetAuthType(user_email_) != |
+ ScreenlockBridge::LockHandler::OFFLINE_PASSWORD) { |
+ screenlock_bridge_->lock_handler()->SetAuthType( |
+ user_email_, |
+ ScreenlockBridge::LockHandler::OFFLINE_PASSWORD, |
+ base::string16()); |
+ } |
+ |
+ if (state_ == STATE_INACTIVE) { |
+ screenlock_bridge_->lock_handler()->HideUserPodCustomIcon(user_email_); |
+ hardlock_ui_shown_ = false; |
+ return; |
+ } |
+ |
+ if (hardlock_ui_shown_) |
+ return; |
+ |
+ ScreenlockBridge::UserPodCustomIconOptions icon_options; |
+ icon_options.SetIconAsResourceURL(kHardlockIconResourceURL); |
+ icon_options.SetSize(kIconSize, kIconSize); |
+ icon_options.SetTooltip( |
+ l10n_util::GetStringFUTF16(IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_HARDLOCK, |
+ GetDeviceName()), |
+ false /* don't autoshow */); |
+ screenlock_bridge_->lock_handler()->ShowUserPodCustomIcon(user_email_, |
+ icon_options); |
+ hardlock_ui_shown_ = true; |
+} |
+ |
void EasyUnlockScreenlockStateHandler::UpdateTooltipOptions( |
bool trial_run, |
ScreenlockBridge::UserPodCustomIconOptions* icon_options) { |
@@ -208,8 +279,7 @@ base::string16 EasyUnlockScreenlockStateHandler::GetDeviceName() { |
} |
void EasyUnlockScreenlockStateHandler::UpdateScreenlockAuthType() { |
- if (screenlock_bridge_->lock_handler()->GetAuthType(user_email_) == |
- ScreenlockBridge::LockHandler::FORCE_OFFLINE_PASSWORD) |
+ if (hardlocked_) |
return; |
if (state_ == STATE_AUTHENTICATED) { |