| 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
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..13816fc155f61a86379fd7b9384c06fd0851e20a
|
| --- /dev/null
|
| +++ b/chrome/browser/signin/easy_unlock_screenlock_state_handler.cc
|
| @@ -0,0 +1,211 @@
|
| +// Copyright 2014 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/signin/easy_unlock_screenlock_state_handler.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/prefs/pref_service.h"
|
| +#include "base/strings/string16.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| +#include "chrome/browser/chromeos/chromeos_utils.h"
|
| +#include "chrome/common/pref_names.h"
|
| +#include "grit/generated_resources.h"
|
| +#include "ui/base/l10n/l10n_util.h"
|
| +
|
| +namespace {
|
| +
|
| +size_t kIconSize = 27u;
|
| +size_t kOpaqueIconOpacity = 50u;
|
| +size_t kSpinnerResourceWidth = 1215u;
|
| +size_t kSpinnerIntervalMs = 50u;
|
| +
|
| +std::string GetIconURLForState(EasyUnlockScreenlockStateHandler::State state) {
|
| + switch (state) {
|
| + case EasyUnlockScreenlockStateHandler::STATE_NO_BLUETOOTH:
|
| + case EasyUnlockScreenlockStateHandler::STATE_NO_PHONE:
|
| + case EasyUnlockScreenlockStateHandler::STATE_PHONE_NOT_AUTHENTICATED:
|
| + case EasyUnlockScreenlockStateHandler::STATE_PHONE_LOCKED:
|
| + case EasyUnlockScreenlockStateHandler::STATE_PHONE_NOT_NEARBY:
|
| + case EasyUnlockScreenlockStateHandler::STATE_PHONE_UNLOCKABLE:
|
| + return "chrome://theme/IDR_EASY_UNLOCK_LOCKED";
|
| + case EasyUnlockScreenlockStateHandler::STATE_BLUETOOTH_CONNECTING:
|
| + return "chrome://theme/IDR_EASY_UNLOCK_SPINNER";
|
| + case EasyUnlockScreenlockStateHandler::STATE_AUTHENTICATED:
|
| + return "chrome://theme/IDR_EASY_UNLOCK_UNLOCKED";
|
| + default:
|
| + return "";
|
| + }
|
| +}
|
| +
|
| +bool UseOpaqueIcon(EasyUnlockScreenlockStateHandler::State state) {
|
| + return state == EasyUnlockScreenlockStateHandler::STATE_NO_BLUETOOTH ||
|
| + state == EasyUnlockScreenlockStateHandler::STATE_NO_PHONE ||
|
| + state == EasyUnlockScreenlockStateHandler::STATE_PHONE_NOT_NEARBY ||
|
| + state == EasyUnlockScreenlockStateHandler::STATE_PHONE_UNLOCKABLE;
|
| +}
|
| +
|
| +bool HasAnimation(EasyUnlockScreenlockStateHandler::State state) {
|
| + return state == EasyUnlockScreenlockStateHandler::STATE_BLUETOOTH_CONNECTING;
|
| +}
|
| +
|
| +size_t GetTooltipResourceId(EasyUnlockScreenlockStateHandler::State state) {
|
| + switch (state) {
|
| + case EasyUnlockScreenlockStateHandler::STATE_NO_BLUETOOTH:
|
| + return IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_NO_BLUETOOTH;
|
| + case EasyUnlockScreenlockStateHandler::STATE_NO_PHONE:
|
| + return IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_NO_PHONE;
|
| + case EasyUnlockScreenlockStateHandler::STATE_PHONE_NOT_AUTHENTICATED:
|
| + return IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_PHONE_NOT_AUTHENTICATED;
|
| + case EasyUnlockScreenlockStateHandler::STATE_PHONE_LOCKED:
|
| + return IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_PHONE_LOCKED;
|
| + case EasyUnlockScreenlockStateHandler::STATE_PHONE_UNLOCKABLE:
|
| + return IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_PHONE_UNLOCKABLE;
|
| + case EasyUnlockScreenlockStateHandler::STATE_PHONE_NOT_NEARBY:
|
| + return IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_PHONE_NOT_NEARBY;
|
| + case EasyUnlockScreenlockStateHandler::STATE_AUTHENTICATED:
|
| + // TODO(tbarzic): When hard lock is enabled change this to
|
| + // IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_HARDLOCK_INSTRUCTIONS.
|
| + return 0;
|
| + default:
|
| + return 0;
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +
|
| +EasyUnlockScreenlockStateHandler::EasyUnlockScreenlockStateHandler(
|
| + const std::string& user_email,
|
| + PrefService* pref_service,
|
| + ScreenlockBridge* screenlock_bridge)
|
| + : state_(STATE_INACTIVE),
|
| + user_email_(user_email),
|
| + pref_service_(pref_service),
|
| + screenlock_bridge_(screenlock_bridge) {
|
| + DCHECK(screenlock_bridge_);
|
| + screenlock_bridge_->AddObserver(this);
|
| +}
|
| +
|
| +EasyUnlockScreenlockStateHandler::~EasyUnlockScreenlockStateHandler() {
|
| + screenlock_bridge_->RemoveObserver(this);
|
| + // Make sure the screenlock state set by this gets cleared.
|
| + ChangeState(STATE_INACTIVE);
|
| +}
|
| +
|
| +void EasyUnlockScreenlockStateHandler::ChangeState(State new_state) {
|
| + if (state_ == new_state)
|
| + return;
|
| +
|
| + state_ = new_state;
|
| +
|
| + // If lock screen is not active, just cache the current state.
|
| + // The screenlock state will get refreshed in |ScreenDidLock|.
|
| + if (!screenlock_bridge_->IsLocked())
|
| + return;
|
| +
|
| + UpdateScreenlockAuthType();
|
| +
|
| + ScreenlockBridge::UserPodCustomIconOptions icon_options;
|
| +
|
| + std::string icon_url = GetIconURLForState(state_);
|
| + if (icon_url.empty()) {
|
| + screenlock_bridge_->lock_handler()->HideUserPodCustomIcon(user_email_);
|
| + return;
|
| + }
|
| + icon_options.SetIconAsResourceURL(icon_url);
|
| +
|
| + UpdateTooltipOptions(&icon_options);
|
| +
|
| + if (UseOpaqueIcon(state_))
|
| + icon_options.SetOpacity(kOpaqueIconOpacity);
|
| +
|
| + icon_options.SetSize(kIconSize, kIconSize);
|
| +
|
| + if (HasAnimation(state_))
|
| + icon_options.SetAnimation(kSpinnerResourceWidth, kSpinnerIntervalMs);
|
| +
|
| + screenlock_bridge_->lock_handler()->ShowUserPodCustomIcon(user_email_,
|
| + icon_options);
|
| +}
|
| +
|
| +void EasyUnlockScreenlockStateHandler::OnScreenDidLock() {
|
| + State last_state = state_;
|
| + // This should force updating screenlock state.
|
| + state_ = STATE_INACTIVE;
|
| + ChangeState(last_state);
|
| +}
|
| +
|
| +void EasyUnlockScreenlockStateHandler::OnScreenDidUnlock() {
|
| +}
|
| +
|
| +void EasyUnlockScreenlockStateHandler::UpdateTooltipOptions(
|
| + ScreenlockBridge::UserPodCustomIconOptions* icon_options) {
|
| + bool show_tutorial = ShouldShowTutorial();
|
| +
|
| + size_t resource_id = 0;
|
| + base::string16 device_name;
|
| + if (show_tutorial) {
|
| + resource_id = IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_TUTORIAL;
|
| + } else {
|
| + resource_id = GetTooltipResourceId(state_);
|
| + if (state_ == STATE_AUTHENTICATED || state_ == STATE_PHONE_UNLOCKABLE)
|
| + device_name = GetDeviceName();
|
| + }
|
| +
|
| + if (!resource_id)
|
| + return;
|
| +
|
| + base::string16 tooltip;
|
| + if (device_name.empty()) {
|
| + tooltip = l10n_util::GetStringUTF16(resource_id);
|
| + } else {
|
| + tooltip = l10n_util::GetStringFUTF16(resource_id, device_name);
|
| + }
|
| +
|
| + if (tooltip.empty())
|
| + return;
|
| +
|
| + if (show_tutorial)
|
| + MarkTutorialShown();
|
| +
|
| + icon_options->SetTooltip(tooltip, show_tutorial /* autoshow tooltip */);
|
| +}
|
| +
|
| +bool EasyUnlockScreenlockStateHandler::ShouldShowTutorial() {
|
| + if (state_ != STATE_AUTHENTICATED)
|
| + return false;
|
| + return pref_service_ &&
|
| + pref_service_->GetBoolean(prefs::kEasyUnlockShowTutorial);
|
| +}
|
| +
|
| +void EasyUnlockScreenlockStateHandler::MarkTutorialShown() {
|
| + if (!pref_service_)
|
| + return;
|
| + pref_service_->SetBoolean(prefs::kEasyUnlockShowTutorial, false);
|
| +}
|
| +
|
| +base::string16 EasyUnlockScreenlockStateHandler::GetDeviceName() {
|
| +#if defined(OS_CHROMEOS)
|
| + return chromeos::GetChromeDeviceType();
|
| +#else
|
| + // TODO(tbarzic): Figure out the name for non Chrome OS case.
|
| + return base::ASCIIToUTF16("Chrome");
|
| +#endif
|
| +}
|
| +
|
| +void EasyUnlockScreenlockStateHandler::UpdateScreenlockAuthType() {
|
| + if (state_ == STATE_AUTHENTICATED) {
|
| + screenlock_bridge_->lock_handler()->SetAuthType(
|
| + user_email_,
|
| + ScreenlockBridge::LockHandler::USER_CLICK,
|
| + l10n_util::GetStringUTF16(
|
| + IDS_EASY_UNLOCK_SCREENLOCK_USER_POD_AUTH_VALUE));
|
| + } else 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());
|
| + }
|
| +}
|
|
|