OLD | NEW |
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/chromeos/login/user_manager_impl.h" | 5 #include "chrome/browser/chromeos/login/user_manager_impl.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "ash/shell.h" | 9 #include "ash/shell.h" |
10 #include "ash/desktop_background/desktop_background_controller.h" | 10 #include "ash/desktop_background/desktop_background_controller.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 #include "chrome/browser/chromeos/cros/cert_library.h" | 28 #include "chrome/browser/chromeos/cros/cert_library.h" |
29 #include "chrome/browser/chromeos/cros/cros_library.h" | 29 #include "chrome/browser/chromeos/cros/cros_library.h" |
30 #include "chrome/browser/chromeos/cros_settings.h" | 30 #include "chrome/browser/chromeos/cros_settings.h" |
31 #include "chrome/browser/chromeos/cryptohome/async_method_caller.h" | 31 #include "chrome/browser/chromeos/cryptohome/async_method_caller.h" |
32 #include "chrome/browser/chromeos/input_method/input_method_manager.h" | 32 #include "chrome/browser/chromeos/input_method/input_method_manager.h" |
33 #include "chrome/browser/chromeos/login/default_user_images.h" | 33 #include "chrome/browser/chromeos/login/default_user_images.h" |
34 #include "chrome/browser/chromeos/login/helper.h" | 34 #include "chrome/browser/chromeos/login/helper.h" |
35 #include "chrome/browser/chromeos/login/login_display.h" | 35 #include "chrome/browser/chromeos/login/login_display.h" |
36 #include "chrome/browser/chromeos/login/ownership_service.h" | 36 #include "chrome/browser/chromeos/login/ownership_service.h" |
37 #include "chrome/browser/chromeos/login/remove_user_delegate.h" | 37 #include "chrome/browser/chromeos/login/remove_user_delegate.h" |
| 38 #include "chrome/browser/chromeos/login/user_image.h" |
38 #include "chrome/browser/policy/browser_policy_connector.h" | 39 #include "chrome/browser/policy/browser_policy_connector.h" |
39 #include "chrome/browser/prefs/pref_service.h" | 40 #include "chrome/browser/prefs/pref_service.h" |
40 #include "chrome/browser/prefs/scoped_user_pref_update.h" | 41 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
41 #include "chrome/browser/profiles/profile_downloader.h" | 42 #include "chrome/browser/profiles/profile_downloader.h" |
42 #include "chrome/browser/profiles/profile_manager.h" | 43 #include "chrome/browser/profiles/profile_manager.h" |
43 #include "chrome/browser/sync/profile_sync_service.h" | 44 #include "chrome/browser/sync/profile_sync_service.h" |
44 #include "chrome/browser/sync/profile_sync_service_factory.h" | 45 #include "chrome/browser/sync/profile_sync_service_factory.h" |
45 #include "chrome/browser/ui/webui/web_ui_util.h" | 46 #include "chrome/browser/ui/webui/web_ui_util.h" |
46 #include "chrome/common/chrome_notification_types.h" | 47 #include "chrome/common/chrome_notification_types.h" |
47 #include "chrome/common/chrome_paths.h" | 48 #include "chrome/common/chrome_paths.h" |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 is_current_user_ephemeral_ = true; | 348 is_current_user_ephemeral_ = true; |
348 logged_in_user_ = CreateUser(email); | 349 logged_in_user_ = CreateUser(email); |
349 SetInitialUserImage(email); | 350 SetInitialUserImage(email); |
350 SetInitialUserWallpaper(email); | 351 SetInitialUserWallpaper(email); |
351 NotifyOnLogin(); | 352 NotifyOnLogin(); |
352 } | 353 } |
353 | 354 |
354 void UserManagerImpl::StubUserLoggedIn() { | 355 void UserManagerImpl::StubUserLoggedIn() { |
355 is_current_user_ephemeral_ = true; | 356 is_current_user_ephemeral_ = true; |
356 logged_in_user_ = new User(kStubUser, false); | 357 logged_in_user_ = new User(kStubUser, false); |
357 logged_in_user_->SetImage(GetDefaultImage(kStubDefaultImageIndex), | 358 logged_in_user_->SetImage(UserImage(GetDefaultImage(kStubDefaultImageIndex)), |
358 kStubDefaultImageIndex); | 359 kStubDefaultImageIndex); |
359 } | 360 } |
360 | 361 |
361 void UserManagerImpl::UserSelected(const std::string& email) { | 362 void UserManagerImpl::UserSelected(const std::string& email) { |
362 if (IsKnownUser(email)) { | 363 if (IsKnownUser(email)) { |
363 User::WallpaperType type; | 364 User::WallpaperType type; |
364 int index; | 365 int index; |
365 GetUserWallpaperProperties(email, &type, &index); | 366 GetUserWallpaperProperties(email, &type, &index); |
366 if (type == User::RANDOM) { | 367 if (type == User::RANDOM) { |
367 // Generate a new random wallpaper index if the selected user chose | 368 // Generate a new random wallpaper index if the selected user chose |
368 // RANDOM wallpaper. | 369 // RANDOM wallpaper. |
369 index = ash::GetRandomWallpaperIndex(); | 370 index = ash::GetRandomWallpaperIndex(); |
370 SaveUserWallpaperProperties(email, User::RANDOM, index); | 371 SaveUserWallpaperProperties(email, User::RANDOM, index); |
371 } else if (type == User::CUSTOMIZED) { | 372 } else if (type == User::CUSTOMIZED) { |
372 std::string wallpaper_path = | 373 std::string wallpaper_path = |
373 GetWallpaperPathForUser(email, false).value(); | 374 GetWallpaperPathForUser(email, false).value(); |
374 // In customized mode, we use index pref to save the user selected | 375 // In customized mode, we use index pref to save the user selected |
375 // wallpaper layout. See function SaveWallpaperToLocalState(). | 376 // wallpaper layout. See function SaveWallpaperToLocalState(). |
376 ash::WallpaperLayout layout = static_cast<ash::WallpaperLayout>(index); | 377 ash::WallpaperLayout layout = static_cast<ash::WallpaperLayout>(index); |
377 // Load user image asynchronously. | 378 // Load user image asynchronously. |
378 image_loader_->Start( | 379 image_loader_->Start( |
379 wallpaper_path, 0, | 380 wallpaper_path, 0, false, |
380 base::Bind(&UserManagerImpl::OnCustomWallpaperLoaded, | 381 base::Bind(&UserManagerImpl::OnCustomWallpaperLoaded, |
381 base::Unretained(this), email, layout)); | 382 base::Unretained(this), email, layout)); |
382 return; | 383 return; |
383 } | 384 } |
384 ash::Shell::GetInstance()->desktop_background_controller()-> | 385 ash::Shell::GetInstance()->desktop_background_controller()-> |
385 SetDefaultWallpaper(index); | 386 SetDefaultWallpaper(index); |
386 } | 387 } |
387 } | 388 } |
388 | 389 |
389 void UserManagerImpl::SessionStarted() { | 390 void UserManagerImpl::SessionStarted() { |
390 session_started_ = true; | 391 session_started_ = true; |
391 content::NotificationService::current()->Notify( | 392 content::NotificationService::current()->Notify( |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 | 514 |
514 std::string UserManagerImpl::GetUserDisplayEmail( | 515 std::string UserManagerImpl::GetUserDisplayEmail( |
515 const std::string& username) const { | 516 const std::string& username) const { |
516 const User* user = FindUser(username); | 517 const User* user = FindUser(username); |
517 return user ? user->display_email() : username; | 518 return user ? user->display_email() : username; |
518 } | 519 } |
519 | 520 |
520 void UserManagerImpl::SaveUserDefaultImageIndex(const std::string& username, | 521 void UserManagerImpl::SaveUserDefaultImageIndex(const std::string& username, |
521 int image_index) { | 522 int image_index) { |
522 DCHECK(image_index >= 0 && image_index < kDefaultImagesCount); | 523 DCHECK(image_index >= 0 && image_index < kDefaultImagesCount); |
523 SetUserImage(username, image_index, GetDefaultImage(image_index)); | 524 SetUserImage(username, image_index, UserImage(GetDefaultImage(image_index))); |
524 SaveImageToLocalState(username, "", image_index, false); | 525 SaveImageToLocalState(username, "", image_index, false); |
525 } | 526 } |
526 | 527 |
527 void UserManagerImpl::SaveUserImage(const std::string& username, | 528 void UserManagerImpl::SaveUserImage(const std::string& username, |
528 const SkBitmap& image) { | 529 const UserImage& user_image) { |
529 SaveUserImageInternal(username, User::kExternalImageIndex, image); | 530 SaveUserImageInternal(username, User::kExternalImageIndex, user_image); |
530 } | 531 } |
531 | 532 |
532 void UserManagerImpl::SetLoggedInUserCustomWallpaperLayout( | 533 void UserManagerImpl::SetLoggedInUserCustomWallpaperLayout( |
533 ash::WallpaperLayout layout) { | 534 ash::WallpaperLayout layout) { |
534 // TODO(bshe): We current disabled the customized wallpaper feature for | 535 // TODO(bshe): We current disabled the customized wallpaper feature for |
535 // Ephemeral user. As we dont want to keep a copy of customized wallpaper in | 536 // Ephemeral user. As we dont want to keep a copy of customized wallpaper in |
536 // memory. Need a smarter way to solve this. | 537 // memory. Need a smarter way to solve this. |
537 if (IsCurrentUserEphemeral()) | 538 if (IsCurrentUserEphemeral()) |
538 return; | 539 return; |
539 const chromeos::User& user = GetLoggedInUser(); | 540 const chromeos::User& user = GetLoggedInUser(); |
540 std::string username = user.email(); | 541 std::string username = user.email(); |
541 DCHECK(!username.empty()); | 542 DCHECK(!username.empty()); |
542 | 543 |
543 std::string file_path = GetWallpaperPathForUser(username, false).value(); | 544 std::string file_path = GetWallpaperPathForUser(username, false).value(); |
544 SaveWallpaperToLocalState(username, file_path, layout, User::CUSTOMIZED); | 545 SaveWallpaperToLocalState(username, file_path, layout, User::CUSTOMIZED); |
545 // Load wallpaper from file. | 546 // Load wallpaper from file. |
546 UserSelected(username); | 547 UserSelected(username); |
547 } | 548 } |
548 | 549 |
549 void UserManagerImpl::SaveUserImageFromFile(const std::string& username, | 550 void UserManagerImpl::SaveUserImageFromFile(const std::string& username, |
550 const FilePath& path) { | 551 const FilePath& path) { |
551 image_loader_->Start( | 552 image_loader_->Start( |
552 path.value(), login::kUserImageSize, | 553 path.value(), login::kUserImageSize, true, |
553 base::Bind(&UserManagerImpl::SaveUserImage, | 554 base::Bind(&UserManagerImpl::SaveUserImage, |
554 base::Unretained(this), username)); | 555 base::Unretained(this), username)); |
555 } | 556 } |
556 | 557 |
557 void UserManagerImpl::SaveUserWallpaperFromFile(const std::string& username, | 558 void UserManagerImpl::SaveUserWallpaperFromFile(const std::string& username, |
558 const FilePath& path, | 559 const FilePath& path, |
559 ash::WallpaperLayout layout, | 560 ash::WallpaperLayout layout, |
560 WallpaperDelegate* delegate) { | 561 WallpaperDelegate* delegate) { |
561 // For wallpapers, save the image without resizing. | 562 // For wallpapers, save the image without resizing. |
562 image_loader_->Start( | 563 image_loader_->Start( |
563 path.value(), 0 /* Original size */, | 564 path.value(), 0 /* Original size */, false, |
564 base::Bind(&UserManagerImpl::SaveUserWallpaperInternal, | 565 base::Bind(&UserManagerImpl::SaveUserWallpaperInternal, |
565 base::Unretained(this), username, layout, User::CUSTOMIZED, | 566 base::Unretained(this), username, layout, User::CUSTOMIZED, |
566 delegate)); | 567 delegate)); |
567 } | 568 } |
568 | 569 |
569 void UserManagerImpl::SaveUserImageFromProfileImage( | 570 void UserManagerImpl::SaveUserImageFromProfileImage( |
570 const std::string& username) { | 571 const std::string& username) { |
571 if (!downloaded_profile_image_.empty()) { | 572 if (!downloaded_profile_image_.empty()) { |
572 // Profile image has already been downloaded, so save it to file right now. | 573 // Profile image has already been downloaded, so save it to file right now. |
573 SaveUserImageInternal(username, User::kProfileImageIndex, | 574 SaveUserImageInternal(username, User::kProfileImageIndex, |
574 downloaded_profile_image_); | 575 UserImage(downloaded_profile_image_)); |
575 } else { | 576 } else { |
576 // No profile image - use the stub image (gray avatar). | 577 // No profile image - use the stub image (gray avatar). |
577 SetUserImage(username, User::kProfileImageIndex, SkBitmap()); | 578 SetUserImage(username, User::kProfileImageIndex, UserImage(SkBitmap())); |
578 SaveImageToLocalState(username, "", User::kProfileImageIndex, false); | 579 SaveImageToLocalState(username, "", User::kProfileImageIndex, false); |
579 } | 580 } |
580 } | 581 } |
581 | 582 |
582 void UserManagerImpl::DownloadProfileImage(const std::string& reason) { | 583 void UserManagerImpl::DownloadProfileImage(const std::string& reason) { |
583 if (profile_image_downloader_.get()) { | 584 if (profile_image_downloader_.get()) { |
584 // Another download is already in progress | 585 // Another download is already in progress |
585 return; | 586 return; |
586 } | 587 } |
587 | 588 |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 | 742 |
742 if (prefs_images) { | 743 if (prefs_images) { |
743 // Get account image path. | 744 // Get account image path. |
744 // TODO(avayvod): Reading image path as a string is here for | 745 // TODO(avayvod): Reading image path as a string is here for |
745 // backward compatibility. | 746 // backward compatibility. |
746 std::string image_path; | 747 std::string image_path; |
747 base::DictionaryValue* image_properties; | 748 base::DictionaryValue* image_properties; |
748 if (prefs_images->GetStringWithoutPathExpansion(email, &image_path)) { | 749 if (prefs_images->GetStringWithoutPathExpansion(email, &image_path)) { |
749 int image_id = User::kInvalidImageIndex; | 750 int image_id = User::kInvalidImageIndex; |
750 if (IsDefaultImagePath(image_path, &image_id)) { | 751 if (IsDefaultImagePath(image_path, &image_id)) { |
751 user->SetImage(GetDefaultImage(image_id), image_id); | 752 user->SetImage(UserImage(GetDefaultImage(image_id)), image_id); |
752 } else { | 753 } else { |
753 int image_index = User::kExternalImageIndex; | 754 int image_index = User::kExternalImageIndex; |
754 // Until image has been loaded, use the stub image. | 755 // Until image has been loaded, use the stub image. |
755 user->SetStubImage(image_index); | 756 user->SetStubImage(image_index); |
756 DCHECK(!image_path.empty()); | 757 DCHECK(!image_path.empty()); |
757 // Load user image asynchronously. | 758 // Load user image asynchronously. |
758 image_loader_->Start( | 759 image_loader_->Start( |
759 image_path, 0, | 760 image_path, 0, true, |
760 base::Bind(&UserManagerImpl::SetUserImage, | 761 base::Bind(&UserManagerImpl::SetUserImage, |
761 base::Unretained(this), email, image_index)); | 762 base::Unretained(this), email, image_index)); |
762 } | 763 } |
763 } else if (prefs_images->GetDictionaryWithoutPathExpansion( | 764 } else if (prefs_images->GetDictionaryWithoutPathExpansion( |
764 email, &image_properties)) { | 765 email, &image_properties)) { |
765 int image_index = User::kInvalidImageIndex; | 766 int image_index = User::kInvalidImageIndex; |
766 image_properties->GetString(kImagePathNodeName, &image_path); | 767 image_properties->GetString(kImagePathNodeName, &image_path); |
767 image_properties->GetInteger(kImageIndexNodeName, &image_index); | 768 image_properties->GetInteger(kImageIndexNodeName, &image_index); |
768 if (image_index >= 0 && image_index < kDefaultImagesCount) { | 769 if (image_index >= 0 && image_index < kDefaultImagesCount) { |
769 user->SetImage(GetDefaultImage(image_index), image_index); | 770 user->SetImage(UserImage(GetDefaultImage(image_index)), |
| 771 image_index); |
770 } else if (image_index == User::kExternalImageIndex || | 772 } else if (image_index == User::kExternalImageIndex || |
771 image_index == User::kProfileImageIndex) { | 773 image_index == User::kProfileImageIndex) { |
772 // Path may be empty for profile images (meaning that the image | 774 // Path may be empty for profile images (meaning that the image |
773 // hasn't been downloaded for the first time yet, in which case a | 775 // hasn't been downloaded for the first time yet, in which case a |
774 // download will be scheduled for |kProfileImageDownloadDelayMs| | 776 // download will be scheduled for |kProfileImageDownloadDelayMs| |
775 // after user logs in). | 777 // after user logs in). |
776 DCHECK(!image_path.empty() || | 778 DCHECK(!image_path.empty() || |
777 image_index == User::kProfileImageIndex); | 779 image_index == User::kProfileImageIndex); |
778 // Until image has been loaded, use the stub image (gray avatar). | 780 // Until image has been loaded, use the stub image (gray avatar). |
779 user->SetStubImage(image_index); | 781 user->SetStubImage(image_index); |
780 if (!image_path.empty()) { | 782 if (!image_path.empty()) { |
781 // Load user image asynchronously. | 783 // Load user image asynchronously. |
782 image_loader_->Start( | 784 image_loader_->Start( |
783 image_path, 0, | 785 image_path, 0, true, |
784 base::Bind(&UserManagerImpl::SetUserImage, | 786 base::Bind(&UserManagerImpl::SetUserImage, |
785 base::Unretained(this), email, image_index)); | 787 base::Unretained(this), email, image_index)); |
786 } | 788 } |
787 } else { | 789 } else { |
788 NOTREACHED(); | 790 NOTREACHED(); |
789 } | 791 } |
790 } | 792 } |
791 } | 793 } |
792 | 794 |
793 std::string display_email; | 795 std::string display_email; |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
979 } | 981 } |
980 | 982 |
981 void UserManagerImpl::SaveLoggedInUserWallpaperProperties( | 983 void UserManagerImpl::SaveLoggedInUserWallpaperProperties( |
982 User::WallpaperType type, | 984 User::WallpaperType type, |
983 int index) { | 985 int index) { |
984 SaveUserWallpaperProperties(GetLoggedInUser().email(), type, index); | 986 SaveUserWallpaperProperties(GetLoggedInUser().email(), type, index); |
985 } | 987 } |
986 | 988 |
987 void UserManagerImpl::SetUserImage(const std::string& username, | 989 void UserManagerImpl::SetUserImage(const std::string& username, |
988 int image_index, | 990 int image_index, |
989 const SkBitmap& image) { | 991 const UserImage& user_image) { |
990 User* user = const_cast<User*>(FindUser(username)); | 992 User* user = const_cast<User*>(FindUser(username)); |
991 // User may have been removed by now. | 993 // User may have been removed by now. |
992 if (user) { | 994 if (user) { |
993 // For existing users, a valid image index should have been set upon loading | 995 // For existing users, a valid image index should have been set upon loading |
994 // them from Local State. | 996 // them from Local State. |
995 DCHECK(user->image_index() != User::kInvalidImageIndex || | 997 DCHECK(user->image_index() != User::kInvalidImageIndex || |
996 is_current_user_new_); | 998 is_current_user_new_); |
997 bool image_changed = user->image_index() != User::kInvalidImageIndex; | 999 bool image_changed = user->image_index() != User::kInvalidImageIndex; |
998 if (!image.empty()) | 1000 if (!user_image.image().empty()) |
999 user->SetImage(image, image_index); | 1001 user->SetImage(user_image, image_index); |
1000 else | 1002 else |
1001 user->SetStubImage(image_index); | 1003 user->SetStubImage(image_index); |
1002 // For the logged-in user with a profile picture, initialize | 1004 // For the logged-in user with a profile picture, initialize |
1003 // |downloaded_profile_picture_|. | 1005 // |downloaded_profile_picture_|. |
1004 if (user == logged_in_user_ && image_index == User::kProfileImageIndex) | 1006 if (user == logged_in_user_ && image_index == User::kProfileImageIndex) |
1005 InitDownloadedProfileImage(); | 1007 InitDownloadedProfileImage(); |
1006 if (image_changed) { | 1008 if (image_changed) { |
1007 // Unless this is first-time setting with |SetInitialUserImage|, | 1009 // Unless this is first-time setting with |SetInitialUserImage|, |
1008 // send a notification about image change. | 1010 // send a notification about image change. |
1009 content::NotificationService::current()->Notify( | 1011 content::NotificationService::current()->Notify( |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1062 base::DictionaryValue* wallpaper_properties = new base::DictionaryValue(); | 1064 base::DictionaryValue* wallpaper_properties = new base::DictionaryValue(); |
1063 wallpaper_properties->Set(kWallpaperTypeNodeName, | 1065 wallpaper_properties->Set(kWallpaperTypeNodeName, |
1064 new base::FundamentalValue(type)); | 1066 new base::FundamentalValue(type)); |
1065 wallpaper_properties->Set(kWallpaperIndexNodeName, | 1067 wallpaper_properties->Set(kWallpaperIndexNodeName, |
1066 new base::FundamentalValue(index)); | 1068 new base::FundamentalValue(index)); |
1067 wallpaper_update->SetWithoutPathExpansion(username, wallpaper_properties); | 1069 wallpaper_update->SetWithoutPathExpansion(username, wallpaper_properties); |
1068 } | 1070 } |
1069 | 1071 |
1070 void UserManagerImpl::SaveUserImageInternal(const std::string& username, | 1072 void UserManagerImpl::SaveUserImageInternal(const std::string& username, |
1071 int image_index, | 1073 int image_index, |
1072 const SkBitmap& image) { | 1074 const UserImage& user_image) { |
1073 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1075 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1074 | 1076 |
1075 SetUserImage(username, image_index, image); | 1077 SetUserImage(username, image_index, user_image); |
1076 | 1078 |
1077 // Ignore for ephemeral users. | 1079 // Ignore for ephemeral users. |
1078 if (IsEphemeralUser(username)) | 1080 if (IsEphemeralUser(username)) |
1079 return; | 1081 return; |
1080 | 1082 |
1081 FilePath image_path = GetImagePathForUser(username); | 1083 FilePath image_path = GetImagePathForUser(username); |
1082 DVLOG(1) << "Saving user image to " << image_path.value(); | 1084 DVLOG(1) << "Saving user image to " << image_path.value(); |
1083 | 1085 |
1084 last_image_set_async_ = true; | 1086 last_image_set_async_ = true; |
1085 | 1087 |
1086 BrowserThread::PostTask( | 1088 BrowserThread::PostTask( |
1087 BrowserThread::FILE, | 1089 BrowserThread::FILE, |
1088 FROM_HERE, | 1090 FROM_HERE, |
1089 base::Bind(&UserManagerImpl::SaveImageToFile, | 1091 base::Bind(&UserManagerImpl::SaveImageToFile, |
1090 base::Unretained(this), | 1092 base::Unretained(this), |
1091 username, image, image_path, image_index)); | 1093 username, user_image, image_path, image_index)); |
1092 } | 1094 } |
1093 | 1095 |
1094 void UserManagerImpl::SaveUserWallpaperInternal(const std::string& username, | 1096 void UserManagerImpl::SaveUserWallpaperInternal(const std::string& username, |
1095 ash::WallpaperLayout layout, | 1097 ash::WallpaperLayout layout, |
1096 User::WallpaperType type, | 1098 User::WallpaperType type, |
1097 WallpaperDelegate* delegate, | 1099 WallpaperDelegate* delegate, |
1098 const SkBitmap& wallpaper) { | 1100 const UserImage& user_image) { |
1099 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1101 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1100 | 1102 |
| 1103 const SkBitmap& wallpaper = user_image.image(); |
1101 BrowserThread::PostTask( | 1104 BrowserThread::PostTask( |
1102 BrowserThread::FILE, | 1105 BrowserThread::FILE, |
1103 FROM_HERE, | 1106 FROM_HERE, |
1104 base::Bind(&UserManagerImpl::GenerateUserWallpaperThumbnail, | 1107 base::Bind(&UserManagerImpl::GenerateUserWallpaperThumbnail, |
1105 base::Unretained(this), username, type, delegate, wallpaper)); | 1108 base::Unretained(this), username, type, delegate, wallpaper)); |
1106 | 1109 |
1107 ash::Shell::GetInstance()->desktop_background_controller()-> | 1110 ash::Shell::GetInstance()->desktop_background_controller()-> |
1108 SetCustomWallpaper(wallpaper, layout); | 1111 SetCustomWallpaper(wallpaper, layout); |
1109 | 1112 |
1110 // Ignore for ephemeral users. | 1113 // Ignore for ephemeral users. |
1111 if (IsEphemeralUser(username)) | 1114 if (IsEphemeralUser(username)) |
1112 return; | 1115 return; |
1113 | 1116 |
1114 FilePath wallpaper_path = GetWallpaperPathForUser(username, false); | 1117 FilePath wallpaper_path = GetWallpaperPathForUser(username, false); |
1115 DVLOG(1) << "Saving user image to " << wallpaper_path.value(); | 1118 DVLOG(1) << "Saving user image to " << wallpaper_path.value(); |
1116 | 1119 |
1117 last_image_set_async_ = true; | 1120 last_image_set_async_ = true; |
1118 | 1121 |
1119 BrowserThread::PostTask( | 1122 BrowserThread::PostTask( |
1120 BrowserThread::FILE, | 1123 BrowserThread::FILE, |
1121 FROM_HERE, | 1124 FROM_HERE, |
1122 base::Bind(&UserManagerImpl::SaveWallpaperToFile, | 1125 base::Bind(&UserManagerImpl::SaveWallpaperToFile, |
1123 base::Unretained(this), username, wallpaper, wallpaper_path, | 1126 base::Unretained(this), username, wallpaper, wallpaper_path, |
1124 layout, User::CUSTOMIZED)); | 1127 layout, User::CUSTOMIZED)); |
1125 } | 1128 } |
1126 | 1129 |
1127 void UserManagerImpl::OnCustomWallpaperLoaded(const std::string& email, | 1130 void UserManagerImpl::OnCustomWallpaperLoaded(const std::string& email, |
1128 ash::WallpaperLayout layout, | 1131 ash::WallpaperLayout layout, |
1129 const SkBitmap& wallpaper) { | 1132 const UserImage& user_image) { |
| 1133 const SkBitmap& wallpaper = user_image.image(); |
1130 ash::Shell::GetInstance()->desktop_background_controller()-> | 1134 ash::Shell::GetInstance()->desktop_background_controller()-> |
1131 SetCustomWallpaper(wallpaper, layout); | 1135 SetCustomWallpaper(wallpaper, layout); |
1132 // Starting to load wallpaper thumbnail | 1136 // Starting to load wallpaper thumbnail |
1133 std::string wallpaper_thumbnail_path = | 1137 std::string wallpaper_thumbnail_path = |
1134 GetWallpaperPathForUser(email, true).value(); | 1138 GetWallpaperPathForUser(email, true).value(); |
1135 image_loader_->Start( | 1139 image_loader_->Start( |
1136 wallpaper_thumbnail_path, 0, | 1140 wallpaper_thumbnail_path, 0, false, |
1137 base::Bind(&UserManagerImpl::OnCustomWallpaperThumbnailLoaded, | 1141 base::Bind(&UserManagerImpl::OnCustomWallpaperThumbnailLoaded, |
1138 base::Unretained(this), email)); | 1142 base::Unretained(this), email)); |
1139 } | 1143 } |
1140 | 1144 |
1141 void UserManagerImpl::OnCustomWallpaperThumbnailLoaded( | 1145 void UserManagerImpl::OnCustomWallpaperThumbnailLoaded( |
1142 const std::string& email, | 1146 const std::string& email, |
1143 const SkBitmap& wallpaper) { | 1147 const UserImage& user_image) { |
| 1148 const SkBitmap& wallpaper = user_image.image(); |
1144 User* user = const_cast<User*>(FindUser(email)); | 1149 User* user = const_cast<User*>(FindUser(email)); |
1145 // User may have been removed by now. | 1150 // User may have been removed by now. |
1146 if (user && !wallpaper.empty()) | 1151 if (user && !wallpaper.empty()) |
1147 user->SetWallpaperThumbnail(wallpaper); | 1152 user->SetWallpaperThumbnail(wallpaper); |
1148 } | 1153 } |
1149 | 1154 |
1150 void UserManagerImpl::OnThumbnailUpdated(WallpaperDelegate* delegate) { | 1155 void UserManagerImpl::OnThumbnailUpdated(WallpaperDelegate* delegate) { |
1151 if (delegate) | 1156 if (delegate) |
1152 delegate->SetCustomWallpaperThumbnail(); | 1157 delegate->SetCustomWallpaperThumbnail(); |
1153 } | 1158 } |
(...skipping 15 matching lines...) Expand all Loading... |
1169 BrowserThread::UI, | 1174 BrowserThread::UI, |
1170 FROM_HERE, | 1175 FROM_HERE, |
1171 base::Bind(&UserManagerImpl::OnThumbnailUpdated, | 1176 base::Bind(&UserManagerImpl::OnThumbnailUpdated, |
1172 base::Unretained(this), delegate)); | 1177 base::Unretained(this), delegate)); |
1173 | 1178 |
1174 // Ignore for ephemeral users. | 1179 // Ignore for ephemeral users. |
1175 if (IsEphemeralUser(username)) | 1180 if (IsEphemeralUser(username)) |
1176 return; | 1181 return; |
1177 | 1182 |
1178 FilePath thumbnail_path = GetWallpaperPathForUser(username, true); | 1183 FilePath thumbnail_path = GetWallpaperPathForUser(username, true); |
1179 SaveBitmapToFile(thumbnail, thumbnail_path); | 1184 SaveBitmapToFile(UserImage(thumbnail), thumbnail_path); |
1180 } | 1185 } |
1181 | 1186 |
1182 void UserManagerImpl::SaveImageToFile(const std::string& username, | 1187 void UserManagerImpl::SaveImageToFile(const std::string& username, |
1183 const SkBitmap& image, | 1188 const UserImage& user_image, |
1184 const FilePath& image_path, | 1189 const FilePath& image_path, |
1185 int image_index) { | 1190 int image_index) { |
1186 if (!SaveBitmapToFile(image, image_path)) | 1191 if (!SaveBitmapToFile(user_image, image_path)) |
1187 return; | 1192 return; |
1188 | 1193 |
1189 BrowserThread::PostTask( | 1194 BrowserThread::PostTask( |
1190 BrowserThread::UI, | 1195 BrowserThread::UI, |
1191 FROM_HERE, | 1196 FROM_HERE, |
1192 base::Bind(&UserManagerImpl::SaveImageToLocalState, | 1197 base::Bind(&UserManagerImpl::SaveImageToLocalState, |
1193 base::Unretained(this), | 1198 base::Unretained(this), |
1194 username, image_path.value(), image_index, true)); | 1199 username, image_path.value(), image_index, true)); |
1195 } | 1200 } |
1196 | 1201 |
1197 void UserManagerImpl::SaveWallpaperToFile(const std::string& username, | 1202 void UserManagerImpl::SaveWallpaperToFile(const std::string& username, |
1198 const SkBitmap& wallpaper, | 1203 const SkBitmap& wallpaper, |
1199 const FilePath& wallpaper_path, | 1204 const FilePath& wallpaper_path, |
1200 ash::WallpaperLayout layout, | 1205 ash::WallpaperLayout layout, |
1201 User::WallpaperType type) { | 1206 User::WallpaperType type) { |
1202 // TODO(bshe): We should save the original file unchanged instead of | 1207 // TODO(bshe): We should save the original file unchanged instead of |
1203 // re-encoding it and saving it. | 1208 // re-encoding it and saving it. |
1204 if (!SaveBitmapToFile(wallpaper, wallpaper_path)) | 1209 if (!SaveBitmapToFile(UserImage(wallpaper), wallpaper_path)) |
1205 return; | 1210 return; |
1206 | 1211 |
1207 BrowserThread::PostTask( | 1212 BrowserThread::PostTask( |
1208 BrowserThread::UI, | 1213 BrowserThread::UI, |
1209 FROM_HERE, | 1214 FROM_HERE, |
1210 base::Bind(&UserManagerImpl::SaveWallpaperToLocalState, | 1215 base::Bind(&UserManagerImpl::SaveWallpaperToLocalState, |
1211 base::Unretained(this), | 1216 base::Unretained(this), |
1212 username, wallpaper_path.value(), layout, type)); | 1217 username, wallpaper_path.value(), layout, type)); |
1213 } | 1218 } |
1214 | 1219 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1246 } | 1251 } |
1247 | 1252 |
1248 void UserManagerImpl::SaveWallpaperToLocalState(const std::string& username, | 1253 void UserManagerImpl::SaveWallpaperToLocalState(const std::string& username, |
1249 const std::string& wallpaper_path, | 1254 const std::string& wallpaper_path, |
1250 ash::WallpaperLayout layout, | 1255 ash::WallpaperLayout layout, |
1251 User::WallpaperType type) { | 1256 User::WallpaperType type) { |
1252 // TODO(bshe): We probably need to save wallpaper_path instead of index. | 1257 // TODO(bshe): We probably need to save wallpaper_path instead of index. |
1253 SaveUserWallpaperProperties(username, type, layout); | 1258 SaveUserWallpaperProperties(username, type, layout); |
1254 } | 1259 } |
1255 | 1260 |
1256 bool UserManagerImpl::SaveBitmapToFile(const SkBitmap& image, | 1261 bool UserManagerImpl::SaveBitmapToFile(const UserImage& user_image, |
1257 const FilePath& image_path) { | 1262 const FilePath& image_path) { |
1258 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 1263 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
1259 | 1264 |
1260 std::vector<unsigned char> encoded_image; | 1265 std::vector<unsigned char> encoded_image; |
1261 if (!gfx::PNGCodec::EncodeBGRASkBitmap(image, false, &encoded_image)) { | 1266 if (user_image.has_raw_image()) { |
| 1267 encoded_image = user_image.raw_image(); |
| 1268 } else if (!gfx::PNGCodec::EncodeBGRASkBitmap(user_image.image(), |
| 1269 false, |
| 1270 &encoded_image)) { |
1262 LOG(ERROR) << "Failed to PNG encode the image."; | 1271 LOG(ERROR) << "Failed to PNG encode the image."; |
1263 return false; | 1272 return false; |
1264 } | 1273 } |
1265 | 1274 |
1266 if (file_util::WriteFile(image_path, | 1275 if (file_util::WriteFile(image_path, |
1267 reinterpret_cast<char*>(&encoded_image[0]), | 1276 reinterpret_cast<char*>(&encoded_image[0]), |
1268 encoded_image.size()) == -1) { | 1277 encoded_image.size()) == -1) { |
1269 LOG(ERROR) << "Failed to save image to file."; | 1278 LOG(ERROR) << "Failed to save image to file."; |
1270 return false; | 1279 return false; |
1271 } | 1280 } |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1461 BrowserThread::PostTask( | 1470 BrowserThread::PostTask( |
1462 BrowserThread::FILE, | 1471 BrowserThread::FILE, |
1463 FROM_HERE, | 1472 FROM_HERE, |
1464 base::Bind(&UserManagerImpl::DeleteUserImage, | 1473 base::Bind(&UserManagerImpl::DeleteUserImage, |
1465 base::Unretained(this), | 1474 base::Unretained(this), |
1466 image_path)); | 1475 image_path)); |
1467 } | 1476 } |
1468 } | 1477 } |
1469 | 1478 |
1470 } // namespace chromeos | 1479 } // namespace chromeos |
OLD | NEW |