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"
29 const char kJsScreenPath
[] = "login.UserImageScreen";
35 UserImageScreenHandler::UserImageScreenHandler()
36 : BaseScreenHandler(kJsScreenPath
),
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() {
50 screen_
->OnActorDestroyed(this);
54 void UserImageScreenHandler::Initialize() {
57 show_on_init_
= false;
61 void UserImageScreenHandler::SetDelegate(
62 UserImageScreenActor::Delegate
* screen
) {
66 void UserImageScreenHandler::Show() {
67 if (!page_is_ready()) {
71 screen_show_time_
= base::Time::Now();
72 ShowScreen(OobeUI::kScreenUserImagePicker
, NULL
);
74 // When shown, query camera presence.
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
) {
127 CallJS("setSelectedImage", GetDefaultImageUrl(index
));
130 void UserImageScreenHandler::SendProfileImage(const std::string
& data_url
) {
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
);
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() {
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
))
177 DCHECK_EQ("image/png", mime_type
);
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
) {
195 screen_
->OnImageSelected(image_type
, image_url
, is_user_selection
);
198 void UserImageScreenHandler::HandleImageAccepted() {
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