Upstream version 11.39.250.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / signin / screenlock_bridge.cc
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 }