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