Move about://-related constants from //content to //url
[chromium-blink-merge.git] / chrome / browser / ui / webui / chromeos / login / user_image_screen_handler.cc
blobb7b78638830bbbde5499d7c5eefbbbffe9075dea
1 // Copyright (c) 2013 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/ui/webui/chromeos/login/user_image_screen_handler.h"
7 #include "ash/audio/sounds.h"
8 #include "base/command_line.h"
9 #include "base/logging.h"
10 #include "base/metrics/histogram.h"
11 #include "base/values.h"
12 #include "chrome/browser/chromeos/login/existing_user_controller.h"
13 #include "chrome/browser/chromeos/login/ui/webui_login_display.h"
14 #include "chrome/browser/chromeos/login/users/avatar/default_user_images.h"
15 #include "chrome/browser/chromeos/login/users/user.h"
16 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
17 #include "chrome/common/chrome_switches.h"
18 #include "chrome/common/url_constants.h"
19 #include "chromeos/audio/chromeos_sounds.h"
20 #include "grit/browser_resources.h"
21 #include "grit/generated_resources.h"
22 #include "net/base/data_url.h"
23 #include "ui/base/l10n/l10n_util.h"
24 #include "ui/base/resource/resource_bundle.h"
25 #include "url/gurl.h"
27 namespace {
29 const char kJsScreenPath[] = "login.UserImageScreen";
31 } // namespace
33 namespace chromeos {
35 UserImageScreenHandler::UserImageScreenHandler()
36 : BaseScreenHandler(kJsScreenPath),
37 screen_(NULL),
38 show_on_init_(false),
39 is_ready_(false) {
40 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
41 media::SoundsManager* manager = media::SoundsManager::Get();
42 manager->Initialize(SOUND_OBJECT_DELETE,
43 bundle.GetRawDataResource(IDR_SOUND_OBJECT_DELETE_WAV));
44 manager->Initialize(SOUND_CAMERA_SNAP,
45 bundle.GetRawDataResource(IDR_SOUND_CAMERA_SNAP_WAV));
48 UserImageScreenHandler::~UserImageScreenHandler() {
49 if (screen_) {
50 screen_->OnActorDestroyed(this);
54 void UserImageScreenHandler::Initialize() {
55 if (show_on_init_) {
56 Show();
57 show_on_init_ = false;
61 void UserImageScreenHandler::SetDelegate(
62 UserImageScreenActor::Delegate* screen) {
63 screen_ = screen;
66 void UserImageScreenHandler::Show() {
67 if (!page_is_ready()) {
68 show_on_init_ = true;
69 return;
71 screen_show_time_ = base::Time::Now();
72 ShowScreen(OobeUI::kScreenUserImagePicker, NULL);
74 // When shown, query camera presence.
75 if (!screen_)
76 return;
77 if (is_ready_)
78 screen_->OnScreenReady();
81 void UserImageScreenHandler::Hide() {
84 void UserImageScreenHandler::PrepareToShow() {
87 void UserImageScreenHandler::DeclareLocalizedValues(
88 LocalizedValuesBuilder* builder) {
89 builder->Add("userImageScreenTitle", IDS_USER_IMAGE_SCREEN_TITLE);
90 builder->Add("userImageScreenDescription",
91 IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TEXT);
92 builder->Add("takePhoto", IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO);
93 builder->Add("discardPhoto", IDS_OPTIONS_CHANGE_PICTURE_DISCARD_PHOTO);
94 builder->Add("flipPhoto", IDS_OPTIONS_CHANGE_PICTURE_FLIP_PHOTO);
95 builder->Add("profilePhoto", IDS_IMAGE_SCREEN_PROFILE_PHOTO);
96 builder->Add("profilePhotoLoading",
97 IDS_IMAGE_SCREEN_PROFILE_LOADING_PHOTO);
98 builder->Add("okButtonText", IDS_OK);
99 builder->Add("authorCredit", IDS_OPTIONS_SET_WALLPAPER_AUTHOR_TEXT);
100 builder->Add("photoFromCamera", IDS_OPTIONS_CHANGE_PICTURE_PHOTO_FROM_CAMERA);
101 builder->Add("photoFlippedAccessibleText",
102 IDS_OPTIONS_PHOTO_FLIP_ACCESSIBLE_TEXT);
103 builder->Add("photoFlippedBackAccessibleText",
104 IDS_OPTIONS_PHOTO_FLIPBACK_ACCESSIBLE_TEXT);
105 builder->Add("photoCaptureAccessibleText",
106 IDS_OPTIONS_PHOTO_CAPTURE_ACCESSIBLE_TEXT);
107 builder->Add("photoDiscardAccessibleText",
108 IDS_OPTIONS_PHOTO_DISCARD_ACCESSIBLE_TEXT);
109 builder->Add("syncingPreferences", IDS_IMAGE_SCREEN_SYNCING_PREFERENCES);
112 void UserImageScreenHandler::RegisterMessages() {
113 AddCallback("getImages", &UserImageScreenHandler::HandleGetImages);
114 AddCallback("screenReady", &UserImageScreenHandler::HandleScreenReady);
115 AddCallback("takePhoto", &UserImageScreenHandler::HandleTakePhoto);
116 AddCallback("discardPhoto", &UserImageScreenHandler::HandleDiscardPhoto);
117 AddCallback("photoTaken", &UserImageScreenHandler::HandlePhotoTaken);
118 AddCallback("selectImage", &UserImageScreenHandler::HandleSelectImage);
119 AddCallback("onUserImageAccepted",
120 &UserImageScreenHandler::HandleImageAccepted);
121 AddCallback("onUserImageScreenShown",
122 &UserImageScreenHandler::HandleScreenShown);
125 void UserImageScreenHandler::SelectImage(int index) {
126 if (page_is_ready())
127 CallJS("setSelectedImage", GetDefaultImageUrl(index));
130 void UserImageScreenHandler::SendProfileImage(const std::string& data_url) {
131 if (page_is_ready())
132 CallJS("setProfileImage", data_url);
135 void UserImageScreenHandler::OnProfileImageAbsent() {
136 if (page_is_ready()) {
137 scoped_ptr<base::Value> null_value(base::Value::CreateNullValue());
138 CallJS("setProfileImage", *null_value);
142 // TODO(antrim) : It looks more like parameters for "Init" rather than callback.
143 void UserImageScreenHandler::HandleGetImages() {
144 base::ListValue image_urls;
145 for (int i = kFirstDefaultImageIndex; i < kDefaultImagesCount; ++i) {
146 scoped_ptr<base::DictionaryValue> image_data(new base::DictionaryValue);
147 image_data->SetString("url", GetDefaultImageUrl(i));
148 image_data->SetString(
149 "author", l10n_util::GetStringUTF16(kDefaultImageAuthorIDs[i]));
150 image_data->SetString(
151 "website", l10n_util::GetStringUTF16(kDefaultImageWebsiteIDs[i]));
152 image_data->SetString("title", GetDefaultImageDescription(i));
153 image_urls.Append(image_data.release());
155 CallJS("setDefaultImages", image_urls);
156 if (!screen_)
157 return;
158 if (screen_->selected_image() != User::kInvalidImageIndex)
159 SelectImage(screen_->selected_image());
161 if (screen_->profile_picture_data_url() != url::kAboutBlankURL)
162 SendProfileImage(screen_->profile_picture_data_url());
163 else if (screen_->profile_picture_absent())
164 OnProfileImageAbsent();
167 void UserImageScreenHandler::HandleScreenReady() {
168 is_ready_ = true;
169 if (screen_)
170 screen_->OnScreenReady();
173 void UserImageScreenHandler::HandlePhotoTaken(const std::string& image_url) {
174 std::string mime_type, charset, raw_data;
175 if (!net::DataURL::Parse(GURL(image_url), &mime_type, &charset, &raw_data))
176 NOTREACHED();
177 DCHECK_EQ("image/png", mime_type);
179 if (screen_)
180 screen_->OnPhotoTaken(raw_data);
183 void UserImageScreenHandler::HandleTakePhoto() {
184 ash::PlaySystemSoundIfSpokenFeedback(SOUND_CAMERA_SNAP);
187 void UserImageScreenHandler::HandleDiscardPhoto() {
188 ash::PlaySystemSoundIfSpokenFeedback(SOUND_OBJECT_DELETE);
191 void UserImageScreenHandler::HandleSelectImage(const std::string& image_url,
192 const std::string& image_type,
193 bool is_user_selection) {
194 if (screen_)
195 screen_->OnImageSelected(image_type, image_url, is_user_selection);
198 void UserImageScreenHandler::HandleImageAccepted() {
199 if (screen_)
200 screen_->OnImageAccepted();
203 void UserImageScreenHandler::HandleScreenShown() {
204 DCHECK(!screen_show_time_.is_null());
206 base::TimeDelta delta = base::Time::Now() - screen_show_time_;
207 VLOG(1) << "Screen load time: " << delta.InSecondsF();
208 UMA_HISTOGRAM_TIMES("UserImage.ScreenIsShownTime", delta);
211 void UserImageScreenHandler::SetCameraPresent(bool present) {
212 CallJS("setCameraPresent", present);
215 void UserImageScreenHandler::HideCurtain() {
216 CallJS("hideCurtain");
219 void UserImageScreenHandler::SetProfilePictureEnabled(bool enabled) {
220 CallJS("setProfilePictureEnabled", enabled);
223 } // namespace chromeos