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/ui/webui/chromeos/login/oobe_ui.h"
15 #include "chrome/common/chrome_switches.h"
16 #include "chrome/common/url_constants.h"
17 #include "chrome/grit/generated_resources.h"
18 #include "chromeos/audio/chromeos_sounds.h"
19 #include "components/user_manager/user.h"
20 #include "components/user_manager/user_image/default_user_images.h"
21 #include "grit/browser_resources.h"
22 #include "media/audio/sounds/sounds_manager.h"
23 #include "net/base/data_url.h"
24 #include "ui/base/l10n/l10n_util.h"
25 #include "ui/base/resource/resource_bundle.h"
30 const char kJsScreenPath
[] = "login.UserImageScreen";
36 UserImageScreenHandler::UserImageScreenHandler()
37 : BaseScreenHandler(kJsScreenPath
),
41 ui::ResourceBundle
& bundle
= ui::ResourceBundle::GetSharedInstance();
42 media::SoundsManager
* manager
= media::SoundsManager::Get();
43 manager
->Initialize(SOUND_OBJECT_DELETE
,
44 bundle
.GetRawDataResource(IDR_SOUND_OBJECT_DELETE_WAV
));
45 manager
->Initialize(SOUND_CAMERA_SNAP
,
46 bundle
.GetRawDataResource(IDR_SOUND_CAMERA_SNAP_WAV
));
49 UserImageScreenHandler::~UserImageScreenHandler() {
51 screen_
->OnActorDestroyed(this);
55 void UserImageScreenHandler::Initialize() {
58 show_on_init_
= false;
62 void UserImageScreenHandler::SetDelegate(
63 UserImageScreenActor::Delegate
* screen
) {
67 void UserImageScreenHandler::Show() {
68 if (!page_is_ready()) {
72 screen_show_time_
= base::Time::Now();
73 ShowScreen(OobeUI::kScreenUserImagePicker
, NULL
);
75 // When shown, query camera presence.
79 screen_
->OnScreenReady();
82 void UserImageScreenHandler::Hide() {
85 void UserImageScreenHandler::PrepareToShow() {
88 void UserImageScreenHandler::DeclareLocalizedValues(
89 LocalizedValuesBuilder
* builder
) {
90 builder
->Add("userImageScreenTitle", IDS_USER_IMAGE_SCREEN_TITLE
);
91 builder
->Add("userImageScreenDescription",
92 IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TEXT
);
93 builder
->Add("takePhoto", IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO
);
94 builder
->Add("discardPhoto", IDS_OPTIONS_CHANGE_PICTURE_DISCARD_PHOTO
);
95 builder
->Add("flipPhoto", IDS_OPTIONS_CHANGE_PICTURE_FLIP_PHOTO
);
96 builder
->Add("profilePhoto", IDS_IMAGE_SCREEN_PROFILE_PHOTO
);
97 builder
->Add("profilePhotoLoading",
98 IDS_IMAGE_SCREEN_PROFILE_LOADING_PHOTO
);
99 builder
->Add("okButtonText", IDS_OK
);
100 builder
->Add("authorCredit", IDS_OPTIONS_SET_WALLPAPER_AUTHOR_TEXT
);
101 builder
->Add("photoFromCamera", IDS_OPTIONS_CHANGE_PICTURE_PHOTO_FROM_CAMERA
);
102 builder
->Add("photoFlippedAccessibleText",
103 IDS_OPTIONS_PHOTO_FLIP_ACCESSIBLE_TEXT
);
104 builder
->Add("photoFlippedBackAccessibleText",
105 IDS_OPTIONS_PHOTO_FLIPBACK_ACCESSIBLE_TEXT
);
106 builder
->Add("photoCaptureAccessibleText",
107 IDS_OPTIONS_PHOTO_CAPTURE_ACCESSIBLE_TEXT
);
108 builder
->Add("photoDiscardAccessibleText",
109 IDS_OPTIONS_PHOTO_DISCARD_ACCESSIBLE_TEXT
);
110 builder
->Add("syncingPreferences", IDS_IMAGE_SCREEN_SYNCING_PREFERENCES
);
113 void UserImageScreenHandler::RegisterMessages() {
114 AddCallback("getImages", &UserImageScreenHandler::HandleGetImages
);
115 AddCallback("screenReady", &UserImageScreenHandler::HandleScreenReady
);
116 AddCallback("takePhoto", &UserImageScreenHandler::HandleTakePhoto
);
117 AddCallback("discardPhoto", &UserImageScreenHandler::HandleDiscardPhoto
);
118 AddCallback("photoTaken", &UserImageScreenHandler::HandlePhotoTaken
);
119 AddCallback("selectImage", &UserImageScreenHandler::HandleSelectImage
);
120 AddCallback("onUserImageAccepted",
121 &UserImageScreenHandler::HandleImageAccepted
);
122 AddCallback("onUserImageScreenShown",
123 &UserImageScreenHandler::HandleScreenShown
);
126 void UserImageScreenHandler::SelectImage(int index
) {
128 CallJS("setSelectedImage", user_manager::GetDefaultImageUrl(index
));
131 void UserImageScreenHandler::SendProfileImage(const std::string
& data_url
) {
133 CallJS("setProfileImage", data_url
);
136 void UserImageScreenHandler::OnProfileImageAbsent() {
137 if (page_is_ready()) {
138 scoped_ptr
<base::Value
> null_value(base::Value::CreateNullValue());
139 CallJS("setProfileImage", *null_value
);
143 // TODO(antrim) : It looks more like parameters for "Init" rather than callback.
144 void UserImageScreenHandler::HandleGetImages() {
145 base::ListValue image_urls
;
146 for (int i
= user_manager::kFirstDefaultImageIndex
;
147 i
< user_manager::kDefaultImagesCount
;
149 scoped_ptr
<base::DictionaryValue
> image_data(new base::DictionaryValue
);
150 image_data
->SetString("url", user_manager::GetDefaultImageUrl(i
));
151 image_data
->SetString(
153 l10n_util::GetStringUTF16(user_manager::kDefaultImageAuthorIDs
[i
]));
154 image_data
->SetString(
156 l10n_util::GetStringUTF16(user_manager::kDefaultImageWebsiteIDs
[i
]));
157 image_data
->SetString("title", user_manager::GetDefaultImageDescription(i
));
158 image_urls
.Append(image_data
.release());
160 CallJS("setDefaultImages", image_urls
);
163 if (screen_
->selected_image() != user_manager::User::USER_IMAGE_INVALID
)
164 SelectImage(screen_
->selected_image());
166 if (screen_
->profile_picture_data_url() != url::kAboutBlankURL
)
167 SendProfileImage(screen_
->profile_picture_data_url());
168 else if (screen_
->profile_picture_absent())
169 OnProfileImageAbsent();
172 void UserImageScreenHandler::HandleScreenReady() {
175 screen_
->OnScreenReady();
178 void UserImageScreenHandler::HandlePhotoTaken(const std::string
& image_url
) {
179 std::string mime_type
, charset
, raw_data
;
180 if (!net::DataURL::Parse(GURL(image_url
), &mime_type
, &charset
, &raw_data
))
182 DCHECK_EQ("image/png", mime_type
);
185 screen_
->OnPhotoTaken(raw_data
);
188 void UserImageScreenHandler::HandleTakePhoto() {
189 ash::PlaySystemSoundIfSpokenFeedback(SOUND_CAMERA_SNAP
);
192 void UserImageScreenHandler::HandleDiscardPhoto() {
193 ash::PlaySystemSoundIfSpokenFeedback(SOUND_OBJECT_DELETE
);
196 void UserImageScreenHandler::HandleSelectImage(const std::string
& image_url
,
197 const std::string
& image_type
,
198 bool is_user_selection
) {
200 screen_
->OnImageSelected(image_type
, image_url
, is_user_selection
);
203 void UserImageScreenHandler::HandleImageAccepted() {
205 screen_
->OnImageAccepted();
208 void UserImageScreenHandler::HandleScreenShown() {
209 DCHECK(!screen_show_time_
.is_null());
211 base::TimeDelta delta
= base::Time::Now() - screen_show_time_
;
212 VLOG(1) << "Screen load time: " << delta
.InSecondsF();
213 UMA_HISTOGRAM_TIMES("UserImage.ScreenIsShownTime", delta
);
216 void UserImageScreenHandler::SetCameraPresent(bool present
) {
217 CallJS("setCameraPresent", present
);
220 void UserImageScreenHandler::HideCurtain() {
221 CallJS("hideCurtain");
224 } // namespace chromeos