blob: 4a95429aa295852af17d789c0658b637de3a4177 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/signin/screenlock_bridge.h"
#include "base/logging.h"
#include "base/strings/string16.h"
#include "chrome/browser/profiles/profile_window.h"
#include "chrome/browser/signin/signin_manager_factory.h"
#include "components/signin/core/browser/signin_manager.h"
#include "ui/base/webui/web_ui_util.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_skia.h"
#if defined(OS_CHROMEOS)
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/session_manager_client.h"
#endif
namespace {
base::LazyInstance<ScreenlockBridge> g_screenlock_bridge_bridge_instance =
LAZY_INSTANCE_INITIALIZER;
} // namespace
// static
ScreenlockBridge* ScreenlockBridge::Get() {
return g_screenlock_bridge_bridge_instance.Pointer();
}
ScreenlockBridge::UserPodCustomIconOptions::UserPodCustomIconOptions()
: width_(0u),
height_(0u),
animation_set_(false),
animation_resource_width_(0u),
animation_frame_length_ms_(0u),
opacity_(100u),
autoshow_tooltip_(false),
hardlock_on_click_(false) {
}
ScreenlockBridge::UserPodCustomIconOptions::~UserPodCustomIconOptions() {}
scoped_ptr<base::DictionaryValue>
ScreenlockBridge::UserPodCustomIconOptions::ToDictionaryValue() const {
scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue());
if (!icon_image_ && icon_resource_url_.empty())
return result.Pass();
if (icon_image_) {
gfx::ImageSkia icon_skia = icon_image_->AsImageSkia();
base::DictionaryValue* icon_representations = new base::DictionaryValue();
icon_representations->SetString(
"scale1x",
webui::GetBitmapDataUrl(
icon_skia.GetRepresentation(1.0f).sk_bitmap()));
icon_representations->SetString(
"scale2x",
webui::GetBitmapDataUrl(
icon_skia.GetRepresentation(2.0f).sk_bitmap()));
result->Set("data", icon_representations);
} else {
result->SetString("resourceUrl", icon_resource_url_);
}
if (!tooltip_.empty()) {
base::DictionaryValue* tooltip_options = new base::DictionaryValue();
tooltip_options->SetString("text", tooltip_);
tooltip_options->SetBoolean("autoshow", autoshow_tooltip_);
result->Set("tooltip", tooltip_options);
}
base::DictionaryValue* size = new base::DictionaryValue();
size->SetInteger("height", height_);
size->SetInteger("width", width_);
result->Set("size", size);
result->SetInteger("opacity", opacity_);
if (animation_set_) {
base::DictionaryValue* animation = new base::DictionaryValue();
animation->SetInteger("resourceWidth",
animation_resource_width_);
animation->SetInteger("frameLengthMs",
animation_frame_length_ms_);
result->Set("animation", animation);
}
if (hardlock_on_click_)
result->SetBoolean("hardlockOnClick", true);
return result.Pass();
}
void ScreenlockBridge::UserPodCustomIconOptions::SetIconAsResourceURL(
const std::string& url) {
DCHECK(!icon_image_);
icon_resource_url_ = url;
}
void ScreenlockBridge::UserPodCustomIconOptions::SetIconAsImage(
const gfx::Image& image) {
DCHECK(icon_resource_url_.empty());
icon_image_.reset(new gfx::Image(image));
SetSize(image.Width(), image.Height());
}
void ScreenlockBridge::UserPodCustomIconOptions::SetSize(size_t icon_width,
size_t icon_height) {
width_ = icon_width;
height_ = icon_height;
}
void ScreenlockBridge::UserPodCustomIconOptions::SetAnimation(
size_t resource_width,
size_t frame_length_ms) {
animation_set_ = true;
animation_resource_width_ = resource_width;
animation_frame_length_ms_ = frame_length_ms;
}
void ScreenlockBridge::UserPodCustomIconOptions::SetOpacity(size_t opacity) {
DCHECK_LE(opacity, 100u);
opacity_ = opacity;
}
void ScreenlockBridge::UserPodCustomIconOptions::SetTooltip(
const base::string16& tooltip,
bool autoshow) {
tooltip_ = tooltip;
autoshow_tooltip_ = autoshow;
}
void ScreenlockBridge::UserPodCustomIconOptions::SetHardlockOnClick() {
hardlock_on_click_ = true;
}
// static
std::string ScreenlockBridge::GetAuthenticatedUserEmail(Profile* profile) {
// |profile| has to be a signed-in profile with SigninManager already
// created. Otherwise, just crash to collect stack.
SigninManagerBase* signin_manager =
SigninManagerFactory::GetForProfileIfExists(profile);
return signin_manager->GetAuthenticatedUsername();
}
ScreenlockBridge::ScreenlockBridge() : lock_handler_(NULL) {
}
ScreenlockBridge::~ScreenlockBridge() {
}
void ScreenlockBridge::SetLockHandler(LockHandler* lock_handler) {
DCHECK(lock_handler_ == NULL || lock_handler == NULL);
lock_handler_ = lock_handler;
if (lock_handler_)
FOR_EACH_OBSERVER(Observer, observers_, OnScreenDidLock());
else
FOR_EACH_OBSERVER(Observer, observers_, OnScreenDidUnlock());
}
bool ScreenlockBridge::IsLocked() const {
return lock_handler_ != NULL;
}
void ScreenlockBridge::Lock(Profile* profile) {
#if defined(OS_CHROMEOS)
chromeos::SessionManagerClient* session_manager =
chromeos::DBusThreadManager::Get()->GetSessionManagerClient();
session_manager->RequestLockScreen();
#else
profiles::LockProfile(profile);
#endif
}
void ScreenlockBridge::Unlock(Profile* profile) {
if (lock_handler_)
lock_handler_->Unlock(GetAuthenticatedUserEmail(profile));
}
void ScreenlockBridge::AddObserver(Observer* observer) {
observers_.AddObserver(observer);
}
void ScreenlockBridge::RemoveObserver(Observer* observer) {
observers_.RemoveObserver(observer);
}