| Index: chrome/browser/chromeos/login/user_manager_impl.cc
|
| diff --git a/chrome/browser/chromeos/login/user_manager_impl.cc b/chrome/browser/chromeos/login/user_manager_impl.cc
|
| index 8ae199068ace8fd03d9095b319083082d6532d59..d50b8a7fb60603218b4400002c02c39a34dec811 100644
|
| --- a/chrome/browser/chromeos/login/user_manager_impl.cc
|
| +++ b/chrome/browser/chromeos/login/user_manager_impl.cc
|
| @@ -8,7 +8,6 @@
|
|
|
| #include "ash/shell.h"
|
| #include "ash/desktop_background/desktop_background_controller.h"
|
| -#include "ash/desktop_background/desktop_background_resources.h"
|
| #include "base/bind.h"
|
| #include "base/chromeos/chromeos_version.h"
|
| #include "base/command_line.h"
|
| @@ -77,6 +76,9 @@ const char kStubUser[] = "stub-user@example.com";
|
| const char kImagePathNodeName[] = "path";
|
| const char kImageIndexNodeName[] = "index";
|
|
|
| +const char kWallpaperTypeNodeName[] = "type";
|
| +const char kWallpaperIndexNodeName[] = "index";
|
| +
|
| // Index of the default image used for the |kStubUser| user.
|
| const int kStubDefaultImageIndex = 0;
|
|
|
| @@ -305,6 +307,8 @@ UserManagerImpl::UserManagerImpl()
|
| StubUserLoggedIn();
|
| }
|
|
|
| + MigrateWallpaperData();
|
| +
|
| registrar_.Add(this, chrome::NOTIFICATION_OWNER_KEY_FETCH_ATTEMPT_SUCCEEDED,
|
| content::NotificationService::AllSources());
|
| registrar_.Add(this, chrome::NOTIFICATION_PROFILE_ADDED,
|
| @@ -327,9 +331,6 @@ const UserList& UserManagerImpl::GetUsers() const {
|
| }
|
|
|
| void UserManagerImpl::UserLoggedIn(const std::string& email) {
|
| - // Get a random wallpaper each time a user logged in.
|
| - current_user_wallpaper_index_ = ash::GetDefaultWallpaperIndex();
|
| -
|
| // Remove the stub user if it is still around.
|
| if (logged_in_user_) {
|
| DCHECK(IsLoggedInAsStub());
|
| @@ -429,8 +430,6 @@ void UserManagerImpl::DemoUserLoggedIn() {
|
|
|
| void UserManagerImpl::GuestUserLoggedIn() {
|
| is_current_user_ephemeral_ = true;
|
| - // Guest user always uses the same wallpaper.
|
| - current_user_wallpaper_index_ = ash::GetGuestWallpaperIndex();
|
| logged_in_user_ = new User(kGuestUser, true);
|
| NotifyOnLogin();
|
| }
|
| @@ -446,7 +445,6 @@ void UserManagerImpl::EphemeralUserLoggedIn(const std::string& email) {
|
|
|
| void UserManagerImpl::StubUserLoggedIn() {
|
| is_current_user_ephemeral_ = true;
|
| - current_user_wallpaper_index_ = ash::GetGuestWallpaperIndex();
|
| logged_in_user_ = new User(kStubUser, false);
|
| logged_in_user_->SetImage(GetDefaultImage(kStubDefaultImageIndex),
|
| kStubDefaultImageIndex);
|
| @@ -454,8 +452,17 @@ void UserManagerImpl::StubUserLoggedIn() {
|
|
|
| void UserManagerImpl::UserSelected(const std::string& email) {
|
| if (IsKnownUser(email)) {
|
| + int index;
|
| + User::WallpaperType type;
|
| + GetUserWallpaperProperties(email, type, index);
|
| + if (type == User::RANDOM) {
|
| + // Generate a new random wallpaper index if the selected user chose
|
| + // RANDOM wallpaper.
|
| + index = ash::GetRandomWallpaperIndex();
|
| + SaveUserWallpaperProperties(email, User::RANDOM, index);
|
| + }
|
| ash::Shell::GetInstance()->desktop_background_controller()->
|
| - SetDefaultWallpaper(FindUserWallpaperIndex(email));
|
| + SetDefaultWallpaper(index);
|
| }
|
| }
|
|
|
| @@ -905,20 +912,6 @@ const User* UserManagerImpl::FindUserInList(const std::string& email) const {
|
| return NULL;
|
| }
|
|
|
| -int UserManagerImpl::FindUserWallpaperIndex(const std::string& email) {
|
| - PrefService* local_state = g_browser_process->local_state();
|
| - const DictionaryValue* user_wallpapers =
|
| - local_state->GetDictionary(UserManager::kUserWallpapers);
|
| - int index;
|
| - if (!user_wallpapers->GetIntegerWithoutPathExpansion(email, &index))
|
| - index = current_user_wallpaper_index_;
|
| - if (index < 0 || index >= ash::GetWallpaperCount()) {
|
| - index = ash::GetDefaultWallpaperIndex();
|
| - SaveUserWallpaperIndex(index);
|
| - }
|
| - return index;
|
| -}
|
| -
|
| void UserManagerImpl::NotifyOnLogin() {
|
| CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| content::NotificationService::current()->Notify(
|
| @@ -968,13 +961,18 @@ void UserManagerImpl::SetInitialUserImage(const std::string& username) {
|
| }
|
|
|
| void UserManagerImpl::SetInitialUserWallpaper(const std::string& username) {
|
| + current_user_wallpaper_type_ = User::DEFAULT;
|
| // TODO(bshe): Ideally, wallpaper should start to load as soon as user click
|
| // "Add user".
|
| if (username == kGuestUser)
|
| current_user_wallpaper_index_ = ash::GetGuestWallpaperIndex();
|
| else
|
| current_user_wallpaper_index_ = ash::GetDefaultWallpaperIndex();
|
| - SaveUserWallpaperIndex(current_user_wallpaper_index_);
|
| +
|
| + SaveUserWallpaperProperties(username,
|
| + current_user_wallpaper_type_,
|
| + current_user_wallpaper_index_);
|
| +
|
| // Some browser tests do not have shell instance. And it is not necessary to
|
| // create a wallpaper for these tests. Add HasInstance check to prevent tests
|
| // crash and speed up the tests by avoid loading wallpaper.
|
| @@ -984,28 +982,69 @@ void UserManagerImpl::SetInitialUserWallpaper(const std::string& username) {
|
| }
|
| }
|
|
|
| -int UserManagerImpl::GetUserWallpaperIndex() {
|
| +void UserManagerImpl::MigrateWallpaperData() {
|
| + PrefService* local_state = g_browser_process->local_state();
|
| + if (local_state) {
|
| + const DictionaryValue* user_wallpapers =
|
| + local_state->GetDictionary(kUserWallpapers);
|
| + int index;
|
| + if (user_wallpapers) {
|
| + const UserList& users = GetUsers();
|
| + for (UserList::const_iterator it = users.begin();
|
| + it != users.end();
|
| + ++it) {
|
| + std::string username = (*it)->email();
|
| + if (user_wallpapers->GetIntegerWithoutPathExpansion((username),
|
| + &index)) {
|
| + DictionaryPrefUpdate prefs_wallpapers_update(local_state,
|
| + kUserWallpapers);
|
| + prefs_wallpapers_update->RemoveWithoutPathExpansion(username, NULL);
|
| + SaveUserWallpaperProperties(username, User::DEFAULT, index);
|
| + }
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +int UserManagerImpl::GetLoggedInUserWallpaperIndex() {
|
| + int index;
|
| + User::WallpaperType type;
|
| + GetLoggedInUserWallpaperProperties(type, index);
|
| + return index;
|
| +}
|
| +
|
| +void UserManagerImpl::GetLoggedInUserWallpaperProperties(
|
| + User::WallpaperType& type, int& index) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| - // If at login screen, use an invalid index to prevent any wallpaper
|
| - // operation.
|
| - if (!IsUserLoggedIn() || IsLoggedInAsStub())
|
| - return ash::GetInvalidWallpaperIndex();
|
| + if (!IsUserLoggedIn() || IsLoggedInAsStub()) {
|
| + index = ash::GetInvalidWallpaperIndex();
|
| + current_user_wallpaper_index_ = index;
|
| + current_user_wallpaper_type_ = User::DEFAULT;
|
| + return;
|
| + }
|
| +
|
| // If logged in as other ephemeral users (Demo/Stub/Normal user with
|
| // ephemeral policy enabled/Guest), use the index in memory.
|
| - if (IsCurrentUserEphemeral())
|
| - return current_user_wallpaper_index_;
|
| + if (IsCurrentUserEphemeral()) {
|
| + type = current_user_wallpaper_type_;
|
| + index = current_user_wallpaper_index_;
|
| + return;
|
| + }
|
|
|
| const chromeos::User& user = GetLoggedInUser();
|
| std::string username = user.email();
|
| DCHECK(!username.empty());
|
| - return FindUserWallpaperIndex(username);
|
| +
|
| + GetUserWallpaperProperties(username, type, index);
|
| }
|
|
|
| -void UserManagerImpl::SaveUserWallpaperIndex(int wallpaper_index) {
|
| +void UserManagerImpl::SaveLoggedInUserWallpaperProperties(
|
| + User::WallpaperType type, int index) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| - current_user_wallpaper_index_ = wallpaper_index;
|
| + current_user_wallpaper_type_ = type;
|
| + current_user_wallpaper_index_ = index;
|
| // Ephemeral users can not save data to local state. We just cache the index
|
| // in memory for them.
|
| if (IsCurrentUserEphemeral() || !IsUserLoggedIn()) {
|
| @@ -1016,11 +1055,7 @@ void UserManagerImpl::SaveUserWallpaperIndex(int wallpaper_index) {
|
| std::string username = user.email();
|
| DCHECK(!username.empty());
|
|
|
| - PrefService* local_state = g_browser_process->local_state();
|
| - DictionaryPrefUpdate wallpapers_update(local_state,
|
| - UserManager::kUserWallpapers);
|
| - wallpapers_update->SetWithoutPathExpansion(username,
|
| - new base::FundamentalValue(wallpaper_index));
|
| + SaveUserWallpaperProperties(username, type, index);
|
| }
|
|
|
| void UserManagerImpl::SetUserImage(const std::string& username,
|
| @@ -1053,6 +1088,57 @@ void UserManagerImpl::SetUserImage(const std::string& username,
|
| }
|
| }
|
|
|
| +void UserManagerImpl::GetUserWallpaperProperties(const std::string& username,
|
| + User::WallpaperType& type,
|
| + int& index) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + PrefService* local_state = g_browser_process->local_state();
|
| +
|
| + const DictionaryValue* user_wallpapers =
|
| + local_state->GetDictionary(UserManager::kUserWallpapersProperties);
|
| +
|
| + type = User::DEFAULT;
|
| + index = ash::GetDefaultWallpaperIndex();
|
| +
|
| + if (user_wallpapers) {
|
| + base::DictionaryValue* wallpaper_properties;
|
| + user_wallpapers->GetDictionaryWithoutPathExpansion(username,
|
| + &wallpaper_properties);
|
| + if (wallpaper_properties) {
|
| + int saved_type = User::UNKNOWN;
|
| + wallpaper_properties->GetInteger(kWallpaperTypeNodeName, &saved_type);
|
| + type = static_cast<User::WallpaperType>(saved_type);
|
| + wallpaper_properties->GetInteger(kWallpaperIndexNodeName, &index);
|
| + }
|
| + }
|
| +}
|
| +
|
| +void UserManagerImpl::SaveUserWallpaperProperties(const std::string& username,
|
| + User::WallpaperType type,
|
| + int index) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + current_user_wallpaper_type_ = type;
|
| + current_user_wallpaper_index_ = index;
|
| + // Ephemeral users can not save data to local state. We just cache the index
|
| + // in memory for them.
|
| + if (IsCurrentUserEphemeral()) {
|
| + return;
|
| + }
|
| +
|
| + PrefService* local_state = g_browser_process->local_state();
|
| + DictionaryPrefUpdate wallpaper_update(local_state,
|
| + UserManager::kUserWallpapersProperties);
|
| +
|
| + base::DictionaryValue* wallpaper_properties = new base::DictionaryValue();
|
| + wallpaper_properties->Set(kWallpaperTypeNodeName,
|
| + new base::FundamentalValue(type));
|
| + wallpaper_properties->Set(kWallpaperIndexNodeName,
|
| + new base::FundamentalValue(index));
|
| + wallpaper_update->SetWithoutPathExpansion(username, wallpaper_properties);
|
| +}
|
| +
|
| void UserManagerImpl::SaveUserImageInternal(const std::string& username,
|
| int image_index,
|
| const SkBitmap& image) {
|
| @@ -1280,7 +1366,7 @@ void UserManagerImpl::RemoveUserFromListInternal(const std::string& email) {
|
| }
|
|
|
| DictionaryPrefUpdate prefs_wallpapers_update(prefs,
|
| - kUserWallpapers);
|
| + kUserWallpapersProperties);
|
| prefs_wallpapers_update->RemoveWithoutPathExpansion(email, NULL);
|
|
|
| DictionaryPrefUpdate prefs_images_update(prefs, kUserImages);
|
|
|