| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 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/options/chromeos/change_picture_options_handle
r.h" | 5 #include "chrome/browser/ui/webui/options/chromeos/change_picture_options_handle
r.h" |
| 6 | 6 |
| 7 #include "ash/audio/sounds.h" | 7 #include "ash/audio/sounds.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
| 12 #include "base/path_service.h" | 12 #include "base/path_service.h" |
| 13 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
| 14 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
| 15 #include "base/values.h" | 15 #include "base/values.h" |
| 16 #include "chrome/browser/chrome_notification_types.h" | 16 #include "chrome/browser/chrome_notification_types.h" |
| 17 #include "chrome/browser/chromeos/camera_presence_notifier.h" | 17 #include "chrome/browser/chromeos/camera_presence_notifier.h" |
| 18 #include "chrome/browser/chromeos/login/users/avatar/user_image_manager.h" | 18 #include "chrome/browser/chromeos/login/users/avatar/user_image_manager.h" |
| 19 #include "chrome/browser/chromeos/login/users/user_manager.h" | 19 #include "chrome/browser/chromeos/login/users/user_manager.h" |
| 20 #include "chrome/browser/chromeos/profiles/profile_helper.h" | 20 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
| 21 #include "chrome/browser/ui/browser_finder.h" | 21 #include "chrome/browser/ui/browser_finder.h" |
| 22 #include "chrome/browser/ui/browser_window.h" | 22 #include "chrome/browser/ui/browser_window.h" |
| 23 #include "chrome/browser/ui/chrome_select_file_policy.h" | 23 #include "chrome/browser/ui/chrome_select_file_policy.h" |
| 24 #include "chrome/common/chrome_paths.h" | 24 #include "chrome/common/chrome_paths.h" |
| 25 #include "chrome/common/chrome_switches.h" | 25 #include "chrome/common/chrome_switches.h" |
| 26 #include "chrome/common/url_constants.h" | 26 #include "chrome/common/url_constants.h" |
| 27 #include "chromeos/audio/chromeos_sounds.h" | 27 #include "chromeos/audio/chromeos_sounds.h" |
| 28 #include "components/user_manager/user.h" |
| 28 #include "components/user_manager/user_image/default_user_images.h" | 29 #include "components/user_manager/user_image/default_user_images.h" |
| 29 #include "components/user_manager/user_image/user_image.h" | 30 #include "components/user_manager/user_image/user_image.h" |
| 30 #include "content/public/browser/browser_thread.h" | 31 #include "content/public/browser/browser_thread.h" |
| 31 #include "content/public/browser/notification_service.h" | 32 #include "content/public/browser/notification_service.h" |
| 32 #include "content/public/browser/web_ui.h" | 33 #include "content/public/browser/web_ui.h" |
| 33 #include "content/public/common/url_constants.h" | 34 #include "content/public/common/url_constants.h" |
| 34 #include "grit/browser_resources.h" | 35 #include "grit/browser_resources.h" |
| 35 #include "grit/generated_resources.h" | 36 #include "grit/generated_resources.h" |
| 36 #include "grit/theme_resources.h" | 37 #include "grit/theme_resources.h" |
| 37 #include "net/base/data_url.h" | 38 #include "net/base/data_url.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 return file_type_info; | 71 return file_type_info; |
| 71 } | 72 } |
| 72 | 73 |
| 73 // Time histogram suffix for profile image download. | 74 // Time histogram suffix for profile image download. |
| 74 const char kProfileDownloadReason[] = "Preferences"; | 75 const char kProfileDownloadReason[] = "Preferences"; |
| 75 | 76 |
| 76 } // namespace | 77 } // namespace |
| 77 | 78 |
| 78 ChangePictureOptionsHandler::ChangePictureOptionsHandler() | 79 ChangePictureOptionsHandler::ChangePictureOptionsHandler() |
| 79 : previous_image_url_(url::kAboutBlankURL), | 80 : previous_image_url_(url::kAboutBlankURL), |
| 80 previous_image_index_(User::kInvalidImageIndex) { | 81 previous_image_index_(user_manager::User::USER_IMAGE_INVALID) { |
| 81 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED, | 82 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED, |
| 82 content::NotificationService::AllSources()); | 83 content::NotificationService::AllSources()); |
| 83 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATE_FAILED, | 84 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_IMAGE_UPDATE_FAILED, |
| 84 content::NotificationService::AllSources()); | 85 content::NotificationService::AllSources()); |
| 85 registrar_.Add(this, chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED, | 86 registrar_.Add(this, chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED, |
| 86 content::NotificationService::AllSources()); | 87 content::NotificationService::AllSources()); |
| 87 | 88 |
| 88 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); | 89 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); |
| 89 media::SoundsManager* manager = media::SoundsManager::Get(); | 90 media::SoundsManager* manager = media::SoundsManager::Get(); |
| 90 manager->Initialize(SOUND_OBJECT_DELETE, | 91 manager->Initialize(SOUND_OBJECT_DELETE, |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 UpdateProfileImage(); | 261 UpdateProfileImage(); |
| 261 CameraPresenceNotifier::GetInstance()->AddObserver(this); | 262 CameraPresenceNotifier::GetInstance()->AddObserver(this); |
| 262 } | 263 } |
| 263 | 264 |
| 264 void ChangePictureOptionsHandler::HandlePageHidden( | 265 void ChangePictureOptionsHandler::HandlePageHidden( |
| 265 const base::ListValue* args) { | 266 const base::ListValue* args) { |
| 266 CameraPresenceNotifier::GetInstance()->RemoveObserver(this); | 267 CameraPresenceNotifier::GetInstance()->RemoveObserver(this); |
| 267 } | 268 } |
| 268 | 269 |
| 269 void ChangePictureOptionsHandler::SendSelectedImage() { | 270 void ChangePictureOptionsHandler::SendSelectedImage() { |
| 270 const User* user = GetUser(); | 271 const user_manager::User* user = GetUser(); |
| 271 DCHECK(!user->email().empty()); | 272 DCHECK(!user->email().empty()); |
| 272 | 273 |
| 273 previous_image_index_ = user->image_index(); | 274 previous_image_index_ = user->image_index(); |
| 274 switch (previous_image_index_) { | 275 switch (previous_image_index_) { |
| 275 case User::kExternalImageIndex: { | 276 case user_manager::User::USER_IMAGE_EXTERNAL: { |
| 276 // User has image from camera/file, record it and add to the image list. | 277 // User has image from camera/file, record it and add to the image list. |
| 277 previous_image_ = user->GetImage(); | 278 previous_image_ = user->GetImage(); |
| 278 SendOldImage(webui::GetBitmapDataUrl(*previous_image_.bitmap())); | 279 SendOldImage(webui::GetBitmapDataUrl(*previous_image_.bitmap())); |
| 279 break; | 280 break; |
| 280 } | 281 } |
| 281 case User::kProfileImageIndex: { | 282 case user_manager::User::USER_IMAGE_PROFILE: { |
| 282 // User has his/her Profile image as the current image. | 283 // User has his/her Profile image as the current image. |
| 283 SendProfileImage(user->GetImage(), true); | 284 SendProfileImage(user->GetImage(), true); |
| 284 break; | 285 break; |
| 285 } | 286 } |
| 286 default: { | 287 default: { |
| 287 DCHECK(previous_image_index_ >= 0 && | 288 DCHECK(previous_image_index_ >= 0 && |
| 288 previous_image_index_ < user_manager::kDefaultImagesCount); | 289 previous_image_index_ < user_manager::kDefaultImagesCount); |
| 289 if (previous_image_index_ >= user_manager::kFirstDefaultImageIndex) { | 290 if (previous_image_index_ >= user_manager::kFirstDefaultImageIndex) { |
| 290 // User has image from the current set of default images. | 291 // User has image from the current set of default images. |
| 291 base::StringValue image_url( | 292 base::StringValue image_url( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 307 base::FundamentalValue select(should_select); | 308 base::FundamentalValue select(should_select); |
| 308 web_ui()->CallJavascriptFunction("ChangePictureOptions.setProfileImage", | 309 web_ui()->CallJavascriptFunction("ChangePictureOptions.setProfileImage", |
| 309 data_url, select); | 310 data_url, select); |
| 310 } | 311 } |
| 311 | 312 |
| 312 void ChangePictureOptionsHandler::UpdateProfileImage() { | 313 void ChangePictureOptionsHandler::UpdateProfileImage() { |
| 313 UserImageManager* user_image_manager = | 314 UserImageManager* user_image_manager = |
| 314 UserManager::Get()->GetUserImageManager(GetUser()->email()); | 315 UserManager::Get()->GetUserImageManager(GetUser()->email()); |
| 315 // If we have a downloaded profile image and haven't sent it in | 316 // If we have a downloaded profile image and haven't sent it in |
| 316 // |SendSelectedImage|, send it now (without selecting). | 317 // |SendSelectedImage|, send it now (without selecting). |
| 317 if (previous_image_index_ != User::kProfileImageIndex && | 318 if (previous_image_index_ != user_manager::User::USER_IMAGE_PROFILE && |
| 318 !user_image_manager->DownloadedProfileImage().isNull()) | 319 !user_image_manager->DownloadedProfileImage().isNull()) |
| 319 SendProfileImage(user_image_manager->DownloadedProfileImage(), false); | 320 SendProfileImage(user_image_manager->DownloadedProfileImage(), false); |
| 320 | 321 |
| 321 user_image_manager->DownloadProfileImage(kProfileDownloadReason); | 322 user_image_manager->DownloadProfileImage(kProfileDownloadReason); |
| 322 } | 323 } |
| 323 | 324 |
| 324 void ChangePictureOptionsHandler::SendOldImage(const std::string& image_url) { | 325 void ChangePictureOptionsHandler::SendOldImage(const std::string& image_url) { |
| 325 previous_image_url_ = image_url; | 326 previous_image_url_ = image_url; |
| 326 base::StringValue url(image_url); | 327 base::StringValue url(image_url); |
| 327 web_ui()->CallJavascriptFunction("ChangePictureOptions.setOldImage", url); | 328 web_ui()->CallJavascriptFunction("ChangePictureOptions.setOldImage", url); |
| 328 } | 329 } |
| 329 | 330 |
| 330 void ChangePictureOptionsHandler::HandleSelectImage( | 331 void ChangePictureOptionsHandler::HandleSelectImage( |
| 331 const base::ListValue* args) { | 332 const base::ListValue* args) { |
| 332 std::string image_url; | 333 std::string image_url; |
| 333 std::string image_type; | 334 std::string image_type; |
| 334 if (!args || | 335 if (!args || |
| 335 args->GetSize() != 2 || | 336 args->GetSize() != 2 || |
| 336 !args->GetString(0, &image_url) || | 337 !args->GetString(0, &image_url) || |
| 337 !args->GetString(1, &image_type)) { | 338 !args->GetString(1, &image_type)) { |
| 338 NOTREACHED(); | 339 NOTREACHED(); |
| 339 return; | 340 return; |
| 340 } | 341 } |
| 341 DCHECK(!image_url.empty()); | 342 DCHECK(!image_url.empty()); |
| 342 DCHECK(!image_type.empty()); | 343 DCHECK(!image_type.empty()); |
| 343 | 344 |
| 344 UserImageManager* user_image_manager = | 345 UserImageManager* user_image_manager = |
| 345 UserManager::Get()->GetUserImageManager(GetUser()->email()); | 346 UserManager::Get()->GetUserImageManager(GetUser()->email()); |
| 346 int image_index = User::kInvalidImageIndex; | 347 int image_index = user_manager::User::USER_IMAGE_INVALID; |
| 347 bool waiting_for_camera_photo = false; | 348 bool waiting_for_camera_photo = false; |
| 348 | 349 |
| 349 if (image_type == "old") { | 350 if (image_type == "old") { |
| 350 // Previous image (from camera or manually uploaded) re-selected. | 351 // Previous image (from camera or manually uploaded) re-selected. |
| 351 DCHECK(!previous_image_.isNull()); | 352 DCHECK(!previous_image_.isNull()); |
| 352 user_image_manager->SaveUserImage( | 353 user_image_manager->SaveUserImage( |
| 353 user_manager::UserImage::CreateAndEncode(previous_image_)); | 354 user_manager::UserImage::CreateAndEncode(previous_image_)); |
| 354 | 355 |
| 355 UMA_HISTOGRAM_ENUMERATION("UserImage.ChangeChoice", | 356 UMA_HISTOGRAM_ENUMERATION("UserImage.ChangeChoice", |
| 356 user_manager::kHistogramImageOld, | 357 user_manager::kHistogramImageOld, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 372 DCHECK(image_decoder_.get()); | 373 DCHECK(image_decoder_.get()); |
| 373 waiting_for_camera_photo = true; | 374 waiting_for_camera_photo = true; |
| 374 VLOG(1) << "Still waiting for camera image to decode"; | 375 VLOG(1) << "Still waiting for camera image to decode"; |
| 375 } else { | 376 } else { |
| 376 SetImageFromCamera(user_photo_); | 377 SetImageFromCamera(user_photo_); |
| 377 } | 378 } |
| 378 } else if (image_type == "profile") { | 379 } else if (image_type == "profile") { |
| 379 // Profile image selected. Could be previous (old) user image. | 380 // Profile image selected. Could be previous (old) user image. |
| 380 user_image_manager->SaveUserImageFromProfileImage(); | 381 user_image_manager->SaveUserImageFromProfileImage(); |
| 381 | 382 |
| 382 if (previous_image_index_ == User::kProfileImageIndex) { | 383 if (previous_image_index_ == user_manager::User::USER_IMAGE_PROFILE) { |
| 383 UMA_HISTOGRAM_ENUMERATION("UserImage.ChangeChoice", | 384 UMA_HISTOGRAM_ENUMERATION("UserImage.ChangeChoice", |
| 384 user_manager::kHistogramImageOld, | 385 user_manager::kHistogramImageOld, |
| 385 user_manager::kHistogramImagesCount); | 386 user_manager::kHistogramImagesCount); |
| 386 VLOG(1) << "Selected old (profile) user image"; | 387 VLOG(1) << "Selected old (profile) user image"; |
| 387 } else { | 388 } else { |
| 388 UMA_HISTOGRAM_ENUMERATION("UserImage.ChangeChoice", | 389 UMA_HISTOGRAM_ENUMERATION("UserImage.ChangeChoice", |
| 389 user_manager::kHistogramImageFromProfile, | 390 user_manager::kHistogramImageFromProfile, |
| 390 user_manager::kHistogramImagesCount); | 391 user_manager::kHistogramImagesCount); |
| 391 VLOG(1) << "Selected profile image"; | 392 VLOG(1) << "Selected profile image"; |
| 392 } | 393 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 void ChangePictureOptionsHandler::Observe( | 438 void ChangePictureOptionsHandler::Observe( |
| 438 int type, | 439 int type, |
| 439 const content::NotificationSource& source, | 440 const content::NotificationSource& source, |
| 440 const content::NotificationDetails& details) { | 441 const content::NotificationDetails& details) { |
| 441 if (type == chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED) { | 442 if (type == chrome::NOTIFICATION_PROFILE_IMAGE_UPDATED) { |
| 442 // User profile image has been updated. | 443 // User profile image has been updated. |
| 443 SendProfileImage(*content::Details<const gfx::ImageSkia>(details).ptr(), | 444 SendProfileImage(*content::Details<const gfx::ImageSkia>(details).ptr(), |
| 444 false); | 445 false); |
| 445 } else if (type == chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED) { | 446 } else if (type == chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED) { |
| 446 // Not initialized yet. | 447 // Not initialized yet. |
| 447 if (previous_image_index_ == User::kInvalidImageIndex) | 448 if (previous_image_index_ == user_manager::User::USER_IMAGE_INVALID) |
| 448 return; | 449 return; |
| 449 SendSelectedImage(); | 450 SendSelectedImage(); |
| 450 } | 451 } |
| 451 } | 452 } |
| 452 | 453 |
| 453 gfx::NativeWindow ChangePictureOptionsHandler::GetBrowserWindow() const { | 454 gfx::NativeWindow ChangePictureOptionsHandler::GetBrowserWindow() const { |
| 454 Browser* browser = | 455 Browser* browser = |
| 455 chrome::FindBrowserWithWebContents(web_ui()->GetWebContents()); | 456 chrome::FindBrowserWithWebContents(web_ui()->GetWebContents()); |
| 456 return browser->window()->GetNativeWindow(); | 457 return browser->window()->GetNativeWindow(); |
| 457 } | 458 } |
| 458 | 459 |
| 459 void ChangePictureOptionsHandler::OnImageDecoded( | 460 void ChangePictureOptionsHandler::OnImageDecoded( |
| 460 const ImageDecoder* decoder, | 461 const ImageDecoder* decoder, |
| 461 const SkBitmap& decoded_image) { | 462 const SkBitmap& decoded_image) { |
| 462 DCHECK_EQ(image_decoder_.get(), decoder); | 463 DCHECK_EQ(image_decoder_.get(), decoder); |
| 463 image_decoder_ = NULL; | 464 image_decoder_ = NULL; |
| 464 user_photo_ = gfx::ImageSkia::CreateFrom1xBitmap(decoded_image); | 465 user_photo_ = gfx::ImageSkia::CreateFrom1xBitmap(decoded_image); |
| 465 SetImageFromCamera(user_photo_); | 466 SetImageFromCamera(user_photo_); |
| 466 } | 467 } |
| 467 | 468 |
| 468 void ChangePictureOptionsHandler::OnDecodeImageFailed( | 469 void ChangePictureOptionsHandler::OnDecodeImageFailed( |
| 469 const ImageDecoder* decoder) { | 470 const ImageDecoder* decoder) { |
| 470 NOTREACHED() << "Failed to decode PNG image from WebUI"; | 471 NOTREACHED() << "Failed to decode PNG image from WebUI"; |
| 471 } | 472 } |
| 472 | 473 |
| 473 User* ChangePictureOptionsHandler::GetUser() const { | 474 user_manager::User* ChangePictureOptionsHandler::GetUser() const { |
| 474 Profile* profile = Profile::FromWebUI(web_ui()); | 475 Profile* profile = Profile::FromWebUI(web_ui()); |
| 475 User* user = ProfileHelper::Get()->GetUserByProfile(profile); | 476 user_manager::User* user = ProfileHelper::Get()->GetUserByProfile(profile); |
| 476 if (!user) | 477 if (!user) |
| 477 return UserManager::Get()->GetActiveUser(); | 478 return UserManager::Get()->GetActiveUser(); |
| 478 return user; | 479 return user; |
| 479 } | 480 } |
| 480 | 481 |
| 481 } // namespace options | 482 } // namespace options |
| 482 } // namespace chromeos | 483 } // namespace chromeos |
| OLD | NEW |