Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(382)

Side by Side Diff: chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.cc

Issue 10532048: [cros] Initial WebRTC-enabled implementation of user image picker on OOBE. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Revert ImageDecoder changes. Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.h" 5 #include "chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/command_line.h"
9 #include "base/logging.h" 10 #include "base/logging.h"
10 #include "base/metrics/histogram.h" 11 #include "base/metrics/histogram.h"
11 #include "base/values.h" 12 #include "base/values.h"
12 #include "chrome/browser/chromeos/login/camera_detector.h" 13 #include "chrome/browser/chromeos/login/camera_detector.h"
13 #include "chrome/browser/chromeos/login/default_user_images.h" 14 #include "chrome/browser/chromeos/login/default_user_images.h"
14 #include "chrome/browser/chromeos/login/user.h" 15 #include "chrome/browser/chromeos/login/user.h"
15 #include "chrome/browser/chromeos/login/webui_login_display.h" 16 #include "chrome/browser/chromeos/login/webui_login_display.h"
16 #include "chrome/browser/chromeos/options/take_photo_dialog.h" 17 #include "chrome/browser/chromeos/options/take_photo_dialog.h"
17 #include "chrome/browser/ui/webui/web_ui_util.h" 18 #include "chrome/browser/ui/webui/web_ui_util.h"
19 #include "chrome/common/chrome_switches.h"
18 #include "chrome/common/url_constants.h" 20 #include "chrome/common/url_constants.h"
21 #include "googleurl/src/gurl.h"
19 #include "grit/generated_resources.h" 22 #include "grit/generated_resources.h"
23 #include "net/base/data_url.h"
20 #include "ui/base/l10n/l10n_util.h" 24 #include "ui/base/l10n/l10n_util.h"
21 #include "ui/views/widget/widget.h" 25 #include "ui/views/widget/widget.h"
22 26
23 namespace { 27 namespace {
24 28
25 // UserImage screen ID. 29 // UserImage screen ID.
26 const char kUserImageScreen[] = "user-image"; 30 const char kUserImageScreen[] = "user-image";
27 31
28 } // namespace 32 } // namespace
29 33
30 namespace chromeos { 34 namespace chromeos {
31 35
32 UserImageScreenHandler::UserImageScreenHandler() 36 UserImageScreenHandler::UserImageScreenHandler()
33 : screen_(NULL), 37 : screen_(NULL),
34 show_on_init_(false), 38 show_on_init_(false),
35 selected_image_(User::kInvalidImageIndex), 39 selected_image_(User::kInvalidImageIndex),
40 accept_photo_after_decoding_(false),
36 user_photo_data_url_(chrome::kAboutBlankURL), 41 user_photo_data_url_(chrome::kAboutBlankURL),
37 profile_picture_data_url_(chrome::kAboutBlankURL), 42 profile_picture_data_url_(chrome::kAboutBlankURL),
38 profile_picture_absent_(false), 43 profile_picture_absent_(false),
39 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { 44 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
40 } 45 }
41 46
42 UserImageScreenHandler::~UserImageScreenHandler() { 47 UserImageScreenHandler::~UserImageScreenHandler() {
43 if (screen_) 48 if (screen_)
44 screen_->OnActorDestroyed(this); 49 screen_->OnActorDestroyed(this);
50 if (image_decoder_.get())
51 image_decoder_->set_delegate(NULL);
45 } 52 }
46 53
47 void UserImageScreenHandler::GetLocalizedStrings( 54 void UserImageScreenHandler::GetLocalizedStrings(
48 DictionaryValue *localized_strings) { 55 DictionaryValue *localized_strings) {
49 // TODO(ivankr): string should be renamed to something like 56 // TODO(ivankr): string should be renamed to something like
50 // IDS_USER_IMAGE_SCREEN_TITLE (currently used for Take Photo dialog). 57 // IDS_USER_IMAGE_SCREEN_TITLE (currently used for Take Photo dialog).
51 localized_strings->SetString("userImageScreenTitle", 58 localized_strings->SetString("userImageScreenTitle",
52 l10n_util::GetStringUTF16(IDS_OOBE_PICTURE)); 59 l10n_util::GetStringUTF16(IDS_OOBE_PICTURE));
53 localized_strings->SetString("userImageScreenDescription", 60 localized_strings->SetString("userImageScreenDescription",
54 l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TEXT)); 61 l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_DIALOG_TEXT));
55 localized_strings->SetString("takePhoto", 62 localized_strings->SetString("takePhoto",
56 l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO)); 63 l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO));
57 localized_strings->SetString("profilePhoto", 64 localized_strings->SetString("profilePhoto",
58 l10n_util::GetStringUTF16(IDS_IMAGE_SCREEN_PROFILE_PHOTO)); 65 l10n_util::GetStringUTF16(IDS_IMAGE_SCREEN_PROFILE_PHOTO));
59 localized_strings->SetString("profilePhotoLoading", 66 localized_strings->SetString("profilePhotoLoading",
60 l10n_util::GetStringUTF16(IDS_IMAGE_SCREEN_PROFILE_LOADING_PHOTO)); 67 l10n_util::GetStringUTF16(IDS_IMAGE_SCREEN_PROFILE_LOADING_PHOTO));
61 localized_strings->SetString("okButtonText", 68 localized_strings->SetString("okButtonText",
62 l10n_util::GetStringUTF16(IDS_OK)); 69 l10n_util::GetStringUTF16(IDS_OK));
70 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableHtml5Camera))
71 localized_strings->SetString("cameraType", "webrtc");
72 else
73 localized_strings->SetString("cameraType", "old");
63 } 74 }
64 75
65 void UserImageScreenHandler::Initialize() { 76 void UserImageScreenHandler::Initialize() {
66 ListValue image_urls; 77 ListValue image_urls;
67 for (int i = 0; i < kDefaultImagesCount; ++i) { 78 for (int i = 0; i < kDefaultImagesCount; ++i) {
68 image_urls.Append(new StringValue(GetDefaultImageUrl(i))); 79 image_urls.Append(new StringValue(GetDefaultImageUrl(i)));
69 } 80 }
70 web_ui()->CallJavascriptFunction("oobe.UserImageScreen.setUserImages", 81 web_ui()->CallJavascriptFunction("oobe.UserImageScreen.setUserImages",
71 image_urls); 82 image_urls);
72 83
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 void UserImageScreenHandler::UpdateVideoFrame(const SkBitmap& frame) { 131 void UserImageScreenHandler::UpdateVideoFrame(const SkBitmap& frame) {
121 } 132 }
122 133
123 void UserImageScreenHandler::ShowCameraError() { 134 void UserImageScreenHandler::ShowCameraError() {
124 } 135 }
125 136
126 void UserImageScreenHandler::ShowCameraInitializing() { 137 void UserImageScreenHandler::ShowCameraInitializing() {
127 } 138 }
128 139
129 void UserImageScreenHandler::CheckCameraPresence() { 140 void UserImageScreenHandler::CheckCameraPresence() {
141 // For WebRTC, camera presence checked is done on JS side.
142 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableHtml5Camera))
143 return;
130 CameraDetector::StartPresenceCheck( 144 CameraDetector::StartPresenceCheck(
131 base::Bind(&UserImageScreenHandler::OnCameraPresenceCheckDone, 145 base::Bind(&UserImageScreenHandler::OnCameraPresenceCheckDone,
132 weak_factory_.GetWeakPtr())); 146 weak_factory_.GetWeakPtr()));
133 } 147 }
134 148
135 bool UserImageScreenHandler::IsCapturing() const { 149 bool UserImageScreenHandler::IsCapturing() const {
136 return false; 150 return false;
137 } 151 }
138 152
139 void UserImageScreenHandler::RegisterMessages() { 153 void UserImageScreenHandler::RegisterMessages() {
140 web_ui()->RegisterMessageCallback("takePhoto", 154 web_ui()->RegisterMessageCallback("takePhoto",
141 base::Bind(&UserImageScreenHandler::HandleTakePhoto, 155 base::Bind(&UserImageScreenHandler::HandleTakePhoto,
142 base::Unretained(this))); 156 base::Unretained(this)));
157 web_ui()->RegisterMessageCallback("photoTaken",
158 base::Bind(&UserImageScreenHandler::HandlePhotoTaken,
159 base::Unretained(this)));
143 web_ui()->RegisterMessageCallback("selectImage", 160 web_ui()->RegisterMessageCallback("selectImage",
144 base::Bind(&UserImageScreenHandler::HandleSelectImage, 161 base::Bind(&UserImageScreenHandler::HandleSelectImage,
145 base::Unretained(this))); 162 base::Unretained(this)));
146 web_ui()->RegisterMessageCallback("onUserImageAccepted", 163 web_ui()->RegisterMessageCallback("onUserImageAccepted",
147 base::Bind(&UserImageScreenHandler::HandleImageAccepted, 164 base::Bind(&UserImageScreenHandler::HandleImageAccepted,
148 base::Unretained(this))); 165 base::Unretained(this)));
149 web_ui()->RegisterMessageCallback("onUserImageScreenShown", 166 web_ui()->RegisterMessageCallback("onUserImageScreenShown",
150 base::Bind(&UserImageScreenHandler::HandleScreenShown, 167 base::Bind(&UserImageScreenHandler::HandleScreenShown,
151 base::Unretained(this))); 168 base::Unretained(this)));
152 } 169 }
(...skipping 22 matching lines...) Expand all
175 192
176 void UserImageScreenHandler::OnPhotoAccepted(const gfx::ImageSkia& photo) { 193 void UserImageScreenHandler::OnPhotoAccepted(const gfx::ImageSkia& photo) {
177 user_photo_ = photo; 194 user_photo_ = photo;
178 user_photo_data_url_ = web_ui_util::GetImageDataUrl(user_photo_); 195 user_photo_data_url_ = web_ui_util::GetImageDataUrl(user_photo_);
179 selected_image_ = User::kExternalImageIndex; 196 selected_image_ = User::kExternalImageIndex;
180 base::StringValue data_url(user_photo_data_url_); 197 base::StringValue data_url(user_photo_data_url_);
181 web_ui()->CallJavascriptFunction("oobe.UserImageScreen.setUserPhoto", 198 web_ui()->CallJavascriptFunction("oobe.UserImageScreen.setUserPhoto",
182 data_url); 199 data_url);
183 } 200 }
184 201
202 void UserImageScreenHandler::HandlePhotoTaken(const base::ListValue* args) {
203 std::string image_url;
204 if (!args || args->GetSize() != 1 || !args->GetString(0, &image_url))
205 NOTREACHED();
206 DCHECK(!image_url.empty());
207
208 std::string mime_type, charset, raw_data;
209 if (!net::DataURL::Parse(GURL(image_url), &mime_type, &charset, &raw_data))
210 NOTREACHED();
211 DCHECK_EQ("image/png", mime_type);
212
213 user_photo_ = gfx::ImageSkia();
214 user_photo_data_url_ = image_url;
215
216 if (image_decoder_.get())
217 image_decoder_->set_delegate(NULL);
218 image_decoder_ = new ImageDecoder(this, raw_data);
219 image_decoder_->Start();
220 }
221
185 void UserImageScreenHandler::HandleTakePhoto(const base::ListValue* args) { 222 void UserImageScreenHandler::HandleTakePhoto(const base::ListValue* args) {
186 DCHECK(args && args->empty()); 223 DCHECK(args && args->empty());
187 views::Widget* window = views::Widget::CreateWindowWithParent( 224 views::Widget* window = views::Widget::CreateWindowWithParent(
188 new TakePhotoDialog(this), GetNativeWindow()); 225 new TakePhotoDialog(this), GetNativeWindow());
189 window->SetAlwaysOnTop(true); 226 window->SetAlwaysOnTop(true);
190 window->Show(); 227 window->Show();
191 } 228 }
192 229
193 void UserImageScreenHandler::HandleSelectImage(const base::ListValue* args) { 230 void UserImageScreenHandler::HandleSelectImage(const base::ListValue* args) {
194 std::string image_url; 231 std::string image_url;
195 if (!args || 232 if (!args || args->GetSize() != 1 || !args->GetString(0, &image_url))
196 args->GetSize() != 1 ||
197 !args->GetString(0, &image_url)) {
198 NOTREACHED(); 233 NOTREACHED();
199 return;
200 }
201 if (image_url.empty()) 234 if (image_url.empty())
202 return; 235 return;
203 236
204 int user_image_index = User::kInvalidImageIndex; 237 int user_image_index = User::kInvalidImageIndex;
205 if (IsDefaultImageUrl(image_url, &user_image_index)) { 238 if (IsDefaultImageUrl(image_url, &user_image_index)) {
206 selected_image_ = user_image_index; 239 selected_image_ = user_image_index;
207 } else if (image_url == user_photo_data_url_) { 240 } else if (image_url == user_photo_data_url_) {
208 selected_image_ = User::kExternalImageIndex; 241 selected_image_ = User::kExternalImageIndex;
209 } else { 242 } else {
210 selected_image_ = User::kProfileImageIndex; 243 selected_image_ = User::kProfileImageIndex;
211 } 244 }
212 } 245 }
213 246
214 void UserImageScreenHandler::HandleImageAccepted(const base::ListValue* args) { 247 void UserImageScreenHandler::HandleImageAccepted(const base::ListValue* args) {
215 DCHECK(args && args->empty()); 248 DCHECK(args && args->empty());
216 if (!screen_) 249 if (!screen_)
217 return; 250 return;
218 switch (selected_image_) { 251 switch (selected_image_) {
219 case User::kExternalImageIndex: 252 case User::kExternalImageIndex:
220 screen_->OnPhotoTaken(user_photo_); 253 // Photo decoding may not have been finished yet.
254 if (user_photo_.empty())
255 accept_photo_after_decoding_ = true;
256 else
257 screen_->OnPhotoTaken(user_photo_);
221 break; 258 break;
222 259
223 case User::kProfileImageIndex: 260 case User::kProfileImageIndex:
224 screen_->OnProfileImageSelected(); 261 screen_->OnProfileImageSelected();
225 break; 262 break;
226 263
227 default: 264 default:
228 DCHECK(selected_image_ >= 0 && selected_image_ < kDefaultImagesCount); 265 DCHECK(selected_image_ >= 0 && selected_image_ < kDefaultImagesCount);
229 screen_->OnDefaultImageSelected(selected_image_); 266 screen_->OnDefaultImageSelected(selected_image_);
230 } 267 }
231 } 268 }
232 269
233 void UserImageScreenHandler::HandleScreenShown(const base::ListValue* args) { 270 void UserImageScreenHandler::HandleScreenShown(const base::ListValue* args) {
234 DCHECK(args && args->empty()); 271 DCHECK(args && args->empty());
235 DCHECK(!screen_show_time_.is_null()); 272 DCHECK(!screen_show_time_.is_null());
236 273
237 base::TimeDelta delta = base::Time::Now() - screen_show_time_; 274 base::TimeDelta delta = base::Time::Now() - screen_show_time_;
238 VLOG(1) << "Screen load time: " << delta.InSecondsF(); 275 VLOG(1) << "Screen load time: " << delta.InSecondsF();
239 UMA_HISTOGRAM_TIMES("UserImage.ScreenIsShownTime", delta); 276 UMA_HISTOGRAM_TIMES("UserImage.ScreenIsShownTime", delta);
240 } 277 }
241 278
242 void UserImageScreenHandler::OnCameraPresenceCheckDone() { 279 void UserImageScreenHandler::OnCameraPresenceCheckDone() {
243 base::FundamentalValue present_value( 280 base::FundamentalValue present_value(
244 CameraDetector::camera_presence() == CameraDetector::kCameraPresent); 281 CameraDetector::camera_presence() == CameraDetector::kCameraPresent);
245 web_ui()->CallJavascriptFunction("oobe.UserImageScreen.setCameraPresent", 282 web_ui()->CallJavascriptFunction("oobe.UserImageScreen.setCameraPresent",
246 present_value); 283 present_value);
247 } 284 }
248 285
286 void UserImageScreenHandler::OnImageDecoded(const ImageDecoder* decoder,
287 const SkBitmap& decoded_image) {
288 DCHECK_EQ(image_decoder_.get(), decoder);
289 user_photo_ = gfx::ImageSkia(decoded_image);
290 if (screen_ && accept_photo_after_decoding_)
291 screen_->OnPhotoTaken(user_photo_);
292 }
293
294 void UserImageScreenHandler::OnDecodeImageFailed(const ImageDecoder* decoder) {
295 NOTREACHED() << "Failed to decode PNG image from WebUI";
296 }
297
249 } // namespace chromeos 298 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.h ('k') | chrome/common/chrome_switches.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698