Home | History | Annotate | Download | only in signin
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/signin/screenlock_bridge.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/strings/string16.h"
      9 #include "chrome/browser/profiles/profile_window.h"
     10 #include "chrome/browser/signin/signin_manager_factory.h"
     11 #include "components/signin/core/browser/signin_manager.h"
     12 
     13 #if defined(OS_CHROMEOS)
     14 #include "chromeos/dbus/dbus_thread_manager.h"
     15 #include "chromeos/dbus/session_manager_client.h"
     16 #endif
     17 
     18 namespace {
     19 
     20 base::LazyInstance<ScreenlockBridge> g_screenlock_bridge_bridge_instance =
     21     LAZY_INSTANCE_INITIALIZER;
     22 
     23 // Ids for the icons that are supported by lock screen and signin screen
     24 // account picker as user pod custom icons.
     25 // The id's should be kept in sync with values used by user_pod_row.js.
     26 const char kLockedUserPodCustomIconId[] = "locked";
     27 const char kUnlockedUserPodCustomIconId[] = "unlocked";
     28 const char kHardlockedUserPodCustomIconId[] = "hardlocked";
     29 const char kSpinnerUserPodCustomIconId[] = "spinner";
     30 
     31 // Given the user pod icon, returns its id as used by the user pod UI code.
     32 std::string GetIdForIcon(ScreenlockBridge::UserPodCustomIcon icon) {
     33   switch (icon) {
     34     case ScreenlockBridge::USER_POD_CUSTOM_ICON_LOCKED:
     35       return kLockedUserPodCustomIconId;
     36     case ScreenlockBridge::USER_POD_CUSTOM_ICON_UNLOCKED:
     37       return kUnlockedUserPodCustomIconId;
     38     case ScreenlockBridge::USER_POD_CUSTOM_ICON_HARDLOCKED:
     39       return kHardlockedUserPodCustomIconId;
     40     case ScreenlockBridge::USER_POD_CUSTOM_ICON_SPINNER:
     41       return kSpinnerUserPodCustomIconId;
     42     default:
     43       return "";
     44   }
     45 }
     46 
     47 }  // namespace
     48 
     49 // static
     50 ScreenlockBridge* ScreenlockBridge::Get() {
     51   return g_screenlock_bridge_bridge_instance.Pointer();
     52 }
     53 
     54 ScreenlockBridge::UserPodCustomIconOptions::UserPodCustomIconOptions()
     55     : autoshow_tooltip_(false),
     56       hardlock_on_click_(false) {
     57 }
     58 
     59 ScreenlockBridge::UserPodCustomIconOptions::~UserPodCustomIconOptions() {}
     60 
     61 scoped_ptr<base::DictionaryValue>
     62 ScreenlockBridge::UserPodCustomIconOptions::ToDictionaryValue() const {
     63   scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue());
     64   std::string icon_id = GetIdForIcon(icon_);
     65   result->SetString("id", icon_id);
     66 
     67   if (!tooltip_.empty()) {
     68     base::DictionaryValue* tooltip_options = new base::DictionaryValue();
     69     tooltip_options->SetString("text", tooltip_);
     70     tooltip_options->SetBoolean("autoshow", autoshow_tooltip_);
     71     result->Set("tooltip", tooltip_options);
     72   }
     73 
     74   if (!aria_label_.empty())
     75     result->SetString("ariaLabel", aria_label_);
     76 
     77   if (hardlock_on_click_)
     78     result->SetBoolean("hardlockOnClick", true);
     79 
     80   return result.Pass();
     81 }
     82 
     83 void ScreenlockBridge::UserPodCustomIconOptions::SetIcon(
     84     ScreenlockBridge::UserPodCustomIcon icon) {
     85   icon_ = icon;
     86 }
     87 
     88 void ScreenlockBridge::UserPodCustomIconOptions::SetTooltip(
     89     const base::string16& tooltip,
     90     bool autoshow) {
     91   tooltip_ = tooltip;
     92   autoshow_tooltip_ = autoshow;
     93 }
     94 
     95 void ScreenlockBridge::UserPodCustomIconOptions::SetAriaLabel(
     96     const base::string16& aria_label) {
     97   aria_label_ = aria_label;
     98 }
     99 
    100 void ScreenlockBridge::UserPodCustomIconOptions::SetHardlockOnClick() {
    101   hardlock_on_click_ = true;
    102 }
    103 
    104 // static
    105 std::string ScreenlockBridge::GetAuthenticatedUserEmail(Profile* profile) {
    106   // |profile| has to be a signed-in profile with SigninManager already
    107   // created. Otherwise, just crash to collect stack.
    108   SigninManagerBase* signin_manager =
    109       SigninManagerFactory::GetForProfileIfExists(profile);
    110   return signin_manager->GetAuthenticatedUsername();
    111 }
    112 
    113 ScreenlockBridge::ScreenlockBridge() : lock_handler_(NULL) {
    114 }
    115 
    116 ScreenlockBridge::~ScreenlockBridge() {
    117 }
    118 
    119 void ScreenlockBridge::SetLockHandler(LockHandler* lock_handler) {
    120   DCHECK(lock_handler_ == NULL || lock_handler == NULL);
    121   lock_handler_ = lock_handler;
    122   if (lock_handler_)
    123     FOR_EACH_OBSERVER(Observer, observers_, OnScreenDidLock());
    124   else
    125     FOR_EACH_OBSERVER(Observer, observers_, OnScreenDidUnlock());
    126 }
    127 
    128 void ScreenlockBridge::SetFocusedUser(const std::string& user_id) {
    129   if (user_id == focused_user_id_)
    130     return;
    131   focused_user_id_ = user_id;
    132   FOR_EACH_OBSERVER(Observer, observers_, OnFocusedUserChanged(user_id));
    133 }
    134 
    135 bool ScreenlockBridge::IsLocked() const {
    136   return lock_handler_ != NULL;
    137 }
    138 
    139 void ScreenlockBridge::Lock(Profile* profile) {
    140 #if defined(OS_CHROMEOS)
    141   chromeos::SessionManagerClient* session_manager =
    142       chromeos::DBusThreadManager::Get()->GetSessionManagerClient();
    143   session_manager->RequestLockScreen();
    144 #else
    145   profiles::LockProfile(profile);
    146 #endif
    147 }
    148 
    149 void ScreenlockBridge::Unlock(Profile* profile) {
    150   if (lock_handler_)
    151     lock_handler_->Unlock(GetAuthenticatedUserEmail(profile));
    152 }
    153 
    154 void ScreenlockBridge::AddObserver(Observer* observer) {
    155   observers_.AddObserver(observer);
    156 }
    157 
    158 void ScreenlockBridge::RemoveObserver(Observer* observer) {
    159   observers_.RemoveObserver(observer);
    160 }
    161