| 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/desktop_background/desktop_background_controller.h" | 9 #include "ash/desktop_background/desktop_background_controller.h" |
| 10 #include "ash/shell.h" | 10 #include "ash/shell.h" |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/chromeos/chromeos_version.h" | 12 #include "base/chromeos/chromeos_version.h" |
| 13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 14 #include "base/compiler_specific.h" | 14 #include "base/compiler_specific.h" |
| 15 #include "base/file_path.h" | 15 #include "base/file_path.h" |
| 16 #include "base/file_util.h" | 16 #include "base/file_util.h" |
| 17 #include "base/logging.h" | 17 #include "base/logging.h" |
| 18 #include "base/metrics/histogram.h" | 18 #include "base/metrics/histogram.h" |
| 19 #include "base/path_service.h" | 19 #include "base/path_service.h" |
| 20 #include "base/rand_util.h" | 20 #include "base/rand_util.h" |
| 21 #include "base/stl_util.h" | 21 #include "base/stl_util.h" |
| 22 #include "base/string_number_conversions.h" | |
| 23 #include "base/string_util.h" | |
| 24 #include "base/stringprintf.h" | 22 #include "base/stringprintf.h" |
| 25 #include "base/time.h" | 23 #include "base/time.h" |
| 26 #include "base/utf_string_conversions.h" | 24 #include "base/utf_string_conversions.h" |
| 27 #include "base/values.h" | 25 #include "base/values.h" |
| 28 #include "chrome/browser/browser_process.h" | 26 #include "chrome/browser/browser_process.h" |
| 29 #include "chrome/browser/chromeos/cros/cert_library.h" | 27 #include "chrome/browser/chromeos/cros/cert_library.h" |
| 30 #include "chrome/browser/chromeos/cros/cros_library.h" | 28 #include "chrome/browser/chromeos/cros/cros_library.h" |
| 31 #include "chrome/browser/chromeos/cryptohome/async_method_caller.h" | 29 #include "chrome/browser/chromeos/cryptohome/async_method_caller.h" |
| 32 #include "chrome/browser/chromeos/input_method/input_method_manager.h" | 30 #include "chrome/browser/chromeos/input_method/input_method_manager.h" |
| 33 #include "chrome/browser/chromeos/login/default_user_images.h" | 31 #include "chrome/browser/chromeos/login/default_user_images.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 64 | 62 |
| 65 namespace chromeos { | 63 namespace chromeos { |
| 66 | 64 |
| 67 namespace { | 65 namespace { |
| 68 | 66 |
| 69 // Names of nodes with info about user image. | 67 // Names of nodes with info about user image. |
| 70 const char kImagePathNodeName[] = "path"; | 68 const char kImagePathNodeName[] = "path"; |
| 71 const char kImageIndexNodeName[] = "index"; | 69 const char kImageIndexNodeName[] = "index"; |
| 72 const char kImageURLNodeName[] = "url"; | 70 const char kImageURLNodeName[] = "url"; |
| 73 | 71 |
| 74 const char kWallpaperTypeNodeName[] = "type"; | |
| 75 const char kWallpaperIndexNodeName[] = "index"; | |
| 76 const char kWallpaperDateNodeName[] = "date"; | |
| 77 | |
| 78 // Default wallpaper index used in OOBE (first boot). | |
| 79 // Defined here because Chromium default index differs. | |
| 80 // Also see ash::WallpaperInfo kDefaultWallpapers in | |
| 81 // desktop_background_resources.cc | |
| 82 #if defined(GOOGLE_CHROME_BUILD) | |
| 83 const int kDefaultOOBEWallpaperIndex = 16; // IDR_AURA_WALLPAPERS_3_URBAN0 | |
| 84 #else | |
| 85 const int kDefaultOOBEWallpaperIndex = 0; // IDR_AURA_WALLPAPERS_ROMAINGUY_0 | |
| 86 #endif | |
| 87 | |
| 88 const int kThumbnailWidth = 128; | |
| 89 const int kThumbnailHeight = 80; | |
| 90 | |
| 91 // Delay betweeen user login and attempt to update user's profile data. | 72 // Delay betweeen user login and attempt to update user's profile data. |
| 92 const long kProfileDataDownloadDelayMs = 10000; | 73 const long kProfileDataDownloadDelayMs = 10000; |
| 93 | 74 |
| 94 // Delay betweeen subsequent profile refresh attempts (24 hrs). | 75 // Delay betweeen subsequent profile refresh attempts (24 hrs). |
| 95 const long kProfileRefreshIntervalMs = 24L * 3600 * 1000; | 76 const long kProfileRefreshIntervalMs = 24L * 3600 * 1000; |
| 96 | 77 |
| 97 // Enum for reporting histograms about profile picture download. | 78 // Enum for reporting histograms about profile picture download. |
| 98 enum ProfileDownloadResult { | 79 enum ProfileDownloadResult { |
| 99 kDownloadSuccessChanged, | 80 kDownloadSuccessChanged, |
| 100 kDownloadSuccess, | 81 kDownloadSuccess, |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 | 186 |
| 206 } // namespace | 187 } // namespace |
| 207 | 188 |
| 208 UserManagerImpl::UserManagerImpl() | 189 UserManagerImpl::UserManagerImpl() |
| 209 : ALLOW_THIS_IN_INITIALIZER_LIST(image_loader_(new UserImageLoader)), | 190 : ALLOW_THIS_IN_INITIALIZER_LIST(image_loader_(new UserImageLoader)), |
| 210 logged_in_user_(NULL), | 191 logged_in_user_(NULL), |
| 211 session_started_(false), | 192 session_started_(false), |
| 212 is_current_user_owner_(false), | 193 is_current_user_owner_(false), |
| 213 is_current_user_new_(false), | 194 is_current_user_new_(false), |
| 214 is_current_user_ephemeral_(false), | 195 is_current_user_ephemeral_(false), |
| 215 current_user_wallpaper_type_(User::UNKNOWN), | |
| 216 ALLOW_THIS_IN_INITIALIZER_LIST(current_user_wallpaper_index_( | |
| 217 ash::GetInvalidWallpaperIndex())), | |
| 218 ephemeral_users_enabled_(false), | 196 ephemeral_users_enabled_(false), |
| 219 observed_sync_service_(NULL), | 197 observed_sync_service_(NULL), |
| 220 last_image_set_async_(false), | 198 last_image_set_async_(false), |
| 221 downloaded_profile_image_data_url_(chrome::kAboutBlankURL), | 199 downloaded_profile_image_data_url_(chrome::kAboutBlankURL), |
| 222 downloading_profile_image_(false) { | 200 downloading_profile_image_(false) { |
| 223 // UserManager instance should be used only on UI thread. | 201 // UserManager instance should be used only on UI thread. |
| 224 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 202 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 225 | 203 |
| 226 MigrateWallpaperData(); | 204 MigrateWallpaperData(); |
| 227 registrar_.Add(this, chrome::NOTIFICATION_OWNER_KEY_FETCH_ATTEMPT_SUCCEEDED, | 205 registrar_.Add(this, chrome::NOTIFICATION_OWNER_KEY_FETCH_ATTEMPT_SUCCEEDED, |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 logged_in_user_ = *logged_in_user; | 269 logged_in_user_ = *logged_in_user; |
| 292 users_.erase(logged_in_user); | 270 users_.erase(logged_in_user); |
| 293 } | 271 } |
| 294 // This user must be in the front of the user list. | 272 // This user must be in the front of the user list. |
| 295 users_.insert(users_.begin(), logged_in_user_); | 273 users_.insert(users_.begin(), logged_in_user_); |
| 296 | 274 |
| 297 if (is_current_user_new_) { | 275 if (is_current_user_new_) { |
| 298 SaveUserDisplayName(GetLoggedInUser().email(), | 276 SaveUserDisplayName(GetLoggedInUser().email(), |
| 299 UTF8ToUTF16(GetLoggedInUser().GetAccountName(true))); | 277 UTF8ToUTF16(GetLoggedInUser().GetAccountName(true))); |
| 300 SetInitialUserImage(email); | 278 SetInitialUserImage(email); |
| 301 SetInitialUserWallpaper(email); | 279 WallpaperManager::Get()->SetInitialUserWallpaper(email); |
| 302 } else { | 280 } else { |
| 303 int image_index = logged_in_user_->image_index(); | 281 int image_index = logged_in_user_->image_index(); |
| 304 // If current user image is profile image, it needs to be refreshed. | 282 // If current user image is profile image, it needs to be refreshed. |
| 305 bool download_profile_image = image_index == User::kProfileImageIndex; | 283 bool download_profile_image = image_index == User::kProfileImageIndex; |
| 306 if (download_profile_image) | 284 if (download_profile_image) |
| 307 InitDownloadedProfileImage(); | 285 InitDownloadedProfileImage(); |
| 308 | 286 |
| 309 // Download user's profile data (full name and optionally image) to see if | 287 // Download user's profile data (full name and optionally image) to see if |
| 310 // it has changed. | 288 // it has changed. |
| 311 BrowserThread::PostDelayedTask( | 289 BrowserThread::PostDelayedTask( |
| (...skipping 21 matching lines...) Expand all Loading... |
| 333 kHistogramImagesCount); | 311 kHistogramImagesCount); |
| 334 } | 312 } |
| 335 | 313 |
| 336 // Set up a repeating timer for refreshing the profile data. | 314 // Set up a repeating timer for refreshing the profile data. |
| 337 profile_download_timer_.Start( | 315 profile_download_timer_.Start( |
| 338 FROM_HERE, base::TimeDelta::FromMilliseconds(kProfileRefreshIntervalMs), | 316 FROM_HERE, base::TimeDelta::FromMilliseconds(kProfileRefreshIntervalMs), |
| 339 this, &UserManagerImpl::DownloadProfileDataScheduled); | 317 this, &UserManagerImpl::DownloadProfileDataScheduled); |
| 340 | 318 |
| 341 if (!browser_restart) { | 319 if (!browser_restart) { |
| 342 // For GAIA login flow, logged in user wallpaper may not be loaded. | 320 // For GAIA login flow, logged in user wallpaper may not be loaded. |
| 343 EnsureLoggedInUserWallpaperLoaded(); | 321 WallpaperManager::Get()->EnsureLoggedInUserWallpaperLoaded(); |
| 344 } | 322 } |
| 345 | 323 |
| 346 NotifyOnLogin(); | 324 NotifyOnLogin(); |
| 347 } | 325 } |
| 348 | 326 |
| 349 void UserManagerImpl::DemoUserLoggedIn() { | 327 void UserManagerImpl::DemoUserLoggedIn() { |
| 350 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 328 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 351 is_current_user_new_ = true; | 329 is_current_user_new_ = true; |
| 352 is_current_user_ephemeral_ = true; | 330 is_current_user_ephemeral_ = true; |
| 353 logged_in_user_ = CreateUser(kDemoUser, /* is_ephemeral= */ true); | 331 logged_in_user_ = CreateUser(kDemoUser, /* is_ephemeral= */ true); |
| 354 SetInitialUserImage(kDemoUser); | 332 SetInitialUserImage(kDemoUser); |
| 355 SetInitialUserWallpaper(kDemoUser); | 333 WallpaperManager::Get()->SetInitialUserWallpaper(kDemoUser); |
| 356 NotifyOnLogin(); | 334 NotifyOnLogin(); |
| 357 } | 335 } |
| 358 | 336 |
| 359 void UserManagerImpl::GuestUserLoggedIn() { | 337 void UserManagerImpl::GuestUserLoggedIn() { |
| 360 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 338 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 361 is_current_user_ephemeral_ = true; | 339 is_current_user_ephemeral_ = true; |
| 362 SetInitialUserWallpaper(kGuestUser); | 340 WallpaperManager::Get()->SetInitialUserWallpaper(kGuestUser); |
| 363 logged_in_user_ = CreateUser(kGuestUser, /* is_ephemeral= */ true); | 341 logged_in_user_ = CreateUser(kGuestUser, /* is_ephemeral= */ true); |
| 364 NotifyOnLogin(); | 342 NotifyOnLogin(); |
| 365 } | 343 } |
| 366 | 344 |
| 367 void UserManagerImpl::EphemeralUserLoggedIn(const std::string& email) { | 345 void UserManagerImpl::EphemeralUserLoggedIn(const std::string& email) { |
| 368 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 346 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 369 is_current_user_new_ = true; | 347 is_current_user_new_ = true; |
| 370 is_current_user_ephemeral_ = true; | 348 is_current_user_ephemeral_ = true; |
| 371 logged_in_user_ = CreateUser(email, /* is_ephemeral= */ true); | 349 logged_in_user_ = CreateUser(email, /* is_ephemeral= */ true); |
| 372 SetInitialUserImage(email); | 350 SetInitialUserImage(email); |
| 373 SetInitialUserWallpaper(email); | 351 WallpaperManager::Get()->SetInitialUserWallpaper(email); |
| 374 NotifyOnLogin(); | 352 NotifyOnLogin(); |
| 375 } | 353 } |
| 376 | 354 |
| 377 void UserManagerImpl::InitializeWallpaper() { | |
| 378 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 379 if (!IsUserLoggedIn()) { | |
| 380 if (!CommandLine::ForCurrentProcess()->HasSwitch( | |
| 381 switches::kDisableNewOobe)) { | |
| 382 if (!WizardController::IsDeviceRegistered() && | |
| 383 !WizardController::IsZeroDelayEnabled()) { | |
| 384 // TODO(nkostylev): Add switch to disable wallpaper transition on OOBE. | |
| 385 // Should be used on test images so that they are not slowed down. | |
| 386 ash::Shell::GetInstance()->desktop_background_controller()-> | |
| 387 SetDefaultWallpaper(kDefaultOOBEWallpaperIndex); | |
| 388 } else { | |
| 389 bool show_users = true; | |
| 390 bool result = CrosSettings::Get()->GetBoolean( | |
| 391 kAccountsPrefShowUserNamesOnSignIn, &show_users); | |
| 392 DCHECK(result) << "Unable to fetch setting " | |
| 393 << kAccountsPrefShowUserNamesOnSignIn; | |
| 394 if (!show_users) { | |
| 395 ash::Shell::GetInstance()->desktop_background_controller()-> | |
| 396 SetDefaultWallpaper(ash::GetSolidColorIndex()); | |
| 397 } | |
| 398 } | |
| 399 } | |
| 400 return; | |
| 401 } | |
| 402 UserSelected(GetLoggedInUser().email()); | |
| 403 } | |
| 404 | |
| 405 void UserManagerImpl::UserSelected(const std::string& email) { | |
| 406 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 407 if (IsKnownUser(email)) { | |
| 408 User::WallpaperType type; | |
| 409 int index; | |
| 410 base::Time date; | |
| 411 GetUserWallpaperProperties(email, &type, &index, &date); | |
| 412 if (type == User::DAILY && date != base::Time::Now().LocalMidnight()) { | |
| 413 index = ash::GetNextWallpaperIndex(index); | |
| 414 SaveUserWallpaperProperties(email, User::DAILY, index); | |
| 415 } else if (type == User::CUSTOMIZED) { | |
| 416 std::string wallpaper_path = | |
| 417 GetWallpaperPathForUser(email, false).value(); | |
| 418 // In customized mode, we use index pref to save the user selected | |
| 419 // wallpaper layout. See function SaveWallpaperToLocalState(). | |
| 420 ash::WallpaperLayout layout = static_cast<ash::WallpaperLayout>(index); | |
| 421 // Load user image asynchronously. | |
| 422 image_loader_->Start( | |
| 423 wallpaper_path, 0, | |
| 424 base::Bind(&UserManagerImpl::OnCustomWallpaperLoaded, | |
| 425 base::Unretained(this), email, layout)); | |
| 426 return; | |
| 427 } | |
| 428 ash::Shell::GetInstance()->desktop_background_controller()-> | |
| 429 SetDefaultWallpaper(index); | |
| 430 WallpaperManager::Get()->SetLastSelectedUser(email); | |
| 431 } | |
| 432 } | |
| 433 | |
| 434 void UserManagerImpl::SessionStarted() { | 355 void UserManagerImpl::SessionStarted() { |
| 435 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 356 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 436 session_started_ = true; | 357 session_started_ = true; |
| 437 content::NotificationService::current()->Notify( | 358 content::NotificationService::current()->Notify( |
| 438 chrome::NOTIFICATION_SESSION_STARTED, | 359 chrome::NOTIFICATION_SESSION_STARTED, |
| 439 content::NotificationService::AllSources(), | 360 content::NotificationService::AllSources(), |
| 440 content::NotificationService::NoDetails()); | 361 content::NotificationService::NoDetails()); |
| 441 } | 362 } |
| 442 | 363 |
| 443 void UserManagerImpl::RemoveUser(const std::string& email, | 364 void UserManagerImpl::RemoveUser(const std::string& email, |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 614 | 535 |
| 615 // TODO(bshe): We current disabled the customized wallpaper feature for | 536 // TODO(bshe): We current disabled the customized wallpaper feature for |
| 616 // Ephemeral user. As we dont want to keep a copy of customized wallpaper in | 537 // Ephemeral user. As we dont want to keep a copy of customized wallpaper in |
| 617 // memory. Need a smarter way to solve this. | 538 // memory. Need a smarter way to solve this. |
| 618 if (IsCurrentUserEphemeral()) | 539 if (IsCurrentUserEphemeral()) |
| 619 return; | 540 return; |
| 620 const chromeos::User& user = GetLoggedInUser(); | 541 const chromeos::User& user = GetLoggedInUser(); |
| 621 std::string username = user.email(); | 542 std::string username = user.email(); |
| 622 DCHECK(!username.empty()); | 543 DCHECK(!username.empty()); |
| 623 | 544 |
| 624 std::string file_path = GetWallpaperPathForUser(username, false).value(); | 545 std::string file_path = WallpaperManager::Get()-> |
| 546 GetWallpaperPathForUser(username, false).value(); |
| 625 SaveWallpaperToLocalState(username, file_path, layout, User::CUSTOMIZED); | 547 SaveWallpaperToLocalState(username, file_path, layout, User::CUSTOMIZED); |
| 626 // Load wallpaper from file. | 548 // Load wallpaper from file. |
| 627 UserSelected(username); | 549 WallpaperManager::Get()->OnUserSelected(username); |
| 628 } | 550 } |
| 629 | 551 |
| 630 void UserManagerImpl::SaveUserImageFromFile(const std::string& username, | 552 void UserManagerImpl::SaveUserImageFromFile(const std::string& username, |
| 631 const FilePath& path) { | 553 const FilePath& path) { |
| 632 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 554 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 633 image_loader_->Start( | 555 image_loader_->Start( |
| 634 path.value(), login::kMaxUserImageSize, | 556 path.value(), login::kMaxUserImageSize, |
| 635 base::Bind(&UserManagerImpl::SaveUserImage, | 557 base::Bind(&UserManagerImpl::SaveUserImage, |
| 636 base::Unretained(this), username)); | 558 base::Unretained(this), username)); |
| 637 } | 559 } |
| 638 | 560 |
| 639 void UserManagerImpl::SaveUserWallpaperFromFile( | |
| 640 const std::string& username, | |
| 641 const FilePath& path, | |
| 642 ash::WallpaperLayout layout, | |
| 643 base::WeakPtr<WallpaperDelegate> delegate) { | |
| 644 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 645 // For wallpapers, save the image without resizing. | |
| 646 image_loader_->Start( | |
| 647 path.value(), 0 /* Original size */, | |
| 648 base::Bind(&UserManagerImpl::SaveUserWallpaperInternal, | |
| 649 base::Unretained(this), username, layout, User::CUSTOMIZED, | |
| 650 delegate)); | |
| 651 } | |
| 652 | |
| 653 void UserManagerImpl::SaveUserImageFromProfileImage( | 561 void UserManagerImpl::SaveUserImageFromProfileImage( |
| 654 const std::string& username) { | 562 const std::string& username) { |
| 655 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 563 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 656 if (!downloaded_profile_image_.empty()) { | 564 if (!downloaded_profile_image_.empty()) { |
| 657 // Profile image has already been downloaded, so save it to file right now. | 565 // Profile image has already been downloaded, so save it to file right now. |
| 658 DCHECK(profile_image_url_.is_valid()); | 566 DCHECK(profile_image_url_.is_valid()); |
| 659 SaveUserImageInternal( | 567 SaveUserImageInternal( |
| 660 username, | 568 username, |
| 661 User::kProfileImageIndex, profile_image_url_, | 569 User::kProfileImageIndex, profile_image_url_, |
| 662 UserImage::CreateAndEncode(downloaded_profile_image_)); | 570 UserImage::CreateAndEncode(downloaded_profile_image_)); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 LocalStateChanged(this)); | 698 LocalStateChanged(this)); |
| 791 } | 699 } |
| 792 | 700 |
| 793 FilePath UserManagerImpl::GetImagePathForUser(const std::string& username) { | 701 FilePath UserManagerImpl::GetImagePathForUser(const std::string& username) { |
| 794 std::string filename = username + ".png"; | 702 std::string filename = username + ".png"; |
| 795 FilePath user_data_dir; | 703 FilePath user_data_dir; |
| 796 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); | 704 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); |
| 797 return user_data_dir.AppendASCII(filename); | 705 return user_data_dir.AppendASCII(filename); |
| 798 } | 706 } |
| 799 | 707 |
| 800 FilePath UserManagerImpl::GetWallpaperPathForUser(const std::string& username, | |
| 801 bool is_thumbnail) { | |
| 802 std::string filename = username + | |
| 803 (is_thumbnail ? "_wallpaper_thumb.png" : "_wallpaper.png"); | |
| 804 FilePath user_data_dir; | |
| 805 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); | |
| 806 return user_data_dir.AppendASCII(filename); | |
| 807 } | |
| 808 | |
| 809 void UserManagerImpl::EnsureUsersLoaded() { | 708 void UserManagerImpl::EnsureUsersLoaded() { |
| 810 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 709 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 811 if (!users_.empty()) | 710 if (!users_.empty()) |
| 812 return; | 711 return; |
| 813 if (!g_browser_process) | 712 if (!g_browser_process) |
| 814 return; | 713 return; |
| 815 | 714 |
| 816 PrefService* local_state = g_browser_process->local_state(); | 715 PrefService* local_state = g_browser_process->local_state(); |
| 817 const ListValue* prefs_users = | 716 const ListValue* prefs_users = |
| 818 local_state->GetList(UserManager::kLoggedInUsers); | 717 local_state->GetList(UserManager::kLoggedInUsers); |
| 819 const DictionaryValue* prefs_images = | 718 const DictionaryValue* prefs_images = |
| 820 local_state->GetDictionary(UserManager::kUserImages); | 719 local_state->GetDictionary(UserManager::kUserImages); |
| 821 const DictionaryValue* prefs_display_names = | 720 const DictionaryValue* prefs_display_names = |
| 822 local_state->GetDictionary(UserManager::kUserDisplayName); | 721 local_state->GetDictionary(UserManager::kUserDisplayName); |
| 823 const DictionaryValue* prefs_display_emails = | 722 const DictionaryValue* prefs_display_emails = |
| 824 local_state->GetDictionary(UserManager::kUserDisplayEmail); | 723 local_state->GetDictionary(UserManager::kUserDisplayEmail); |
| 825 | 724 |
| 826 int user_image_size = GetCurrentUserImageSize(); | 725 int user_image_size = GetCurrentUserImageSize(); |
| 827 | 726 |
| 828 if (prefs_users) { | 727 if (prefs_users) { |
| 829 for (ListValue::const_iterator it = prefs_users->begin(); | 728 for (ListValue::const_iterator it = prefs_users->begin(); |
| 830 it != prefs_users->end(); ++it) { | 729 it != prefs_users->end(); ++it) { |
| 831 std::string email; | 730 std::string email; |
| 832 if ((*it)->GetAsString(&email)) { | 731 if ((*it)->GetAsString(&email)) { |
| 833 User* user = CreateUser(email, /* is_ephemeral= */ false); | 732 User* user = CreateUser(email, /* is_ephemeral= */ false); |
| 834 users_.push_back(user); | 733 users_.push_back(user); |
| 835 | 734 |
| 735 WallpaperManager::Get()->CacheIfCustomWallpaper(email); |
| 736 |
| 836 if (prefs_images) { | 737 if (prefs_images) { |
| 837 // Get account image path. | 738 // Get account image path. |
| 838 // TODO(avayvod): Reading image path as a string is here for | 739 // TODO(avayvod): Reading image path as a string is here for |
| 839 // backward compatibility. | 740 // backward compatibility. |
| 840 std::string image_path; | 741 std::string image_path; |
| 841 const base::DictionaryValue* image_properties; | 742 const base::DictionaryValue* image_properties; |
| 842 if (prefs_images->GetStringWithoutPathExpansion(email, &image_path)) { | 743 if (prefs_images->GetStringWithoutPathExpansion(email, &image_path)) { |
| 843 int image_id = User::kInvalidImageIndex; | 744 int image_id = User::kInvalidImageIndex; |
| 844 if (IsDefaultImagePath(image_path, &image_id)) { | 745 if (IsDefaultImagePath(image_path, &image_id)) { |
| 845 user->SetImage(UserImage(GetDefaultImage(image_id)), image_id); | 746 user->SetImage(UserImage(GetDefaultImage(image_id)), image_id); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 902 if (prefs_display_emails && | 803 if (prefs_display_emails && |
| 903 prefs_display_emails->GetStringWithoutPathExpansion( | 804 prefs_display_emails->GetStringWithoutPathExpansion( |
| 904 email, &display_email)) { | 805 email, &display_email)) { |
| 905 user->set_display_email(display_email); | 806 user->set_display_email(display_email); |
| 906 } | 807 } |
| 907 } | 808 } |
| 908 } | 809 } |
| 909 } | 810 } |
| 910 } | 811 } |
| 911 | 812 |
| 912 void UserManagerImpl::EnsureLoggedInUserWallpaperLoaded() { | |
| 913 User::WallpaperType type; | |
| 914 int index; | |
| 915 base::Time last_modification_date; | |
| 916 GetLoggedInUserWallpaperProperties(&type, &index, &last_modification_date); | |
| 917 | |
| 918 if (type != current_user_wallpaper_type_ || | |
| 919 index != current_user_wallpaper_index_) | |
| 920 UserSelected(GetLoggedInUser().email()); | |
| 921 } | |
| 922 | |
| 923 void UserManagerImpl::RetrieveTrustedDevicePolicies() { | 813 void UserManagerImpl::RetrieveTrustedDevicePolicies() { |
| 924 ephemeral_users_enabled_ = false; | 814 ephemeral_users_enabled_ = false; |
| 925 owner_email_ = ""; | 815 owner_email_ = ""; |
| 926 | 816 |
| 927 CrosSettings* cros_settings = CrosSettings::Get(); | 817 CrosSettings* cros_settings = CrosSettings::Get(); |
| 928 // Schedule a callback if device policy has not yet been verified. | 818 // Schedule a callback if device policy has not yet been verified. |
| 929 if (CrosSettingsProvider::TRUSTED != cros_settings->PrepareTrustedValues( | 819 if (CrosSettingsProvider::TRUSTED != cros_settings->PrepareTrustedValues( |
| 930 base::Bind(&UserManagerImpl::RetrieveTrustedDevicePolicies, | 820 base::Bind(&UserManagerImpl::RetrieveTrustedDevicePolicies, |
| 931 base::Unretained(this)))) { | 821 base::Unretained(this)))) { |
| 932 return; | 822 return; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1014 base::Bind(&UserManagerImpl::CheckOwnership, | 904 base::Bind(&UserManagerImpl::CheckOwnership, |
| 1015 base::Unretained(this))); | 905 base::Unretained(this))); |
| 1016 } | 906 } |
| 1017 | 907 |
| 1018 void UserManagerImpl::SetInitialUserImage(const std::string& username) { | 908 void UserManagerImpl::SetInitialUserImage(const std::string& username) { |
| 1019 // Choose a random default image. | 909 // Choose a random default image. |
| 1020 int image_id = base::RandInt(0, kDefaultImagesCount - 1); | 910 int image_id = base::RandInt(0, kDefaultImagesCount - 1); |
| 1021 SaveUserDefaultImageIndex(username, image_id); | 911 SaveUserDefaultImageIndex(username, image_id); |
| 1022 } | 912 } |
| 1023 | 913 |
| 1024 void UserManagerImpl::SetInitialUserWallpaper(const std::string& username) { | |
| 1025 current_user_wallpaper_type_ = User::DEFAULT; | |
| 1026 // TODO(bshe): Ideally, wallpaper should start to load as soon as user click | |
| 1027 // "Add user". | |
| 1028 if (username == kGuestUser) | |
| 1029 current_user_wallpaper_index_ = ash::GetGuestWallpaperIndex(); | |
| 1030 else | |
| 1031 current_user_wallpaper_index_ = ash::GetDefaultWallpaperIndex(); | |
| 1032 SaveUserWallpaperProperties(username, | |
| 1033 current_user_wallpaper_type_, | |
| 1034 current_user_wallpaper_index_); | |
| 1035 | |
| 1036 // Some browser tests do not have shell instance. And it is not necessary to | |
| 1037 // create a wallpaper for these tests. Add HasInstance check to prevent tests | |
| 1038 // crash and speed up the tests by avoid loading wallpaper. | |
| 1039 if (ash::Shell::HasInstance()) { | |
| 1040 ash::Shell::GetInstance()->desktop_background_controller()-> | |
| 1041 SetDefaultWallpaper(current_user_wallpaper_index_); | |
| 1042 } | |
| 1043 } | |
| 1044 | |
| 1045 void UserManagerImpl::MigrateWallpaperData() { | 914 void UserManagerImpl::MigrateWallpaperData() { |
| 1046 PrefService* local_state = g_browser_process->local_state(); | 915 PrefService* local_state = g_browser_process->local_state(); |
| 1047 if (local_state) { | 916 if (local_state) { |
| 1048 const DictionaryValue* user_wallpapers = | 917 const DictionaryValue* user_wallpapers = |
| 1049 local_state->GetDictionary(kUserWallpapers); | 918 local_state->GetDictionary(kUserWallpapers); |
| 1050 int index; | 919 int index; |
| 1051 const DictionaryValue* new_user_wallpapers = | 920 const DictionaryValue* new_user_wallpapers = |
| 1052 local_state->GetDictionary(kUserWallpapersProperties); | 921 local_state->GetDictionary(kUserWallpapersProperties); |
| 1053 if (new_user_wallpapers->empty()) { | 922 if (new_user_wallpapers->empty()) { |
| 1054 const UserList& users = GetUsers(); | 923 const UserList& users = GetUsers(); |
| 1055 for (UserList::const_iterator it = users.begin(); | 924 for (UserList::const_iterator it = users.begin(); |
| 1056 it != users.end(); | 925 it != users.end(); |
| 1057 ++it) { | 926 ++it) { |
| 1058 std::string username = (*it)->email(); | 927 std::string username = (*it)->email(); |
| 1059 if (user_wallpapers->GetIntegerWithoutPathExpansion((username), | 928 if (user_wallpapers->GetIntegerWithoutPathExpansion((username), |
| 1060 &index)) { | 929 &index)) { |
| 1061 DictionaryPrefUpdate prefs_wallpapers_update(local_state, | 930 DictionaryPrefUpdate prefs_wallpapers_update(local_state, |
| 1062 kUserWallpapers); | 931 kUserWallpapers); |
| 1063 prefs_wallpapers_update->RemoveWithoutPathExpansion(username, NULL); | 932 prefs_wallpapers_update->RemoveWithoutPathExpansion(username, NULL); |
| 1064 SaveUserWallpaperProperties(username, User::DEFAULT, index); | 933 WallpaperManager::Get()->SaveUserWallpaperProperties(username, |
| 934 User::DEFAULT, |
| 935 index); |
| 1065 } else { | 936 } else { |
| 1066 // Before M20, wallpaper index is not saved into LocalState unless | 937 // Before M20, wallpaper index is not saved into LocalState unless |
| 1067 // user specifically sets a wallpaper. After M20, the default | 938 // user specifically sets a wallpaper. After M20, the default |
| 1068 // wallpaper index is saved to LocalState as soon as a new user login. | 939 // wallpaper index is saved to LocalState as soon as a new user login. |
| 1069 // When migrating wallpaper index from M20 to M21, we only migrate | 940 // When migrating wallpaper index from M20 to M21, we only migrate |
| 1070 // data that is in LocalState. This cause a problem when users login | 941 // data that is in LocalState. This cause a problem when users login |
| 1071 // on a M20 device and then update the device to M21. The default | 942 // on a M20 device and then update the device to M21. The default |
| 1072 // wallpaper index failed to migrate because it was not saved into | 943 // wallpaper index failed to migrate because it was not saved into |
| 1073 // LocalState. Then we assume that all users have index saved in | 944 // LocalState. Then we assume that all users have index saved in |
| 1074 // LocalState in M21. This is not true and it results an empty | 945 // LocalState in M21. This is not true and it results an empty |
| 1075 // wallpaper for those users as described in cr/130685. So here we use | 946 // wallpaper for those users as described in cr/130685. So here we use |
| 1076 // default wallpaper for users that exist in user list but does not | 947 // default wallpaper for users that exist in user list but does not |
| 1077 // have an index saved in LocalState. | 948 // have an index saved in LocalState. |
| 1078 SaveUserWallpaperProperties(username, User::DEFAULT, | 949 WallpaperManager::Get()->SaveUserWallpaperProperties(username, |
| 1079 ash::GetDefaultWallpaperIndex()); | 950 User::DEFAULT, ash::GetDefaultWallpaperIndex()); |
| 1080 } | 951 } |
| 1081 } | 952 } |
| 1082 } | 953 } |
| 1083 } | 954 } |
| 1084 } | 955 } |
| 1085 | 956 |
| 1086 void UserManagerImpl::GetLoggedInUserWallpaperProperties( | |
| 1087 User::WallpaperType* type, | |
| 1088 int* index, | |
| 1089 base::Time* last_modification_date) { | |
| 1090 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 1091 DCHECK(logged_in_user_); | |
| 1092 | |
| 1093 if (IsLoggedInAsStub()) { | |
| 1094 *type = current_user_wallpaper_type_ = User::DEFAULT; | |
| 1095 *index = current_user_wallpaper_index_ = ash::GetInvalidWallpaperIndex(); | |
| 1096 return; | |
| 1097 } | |
| 1098 | |
| 1099 GetUserWallpaperProperties(GetLoggedInUser().email(), | |
| 1100 type, | |
| 1101 index, | |
| 1102 last_modification_date); | |
| 1103 } | |
| 1104 | |
| 1105 void UserManagerImpl::SaveLoggedInUserWallpaperProperties( | 957 void UserManagerImpl::SaveLoggedInUserWallpaperProperties( |
| 1106 User::WallpaperType type, | 958 User::WallpaperType type, int index) { |
| 1107 int index) { | 959 WallpaperManager::Get()->SaveUserWallpaperProperties( |
| 1108 SaveUserWallpaperProperties(GetLoggedInUser().email(), type, index); | 960 GetLoggedInUser().email(), type, index); |
| 1109 } | 961 } |
| 1110 | 962 |
| 1111 void UserManagerImpl::SetUserImage(const std::string& username, | 963 void UserManagerImpl::SetUserImage(const std::string& username, |
| 1112 int image_index, | 964 int image_index, |
| 1113 const GURL& image_url, | 965 const GURL& image_url, |
| 1114 const UserImage& user_image) { | 966 const UserImage& user_image) { |
| 1115 User* user = const_cast<User*>(FindUser(username)); | 967 User* user = const_cast<User*>(FindUser(username)); |
| 1116 // User may have been removed by now. | 968 // User may have been removed by now. |
| 1117 if (user) { | 969 if (user) { |
| 1118 // For existing users, a valid image index should have been set upon loading | 970 // For existing users, a valid image index should have been set upon loading |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1133 // Unless this is first-time setting with |SetInitialUserImage|, | 985 // Unless this is first-time setting with |SetInitialUserImage|, |
| 1134 // send a notification about image change. | 986 // send a notification about image change. |
| 1135 content::NotificationService::current()->Notify( | 987 content::NotificationService::current()->Notify( |
| 1136 chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED, | 988 chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED, |
| 1137 content::Source<UserManagerImpl>(this), | 989 content::Source<UserManagerImpl>(this), |
| 1138 content::Details<const User>(user)); | 990 content::Details<const User>(user)); |
| 1139 } | 991 } |
| 1140 } | 992 } |
| 1141 } | 993 } |
| 1142 | 994 |
| 1143 void UserManagerImpl::GetUserWallpaperProperties(const std::string& username, | |
| 1144 User::WallpaperType* type, | |
| 1145 int* index, | |
| 1146 base::Time* last_modification_date) { | |
| 1147 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 1148 | |
| 1149 // Default to the values cached in memory. | |
| 1150 *type = current_user_wallpaper_type_; | |
| 1151 *index = current_user_wallpaper_index_; | |
| 1152 | |
| 1153 // Override with values found in local store, if any. | |
| 1154 if (!username.empty()) { | |
| 1155 const DictionaryValue* user_wallpapers = g_browser_process->local_state()-> | |
| 1156 GetDictionary(UserManager::kUserWallpapersProperties); | |
| 1157 const base::DictionaryValue* wallpaper_properties; | |
| 1158 if (user_wallpapers->GetDictionaryWithoutPathExpansion( | |
| 1159 username, | |
| 1160 &wallpaper_properties)) { | |
| 1161 *type = User::UNKNOWN; | |
| 1162 *index = ash::GetInvalidWallpaperIndex(); | |
| 1163 wallpaper_properties->GetInteger(kWallpaperTypeNodeName, | |
| 1164 reinterpret_cast<int*>(type)); | |
| 1165 wallpaper_properties->GetInteger(kWallpaperIndexNodeName, index); | |
| 1166 std::string date_string; | |
| 1167 int64 val; | |
| 1168 if (!(wallpaper_properties->GetString(kWallpaperDateNodeName, | |
| 1169 &date_string) && | |
| 1170 base::StringToInt64(date_string, &val))) | |
| 1171 val = 0; | |
| 1172 *last_modification_date = base::Time::FromInternalValue(val); | |
| 1173 } | |
| 1174 } | |
| 1175 } | |
| 1176 | |
| 1177 void UserManagerImpl::SaveUserWallpaperProperties(const std::string& username, | |
| 1178 User::WallpaperType type, | |
| 1179 int index) { | |
| 1180 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 1181 | |
| 1182 current_user_wallpaper_type_ = type; | |
| 1183 current_user_wallpaper_index_ = index; | |
| 1184 // Ephemeral users can not save data to local state. We just cache the index | |
| 1185 // in memory for them. | |
| 1186 if (IsCurrentUserEphemeral()) { | |
| 1187 return; | |
| 1188 } | |
| 1189 | |
| 1190 PrefService* local_state = g_browser_process->local_state(); | |
| 1191 DictionaryPrefUpdate wallpaper_update(local_state, | |
| 1192 UserManager::kUserWallpapersProperties); | |
| 1193 | |
| 1194 base::DictionaryValue* wallpaper_properties = new base::DictionaryValue(); | |
| 1195 wallpaper_properties->Set(kWallpaperTypeNodeName, | |
| 1196 new base::FundamentalValue(type)); | |
| 1197 wallpaper_properties->Set(kWallpaperIndexNodeName, | |
| 1198 new base::FundamentalValue(index)); | |
| 1199 wallpaper_properties->SetString(kWallpaperDateNodeName, | |
| 1200 base::Int64ToString(base::Time::Now().LocalMidnight().ToInternalValue())); | |
| 1201 wallpaper_update->SetWithoutPathExpansion(username, wallpaper_properties); | |
| 1202 } | |
| 1203 | |
| 1204 void UserManagerImpl::SaveUserImageInternal(const std::string& username, | 995 void UserManagerImpl::SaveUserImageInternal(const std::string& username, |
| 1205 int image_index, | 996 int image_index, |
| 1206 const GURL& image_url, | 997 const GURL& image_url, |
| 1207 const UserImage& user_image) { | 998 const UserImage& user_image) { |
| 1208 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 999 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1209 | 1000 |
| 1210 SetUserImage(username, image_index, image_url, user_image); | 1001 SetUserImage(username, image_index, image_url, user_image); |
| 1211 | 1002 |
| 1212 // Ignore for ephemeral users. | 1003 // Ignore for ephemeral users. |
| 1213 if (IsEphemeralUser(username)) | 1004 if (IsEphemeralUser(username)) |
| 1214 return; | 1005 return; |
| 1215 | 1006 |
| 1216 FilePath image_path = GetImagePathForUser(username); | 1007 FilePath image_path = GetImagePathForUser(username); |
| 1217 DVLOG(1) << "Saving user image to " << image_path.value(); | 1008 DVLOG(1) << "Saving user image to " << image_path.value(); |
| 1218 | 1009 |
| 1219 last_image_set_async_ = true; | 1010 last_image_set_async_ = true; |
| 1220 | 1011 |
| 1221 BrowserThread::PostTask( | 1012 BrowserThread::PostTask( |
| 1222 BrowserThread::FILE, | 1013 BrowserThread::FILE, |
| 1223 FROM_HERE, | 1014 FROM_HERE, |
| 1224 base::Bind(&UserManagerImpl::SaveImageToFile, | 1015 base::Bind(&UserManagerImpl::SaveImageToFile, |
| 1225 base::Unretained(this), | 1016 base::Unretained(this), |
| 1226 username, user_image, image_path, image_index, image_url)); | 1017 username, user_image, image_path, image_index, image_url)); |
| 1227 } | 1018 } |
| 1228 | 1019 |
| 1229 void UserManagerImpl::SaveUserWallpaperInternal( | |
| 1230 const std::string& username, | |
| 1231 ash::WallpaperLayout layout, | |
| 1232 User::WallpaperType type, | |
| 1233 base::WeakPtr<WallpaperDelegate> delegate, | |
| 1234 const UserImage& user_image) { | |
| 1235 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 1236 | |
| 1237 const SkBitmap& wallpaper = user_image.image(); | |
| 1238 BrowserThread::PostTask( | |
| 1239 BrowserThread::FILE, | |
| 1240 FROM_HERE, | |
| 1241 base::Bind(&UserManagerImpl::GenerateUserWallpaperThumbnail, | |
| 1242 base::Unretained(this), username, type, delegate, wallpaper)); | |
| 1243 | |
| 1244 ash::Shell::GetInstance()->desktop_background_controller()-> | |
| 1245 SetCustomWallpaper(wallpaper, layout); | |
| 1246 | |
| 1247 // Ignore for ephemeral users. | |
| 1248 if (IsEphemeralUser(username)) | |
| 1249 return; | |
| 1250 | |
| 1251 FilePath wallpaper_path = GetWallpaperPathForUser(username, false); | |
| 1252 DVLOG(1) << "Saving user image to " << wallpaper_path.value(); | |
| 1253 | |
| 1254 last_image_set_async_ = true; | |
| 1255 | |
| 1256 BrowserThread::PostTask( | |
| 1257 BrowserThread::FILE, | |
| 1258 FROM_HERE, | |
| 1259 base::Bind(&UserManagerImpl::SaveWallpaperToFile, | |
| 1260 base::Unretained(this), username, wallpaper, wallpaper_path, | |
| 1261 layout, User::CUSTOMIZED)); | |
| 1262 } | |
| 1263 | |
| 1264 void UserManagerImpl::OnCustomWallpaperLoaded(const std::string& email, | |
| 1265 ash::WallpaperLayout layout, | |
| 1266 const UserImage& user_image) { | |
| 1267 const SkBitmap& wallpaper = user_image.image(); | |
| 1268 ash::Shell::GetInstance()->desktop_background_controller()-> | |
| 1269 SetCustomWallpaper(wallpaper, layout); | |
| 1270 // Starting to load wallpaper thumbnail | |
| 1271 std::string wallpaper_thumbnail_path = | |
| 1272 GetWallpaperPathForUser(email, true).value(); | |
| 1273 image_loader_->Start( | |
| 1274 wallpaper_thumbnail_path, 0, | |
| 1275 base::Bind(&UserManagerImpl::OnCustomWallpaperThumbnailLoaded, | |
| 1276 base::Unretained(this), email)); | |
| 1277 } | |
| 1278 | |
| 1279 void UserManagerImpl::OnCustomWallpaperThumbnailLoaded( | |
| 1280 const std::string& email, | |
| 1281 const UserImage& user_image) { | |
| 1282 const SkBitmap& wallpaper = user_image.image(); | |
| 1283 User* user = const_cast<User*>(FindUser(email)); | |
| 1284 // User may have been removed by now. | |
| 1285 if (user && !wallpaper.empty()) | |
| 1286 user->SetWallpaperThumbnail(wallpaper); | |
| 1287 } | |
| 1288 | |
| 1289 void UserManagerImpl::OnThumbnailUpdated( | |
| 1290 base::WeakPtr<WallpaperDelegate> delegate) { | |
| 1291 if (delegate) | |
| 1292 delegate->SetCustomWallpaperThumbnail(); | |
| 1293 } | |
| 1294 | |
| 1295 void UserManagerImpl::GenerateUserWallpaperThumbnail( | |
| 1296 const std::string& username, | |
| 1297 User::WallpaperType type, | |
| 1298 base::WeakPtr<WallpaperDelegate> delegate, | |
| 1299 const SkBitmap& wallpaper) { | |
| 1300 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | |
| 1301 SkBitmap thumbnail = | |
| 1302 skia::ImageOperations::Resize(wallpaper, | |
| 1303 skia::ImageOperations::RESIZE_LANCZOS3, | |
| 1304 kThumbnailWidth, kThumbnailHeight); | |
| 1305 logged_in_user_->SetWallpaperThumbnail(thumbnail); | |
| 1306 | |
| 1307 // Notify thumbnail is ready. | |
| 1308 BrowserThread::PostTask( | |
| 1309 BrowserThread::UI, | |
| 1310 FROM_HERE, | |
| 1311 base::Bind(&UserManagerImpl::OnThumbnailUpdated, | |
| 1312 base::Unretained(this), delegate)); | |
| 1313 | |
| 1314 // Ignore for ephemeral users. | |
| 1315 if (IsEphemeralUser(username)) | |
| 1316 return; | |
| 1317 | |
| 1318 FilePath thumbnail_path = GetWallpaperPathForUser(username, true); | |
| 1319 SaveBitmapToFile(UserImage(thumbnail), thumbnail_path); | |
| 1320 } | |
| 1321 | |
| 1322 void UserManagerImpl::SaveImageToFile(const std::string& username, | 1020 void UserManagerImpl::SaveImageToFile(const std::string& username, |
| 1323 const UserImage& user_image, | 1021 const UserImage& user_image, |
| 1324 const FilePath& image_path, | 1022 const FilePath& image_path, |
| 1325 int image_index, | 1023 int image_index, |
| 1326 const GURL& image_url) { | 1024 const GURL& image_url) { |
| 1327 if (!SaveBitmapToFile(user_image, image_path)) | 1025 if (!SaveBitmapToFile(user_image, image_path)) |
| 1328 return; | 1026 return; |
| 1329 | 1027 |
| 1330 BrowserThread::PostTask( | 1028 BrowserThread::PostTask( |
| 1331 BrowserThread::UI, | 1029 BrowserThread::UI, |
| 1332 FROM_HERE, | 1030 FROM_HERE, |
| 1333 base::Bind(&UserManagerImpl::SaveImageToLocalState, | 1031 base::Bind(&UserManagerImpl::SaveImageToLocalState, |
| 1334 base::Unretained(this), | 1032 base::Unretained(this), |
| 1335 username, image_path.value(), image_index, image_url, true)); | 1033 username, image_path.value(), image_index, image_url, true)); |
| 1336 } | 1034 } |
| 1337 | 1035 |
| 1338 void UserManagerImpl::SaveWallpaperToFile(const std::string& username, | |
| 1339 const SkBitmap& wallpaper, | |
| 1340 const FilePath& wallpaper_path, | |
| 1341 ash::WallpaperLayout layout, | |
| 1342 User::WallpaperType type) { | |
| 1343 // TODO(bshe): We should save the original file unchanged instead of | |
| 1344 // re-encoding it and saving it. | |
| 1345 if (!SaveBitmapToFile(UserImage(wallpaper), wallpaper_path)) | |
| 1346 return; | |
| 1347 | |
| 1348 BrowserThread::PostTask( | |
| 1349 BrowserThread::UI, | |
| 1350 FROM_HERE, | |
| 1351 base::Bind(&UserManagerImpl::SaveWallpaperToLocalState, | |
| 1352 base::Unretained(this), | |
| 1353 username, wallpaper_path.value(), layout, type)); | |
| 1354 } | |
| 1355 | |
| 1356 void UserManagerImpl::SaveImageToLocalState(const std::string& username, | 1036 void UserManagerImpl::SaveImageToLocalState(const std::string& username, |
| 1357 const std::string& image_path, | 1037 const std::string& image_path, |
| 1358 int image_index, | 1038 int image_index, |
| 1359 const GURL& image_url, | 1039 const GURL& image_url, |
| 1360 bool is_async) { | 1040 bool is_async) { |
| 1361 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1041 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1362 | 1042 |
| 1363 // Ignore for ephemeral users. | 1043 // Ignore for ephemeral users. |
| 1364 if (IsEphemeralUser(username)) | 1044 if (IsEphemeralUser(username)) |
| 1365 return; | 1045 return; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1391 DVLOG(1) << "Saving path to user image in Local State."; | 1071 DVLOG(1) << "Saving path to user image in Local State."; |
| 1392 | 1072 |
| 1393 NotifyLocalStateChanged(); | 1073 NotifyLocalStateChanged(); |
| 1394 } | 1074 } |
| 1395 | 1075 |
| 1396 void UserManagerImpl::SaveWallpaperToLocalState(const std::string& username, | 1076 void UserManagerImpl::SaveWallpaperToLocalState(const std::string& username, |
| 1397 const std::string& wallpaper_path, | 1077 const std::string& wallpaper_path, |
| 1398 ash::WallpaperLayout layout, | 1078 ash::WallpaperLayout layout, |
| 1399 User::WallpaperType type) { | 1079 User::WallpaperType type) { |
| 1400 // TODO(bshe): We probably need to save wallpaper_path instead of index. | 1080 // TODO(bshe): We probably need to save wallpaper_path instead of index. |
| 1401 SaveUserWallpaperProperties(username, type, layout); | 1081 WallpaperManager::Get()->SaveUserWallpaperProperties(username, type, layout); |
| 1402 } | 1082 } |
| 1403 | 1083 |
| 1404 bool UserManagerImpl::SaveBitmapToFile(const UserImage& user_image, | 1084 bool UserManagerImpl::SaveBitmapToFile(const UserImage& user_image, |
| 1405 const FilePath& image_path) { | 1085 const FilePath& image_path) { |
| 1406 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 1086 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 1407 | 1087 |
| 1408 const UserImage::RawImage* encoded_image = NULL; | 1088 const UserImage::RawImage* encoded_image = NULL; |
| 1409 if (user_image.has_animated_image()) { | 1089 if (user_image.has_animated_image()) { |
| 1410 encoded_image = &user_image.animated_image(); | 1090 encoded_image = &user_image.animated_image(); |
| 1411 } else if (user_image.has_raw_image()) { | 1091 } else if (user_image.has_raw_image()) { |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1639 prefs_users_update->Append(Value::CreateStringValue(user_email)); | 1319 prefs_users_update->Append(Value::CreateStringValue(user_email)); |
| 1640 else | 1320 else |
| 1641 user_to_remove = it; | 1321 user_to_remove = it; |
| 1642 } | 1322 } |
| 1643 | 1323 |
| 1644 DictionaryPrefUpdate prefs_wallpapers_update(prefs, | 1324 DictionaryPrefUpdate prefs_wallpapers_update(prefs, |
| 1645 kUserWallpapersProperties); | 1325 kUserWallpapersProperties); |
| 1646 prefs_wallpapers_update->RemoveWithoutPathExpansion(email, NULL); | 1326 prefs_wallpapers_update->RemoveWithoutPathExpansion(email, NULL); |
| 1647 | 1327 |
| 1648 // Remove user wallpaper thumbnail | 1328 // Remove user wallpaper thumbnail |
| 1649 FilePath wallpaper_thumb_path = GetWallpaperPathForUser(email, true); | 1329 FilePath wallpaper_thumb_path = WallpaperManager::Get()-> |
| 1330 GetWallpaperPathForUser(email, true); |
| 1650 BrowserThread::PostTask( | 1331 BrowserThread::PostTask( |
| 1651 BrowserThread::FILE, | 1332 BrowserThread::FILE, |
| 1652 FROM_HERE, | 1333 FROM_HERE, |
| 1653 base::Bind(&UserManagerImpl::DeleteUserImage, | 1334 base::Bind(&UserManagerImpl::DeleteUserImage, |
| 1654 base::Unretained(this), | 1335 base::Unretained(this), |
| 1655 wallpaper_thumb_path)); | 1336 wallpaper_thumb_path)); |
| 1656 // Remove user wallpaper | 1337 // Remove user wallpaper |
| 1657 FilePath wallpaper_path = GetWallpaperPathForUser(email, false); | 1338 FilePath wallpaper_path = WallpaperManager::Get()-> |
| 1339 GetWallpaperPathForUser(email, false); |
| 1658 BrowserThread::PostTask( | 1340 BrowserThread::PostTask( |
| 1659 BrowserThread::FILE, | 1341 BrowserThread::FILE, |
| 1660 FROM_HERE, | 1342 FROM_HERE, |
| 1661 base::Bind(&UserManagerImpl::DeleteUserImage, | 1343 base::Bind(&UserManagerImpl::DeleteUserImage, |
| 1662 base::Unretained(this), | 1344 base::Unretained(this), |
| 1663 wallpaper_path)); | 1345 wallpaper_path)); |
| 1664 | 1346 |
| 1665 DictionaryPrefUpdate prefs_images_update(prefs, kUserImages); | 1347 DictionaryPrefUpdate prefs_images_update(prefs, kUserImages); |
| 1666 std::string image_path_string; | 1348 std::string image_path_string; |
| 1667 prefs_images_update->GetStringWithoutPathExpansion(email, &image_path_string); | 1349 prefs_images_update->GetStringWithoutPathExpansion(email, &image_path_string); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1690 BrowserThread::PostTask( | 1372 BrowserThread::PostTask( |
| 1691 BrowserThread::FILE, | 1373 BrowserThread::FILE, |
| 1692 FROM_HERE, | 1374 FROM_HERE, |
| 1693 base::Bind(&UserManagerImpl::DeleteUserImage, | 1375 base::Bind(&UserManagerImpl::DeleteUserImage, |
| 1694 base::Unretained(this), | 1376 base::Unretained(this), |
| 1695 image_path)); | 1377 image_path)); |
| 1696 } | 1378 } |
| 1697 } | 1379 } |
| 1698 | 1380 |
| 1699 } // namespace chromeos | 1381 } // namespace chromeos |
| OLD | NEW |