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.
5 #include "chrome/browser/signin/screenlock_bridge.h"
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"
13 #if defined(OS_CHROMEOS)
14 #include "chromeos/dbus/dbus_thread_manager.h"
15 #include "chromeos/dbus/session_manager_client.h"
20 base::LazyInstance
<ScreenlockBridge
> g_screenlock_bridge_bridge_instance
=
21 LAZY_INSTANCE_INITIALIZER
;
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 kLockedToBeActivatedUserPodCustomIconId
[] = "locked-to-be-activated";
28 const char kLockedWithProximityHintUserPodCustomIconId
[] =
29 "locked-with-proximity-hint";
30 const char kUnlockedUserPodCustomIconId
[] = "unlocked";
31 const char kHardlockedUserPodCustomIconId
[] = "hardlocked";
32 const char kSpinnerUserPodCustomIconId
[] = "spinner";
34 // Given the user pod icon, returns its id as used by the user pod UI code.
35 std::string
GetIdForIcon(ScreenlockBridge::UserPodCustomIcon icon
) {
37 case ScreenlockBridge::USER_POD_CUSTOM_ICON_LOCKED
:
38 return kLockedUserPodCustomIconId
;
39 case ScreenlockBridge::USER_POD_CUSTOM_ICON_LOCKED_TO_BE_ACTIVATED
:
40 return kLockedToBeActivatedUserPodCustomIconId
;
41 case ScreenlockBridge::USER_POD_CUSTOM_ICON_LOCKED_WITH_PROXIMITY_HINT
:
42 return kLockedWithProximityHintUserPodCustomIconId
;
43 case ScreenlockBridge::USER_POD_CUSTOM_ICON_UNLOCKED
:
44 return kUnlockedUserPodCustomIconId
;
45 case ScreenlockBridge::USER_POD_CUSTOM_ICON_HARDLOCKED
:
46 return kHardlockedUserPodCustomIconId
;
47 case ScreenlockBridge::USER_POD_CUSTOM_ICON_SPINNER
:
48 return kSpinnerUserPodCustomIconId
;
57 ScreenlockBridge
* ScreenlockBridge::Get() {
58 return g_screenlock_bridge_bridge_instance
.Pointer();
61 ScreenlockBridge::UserPodCustomIconOptions::UserPodCustomIconOptions()
62 : autoshow_tooltip_(false),
63 hardlock_on_click_(false) {
66 ScreenlockBridge::UserPodCustomIconOptions::~UserPodCustomIconOptions() {}
68 scoped_ptr
<base::DictionaryValue
>
69 ScreenlockBridge::UserPodCustomIconOptions::ToDictionaryValue() const {
70 scoped_ptr
<base::DictionaryValue
> result(new base::DictionaryValue());
71 std::string icon_id
= GetIdForIcon(icon_
);
72 result
->SetString("id", icon_id
);
74 if (!tooltip_
.empty()) {
75 base::DictionaryValue
* tooltip_options
= new base::DictionaryValue();
76 tooltip_options
->SetString("text", tooltip_
);
77 tooltip_options
->SetBoolean("autoshow", autoshow_tooltip_
);
78 result
->Set("tooltip", tooltip_options
);
81 if (!aria_label_
.empty())
82 result
->SetString("ariaLabel", aria_label_
);
84 if (hardlock_on_click_
)
85 result
->SetBoolean("hardlockOnClick", true);
90 void ScreenlockBridge::UserPodCustomIconOptions::SetIcon(
91 ScreenlockBridge::UserPodCustomIcon icon
) {
95 void ScreenlockBridge::UserPodCustomIconOptions::SetTooltip(
96 const base::string16
& tooltip
,
99 autoshow_tooltip_
= autoshow
;
102 void ScreenlockBridge::UserPodCustomIconOptions::SetAriaLabel(
103 const base::string16
& aria_label
) {
104 aria_label_
= aria_label
;
107 void ScreenlockBridge::UserPodCustomIconOptions::SetHardlockOnClick() {
108 hardlock_on_click_
= true;
112 std::string
ScreenlockBridge::GetAuthenticatedUserEmail(Profile
* profile
) {
113 // |profile| has to be a signed-in profile with SigninManager already
114 // created. Otherwise, just crash to collect stack.
115 SigninManagerBase
* signin_manager
=
116 SigninManagerFactory::GetForProfileIfExists(profile
);
117 return signin_manager
->GetAuthenticatedUsername();
120 ScreenlockBridge::ScreenlockBridge() : lock_handler_(NULL
) {
123 ScreenlockBridge::~ScreenlockBridge() {
126 void ScreenlockBridge::SetLockHandler(LockHandler
* lock_handler
) {
127 DCHECK(lock_handler_
== NULL
|| lock_handler
== NULL
);
128 lock_handler_
= lock_handler
;
130 FOR_EACH_OBSERVER(Observer
, observers_
, OnScreenDidLock());
132 FOR_EACH_OBSERVER(Observer
, observers_
, OnScreenDidUnlock());
135 void ScreenlockBridge::SetFocusedUser(const std::string
& user_id
) {
136 if (user_id
== focused_user_id_
)
138 focused_user_id_
= user_id
;
139 FOR_EACH_OBSERVER(Observer
, observers_
, OnFocusedUserChanged(user_id
));
142 bool ScreenlockBridge::IsLocked() const {
143 return lock_handler_
!= NULL
;
146 void ScreenlockBridge::Lock(Profile
* profile
) {
147 #if defined(OS_CHROMEOS)
148 chromeos::SessionManagerClient
* session_manager
=
149 chromeos::DBusThreadManager::Get()->GetSessionManagerClient();
150 session_manager
->RequestLockScreen();
152 profiles::LockProfile(profile
);
156 void ScreenlockBridge::Unlock(Profile
* profile
) {
158 lock_handler_
->Unlock(GetAuthenticatedUserEmail(profile
));
161 void ScreenlockBridge::AddObserver(Observer
* observer
) {
162 observers_
.AddObserver(observer
);
165 void ScreenlockBridge::RemoveObserver(Observer
* observer
) {
166 observers_
.RemoveObserver(observer
);