1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file. 4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/signin/screenlock_bridge.h" 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/logging.h" 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/strings/string16.h" 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/profiles/profile_window.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/signin/core/browser/signin_manager.h" 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_CHROMEOS) 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chromeos/dbus/session_manager_client.h" 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)base::LazyInstance<ScreenlockBridge> g_screenlock_bridge_bridge_instance = 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)// Ids for the icons that are supported by lock screen and signin screen 2434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)// account picker as user pod custom icons. 2534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)// The id's should be kept in sync with values used by user_pod_row.js. 2634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)const char kLockedUserPodCustomIconId[] = "locked"; 2734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)const char kUnlockedUserPodCustomIconId[] = "unlocked"; 2834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)const char kHardlockedUserPodCustomIconId[] = "hardlocked"; 2934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)const char kSpinnerUserPodCustomIconId[] = "spinner"; 3034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 3134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)// Given the user pod icon, returns its id as used by the user pod UI code. 3234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)std::string GetIdForIcon(ScreenlockBridge::UserPodCustomIcon icon) { 3334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) switch (icon) { 3434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) case ScreenlockBridge::USER_POD_CUSTOM_ICON_LOCKED: 3534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) return kLockedUserPodCustomIconId; 3634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) case ScreenlockBridge::USER_POD_CUSTOM_ICON_UNLOCKED: 3734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) return kUnlockedUserPodCustomIconId; 3834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) case ScreenlockBridge::USER_POD_CUSTOM_ICON_HARDLOCKED: 3934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) return kHardlockedUserPodCustomIconId; 4034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) case ScreenlockBridge::USER_POD_CUSTOM_ICON_SPINNER: 4134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) return kSpinnerUserPodCustomIconId; 4234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) default: 4334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) return ""; 4434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) } 4534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 4634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// static 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ScreenlockBridge* ScreenlockBridge::Get() { 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return g_screenlock_bridge_bridge_instance.Pointer(); 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ScreenlockBridge::UserPodCustomIconOptions::UserPodCustomIconOptions() 5534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) : autoshow_tooltip_(false), 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) hardlock_on_click_(false) { 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ScreenlockBridge::UserPodCustomIconOptions::~UserPodCustomIconOptions() {} 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)scoped_ptr<base::DictionaryValue> 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ScreenlockBridge::UserPodCustomIconOptions::ToDictionaryValue() const { 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue()); 6434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) std::string icon_id = GetIdForIcon(icon_); 6534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) result->SetString("id", icon_id); 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!tooltip_.empty()) { 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::DictionaryValue* tooltip_options = new base::DictionaryValue(); 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) tooltip_options->SetString("text", tooltip_); 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) tooltip_options->SetBoolean("autoshow", autoshow_tooltip_); 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result->Set("tooltip", tooltip_options); 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 74ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch if (!aria_label_.empty()) 75ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch result->SetString("ariaLabel", aria_label_); 76ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (hardlock_on_click_) 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) result->SetBoolean("hardlockOnClick", true); 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return result.Pass(); 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 8334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)void ScreenlockBridge::UserPodCustomIconOptions::SetIcon( 8434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) ScreenlockBridge::UserPodCustomIcon icon) { 8534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) icon_ = icon; 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ScreenlockBridge::UserPodCustomIconOptions::SetTooltip( 896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const base::string16& tooltip, 906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool autoshow) { 916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) tooltip_ = tooltip; 926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) autoshow_tooltip_ = autoshow; 936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 95ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdochvoid ScreenlockBridge::UserPodCustomIconOptions::SetAriaLabel( 96ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch const base::string16& aria_label) { 97ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch aria_label_ = aria_label; 98ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch} 99ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch 10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void ScreenlockBridge::UserPodCustomIconOptions::SetHardlockOnClick() { 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) hardlock_on_click_ = true; 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// static 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)std::string ScreenlockBridge::GetAuthenticatedUserEmail(Profile* profile) { 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // |profile| has to be a signed-in profile with SigninManager already 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // created. Otherwise, just crash to collect stack. 108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SigninManagerBase* signin_manager = 109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SigninManagerFactory::GetForProfileIfExists(profile); 110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return signin_manager->GetAuthenticatedUsername(); 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ScreenlockBridge::ScreenlockBridge() : lock_handler_(NULL) { 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ScreenlockBridge::~ScreenlockBridge() { 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ScreenlockBridge::SetLockHandler(LockHandler* lock_handler) { 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(lock_handler_ == NULL || lock_handler == NULL); 121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) lock_handler_ = lock_handler; 122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (lock_handler_) 123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FOR_EACH_OBSERVER(Observer, observers_, OnScreenDidLock()); 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) else 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FOR_EACH_OBSERVER(Observer, observers_, OnScreenDidUnlock()); 126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ScreenlockBridge::SetFocusedUser(const std::string& user_id) { 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (user_id == focused_user_id_) 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci focused_user_id_ = user_id; 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FOR_EACH_OBSERVER(Observer, observers_, OnFocusedUserChanged(user_id)); 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool ScreenlockBridge::IsLocked() const { 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return lock_handler_ != NULL; 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ScreenlockBridge::Lock(Profile* profile) { 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_CHROMEOS) 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) chromeos::SessionManagerClient* session_manager = 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) chromeos::DBusThreadManager::Get()->GetSessionManagerClient(); 143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) session_manager->RequestLockScreen(); 144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) profiles::LockProfile(profile); 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ScreenlockBridge::Unlock(Profile* profile) { 150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (lock_handler_) 151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) lock_handler_->Unlock(GetAuthenticatedUserEmail(profile)); 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ScreenlockBridge::AddObserver(Observer* observer) { 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) observers_.AddObserver(observer); 156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ScreenlockBridge::RemoveObserver(Observer* observer) { 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) observers_.RemoveObserver(observer); 160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 161