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"
12 #include "ui/base/webui/web_ui_util.h"
13 #include "ui/gfx/image/image.h"
14 #include "ui/gfx/image/image_skia.h"
16 #if defined(OS_CHROMEOS)
17 #include "chromeos/dbus/dbus_thread_manager.h"
18 #include "chromeos/dbus/session_manager_client.h"
23 base::LazyInstance<ScreenlockBridge> g_screenlock_bridge_bridge_instance =
24 LAZY_INSTANCE_INITIALIZER;
29 ScreenlockBridge* ScreenlockBridge::Get() {
30 return g_screenlock_bridge_bridge_instance.Pointer();
33 ScreenlockBridge::UserPodCustomIconOptions::UserPodCustomIconOptions()
36 animation_set_(false),
37 animation_resource_width_(0u),
38 animation_frame_length_ms_(0u),
40 autoshow_tooltip_(false),
41 hardlock_on_click_(false) {
44 ScreenlockBridge::UserPodCustomIconOptions::~UserPodCustomIconOptions() {}
46 scoped_ptr<base::DictionaryValue>
47 ScreenlockBridge::UserPodCustomIconOptions::ToDictionaryValue() const {
48 scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue());
49 if (!icon_image_ && icon_resource_url_.empty())
53 gfx::ImageSkia icon_skia = icon_image_->AsImageSkia();
54 base::DictionaryValue* icon_representations = new base::DictionaryValue();
55 icon_representations->SetString(
57 webui::GetBitmapDataUrl(
58 icon_skia.GetRepresentation(1.0f).sk_bitmap()));
59 icon_representations->SetString(
61 webui::GetBitmapDataUrl(
62 icon_skia.GetRepresentation(2.0f).sk_bitmap()));
63 result->Set("data", icon_representations);
65 result->SetString("resourceUrl", icon_resource_url_);
68 if (!tooltip_.empty()) {
69 base::DictionaryValue* tooltip_options = new base::DictionaryValue();
70 tooltip_options->SetString("text", tooltip_);
71 tooltip_options->SetBoolean("autoshow", autoshow_tooltip_);
72 result->Set("tooltip", tooltip_options);
75 base::DictionaryValue* size = new base::DictionaryValue();
76 size->SetInteger("height", height_);
77 size->SetInteger("width", width_);
78 result->Set("size", size);
80 result->SetInteger("opacity", opacity_);
83 base::DictionaryValue* animation = new base::DictionaryValue();
84 animation->SetInteger("resourceWidth",
85 animation_resource_width_);
86 animation->SetInteger("frameLengthMs",
87 animation_frame_length_ms_);
88 result->Set("animation", animation);
91 if (hardlock_on_click_)
92 result->SetBoolean("hardlockOnClick", true);
97 void ScreenlockBridge::UserPodCustomIconOptions::SetIconAsResourceURL(
98 const std::string& url) {
101 icon_resource_url_ = url;
104 void ScreenlockBridge::UserPodCustomIconOptions::SetIconAsImage(
105 const gfx::Image& image) {
106 DCHECK(icon_resource_url_.empty());
108 icon_image_.reset(new gfx::Image(image));
109 SetSize(image.Width(), image.Height());
112 void ScreenlockBridge::UserPodCustomIconOptions::SetSize(size_t icon_width,
113 size_t icon_height) {
115 height_ = icon_height;
118 void ScreenlockBridge::UserPodCustomIconOptions::SetAnimation(
119 size_t resource_width,
120 size_t frame_length_ms) {
121 animation_set_ = true;
122 animation_resource_width_ = resource_width;
123 animation_frame_length_ms_ = frame_length_ms;
126 void ScreenlockBridge::UserPodCustomIconOptions::SetOpacity(size_t opacity) {
127 DCHECK_LE(opacity, 100u);
131 void ScreenlockBridge::UserPodCustomIconOptions::SetTooltip(
132 const base::string16& tooltip,
135 autoshow_tooltip_ = autoshow;
138 void ScreenlockBridge::UserPodCustomIconOptions::SetHardlockOnClick() {
139 hardlock_on_click_ = true;
143 std::string ScreenlockBridge::GetAuthenticatedUserEmail(Profile* profile) {
144 // |profile| has to be a signed-in profile with SigninManager already
145 // created. Otherwise, just crash to collect stack.
146 SigninManagerBase* signin_manager =
147 SigninManagerFactory::GetForProfileIfExists(profile);
148 return signin_manager->GetAuthenticatedUsername();
151 ScreenlockBridge::ScreenlockBridge() : lock_handler_(NULL) {
154 ScreenlockBridge::~ScreenlockBridge() {
157 void ScreenlockBridge::SetLockHandler(LockHandler* lock_handler) {
158 DCHECK(lock_handler_ == NULL || lock_handler == NULL);
159 lock_handler_ = lock_handler;
161 FOR_EACH_OBSERVER(Observer, observers_, OnScreenDidLock());
163 FOR_EACH_OBSERVER(Observer, observers_, OnScreenDidUnlock());
166 bool ScreenlockBridge::IsLocked() const {
167 return lock_handler_ != NULL;
170 void ScreenlockBridge::Lock(Profile* profile) {
171 #if defined(OS_CHROMEOS)
172 chromeos::SessionManagerClient* session_manager =
173 chromeos::DBusThreadManager::Get()->GetSessionManagerClient();
174 session_manager->RequestLockScreen();
176 profiles::LockProfile(profile);
180 void ScreenlockBridge::Unlock(Profile* profile) {
182 lock_handler_->Unlock(GetAuthenticatedUserEmail(profile));
185 void ScreenlockBridge::AddObserver(Observer* observer) {
186 observers_.AddObserver(observer);
189 void ScreenlockBridge::RemoveObserver(Observer* observer) {
190 observers_.RemoveObserver(observer);