diff options
author | avayvod@chromium.org <avayvod@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-29 18:26:05 +0000 |
---|---|---|
committer | avayvod@chromium.org <avayvod@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-29 18:26:05 +0000 |
commit | f202429bdd316c214b193e1807d9c1161b9fd575 (patch) | |
tree | 9a79c493691419bed4190d60acc2e6e7d82b202e /chrome/browser/chromeos | |
parent | 78d78a682025d5c60a6a4db42cff6d1c17436fa0 (diff) | |
download | chromium_src-f202429bdd316c214b193e1807d9c1161b9fd575.zip chromium_src-f202429bdd316c214b193e1807d9c1161b9fd575.tar.gz chromium_src-f202429bdd316c214b193e1807d9c1161b9fd575.tar.bz2 |
[cros] Adding image index/type to the LocalState
R=nkostylev@chromium.org,ivankr@chromium.org
BUG=chromium-os:18216
TEST=Should be no visible change. Format of Local State file should change for new users.
Review URL: http://codereview.chromium.org/8071022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@103315 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chromeos')
-rw-r--r-- | chrome/browser/chromeos/login/default_user_images.cc | 5 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/default_user_images.h | 3 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/user_image_loader.cc | 4 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/user_image_loader.h | 6 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/user_image_screen.cc | 21 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/user_image_screen.h | 3 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/user_manager.cc | 116 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/user_manager.h | 7 |
8 files changed, 115 insertions, 50 deletions
diff --git a/chrome/browser/chromeos/login/default_user_images.cc b/chrome/browser/chromeos/login/default_user_images.cc index 5e61c14..3757767 100644 --- a/chrome/browser/chromeos/login/default_user_images.cc +++ b/chrome/browser/chromeos/login/default_user_images.cc @@ -118,9 +118,12 @@ const int kDefaultImageResources[] = { const int kDefaultImagesCount = arraysize(kDefaultImageResources); +// The order and the values of these constants are important for histograms +// of different Chrome OS versions to be merged smoothly. const int kHistogramImageFromCamera = kDefaultImagesCount; const int kHistogramImageFromFile = kDefaultImagesCount + 1; const int kHistogramImageOld = kDefaultImagesCount + 2; -const int kHistogramImagesCount = kDefaultImagesCount + 3; +const int kHistogramImageFromProfile = kDefaultImagesCount + 3; +const int kHistogramImagesCount = kDefaultImagesCount + 4; } // namespace chromeos diff --git a/chrome/browser/chromeos/login/default_user_images.h b/chrome/browser/chromeos/login/default_user_images.h index 63366eb..b0a96e4 100644 --- a/chrome/browser/chromeos/login/default_user_images.h +++ b/chrome/browser/chromeos/login/default_user_images.h @@ -42,6 +42,9 @@ extern const int kHistogramImageFromCamera; // image from camera/file. extern const int kHistogramImageOld; +// Image index to be used in histograms when user image is taken from profile. +extern const int kHistogramImageFromProfile; + // Number of possible user image indices to be used in histograms. extern const int kHistogramImagesCount; diff --git a/chrome/browser/chromeos/login/user_image_loader.cc b/chrome/browser/chromeos/login/user_image_loader.cc index d45560e..97d05c4 100644 --- a/chrome/browser/chromeos/login/user_image_loader.cc +++ b/chrome/browser/chromeos/login/user_image_loader.cc @@ -27,10 +27,11 @@ UserImageLoader::~UserImageLoader() { void UserImageLoader::Start(const std::string& username, const std::string& filename, + int image_index, bool should_save_image) { target_message_loop_ = MessageLoop::current(); - ImageInfo image_info(username, should_save_image); + ImageInfo image_info(username, image_index, should_save_image); BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, NewRunnableMethod(this, @@ -93,6 +94,7 @@ void UserImageLoader::NotifyDelegate(const SkBitmap& image, if (delegate_) { delegate_->OnImageLoaded(image_info.username, image, + image_info.image_index, image_info.should_save_image); } } diff --git a/chrome/browser/chromeos/login/user_image_loader.h b/chrome/browser/chromeos/login/user_image_loader.h index ced5e10..c3011e0 100644 --- a/chrome/browser/chromeos/login/user_image_loader.h +++ b/chrome/browser/chromeos/login/user_image_loader.h @@ -30,6 +30,7 @@ class UserImageLoader : public base::RefCountedThreadSafe<UserImageLoader>, // for later use. virtual void OnImageLoaded(const std::string& username, const SkBitmap& image, + int image_index, bool should_save_image) = 0; protected: @@ -42,6 +43,7 @@ class UserImageLoader : public base::RefCountedThreadSafe<UserImageLoader>, // |should_save_image| is passed to OnImageLoaded handler. void Start(const std::string& username, const std::string& filepath, + int image_index, bool should_save_image); void set_delegate(Delegate* delegate) { delegate_ = delegate; } @@ -51,12 +53,14 @@ class UserImageLoader : public base::RefCountedThreadSafe<UserImageLoader>, // Contains attributes we need to know about each image we decode. struct ImageInfo { - ImageInfo(const std::string& username, bool should_save) + ImageInfo(const std::string& username, int image_index, bool should_save) : username(username), + image_index(image_index), should_save_image(should_save) { } std::string username; + int image_index; bool should_save_image; }; diff --git a/chrome/browser/chromeos/login/user_image_screen.cc b/chrome/browser/chromeos/login/user_image_screen.cc index 0021dab..13e1ee6 100644 --- a/chrome/browser/chromeos/login/user_image_screen.cc +++ b/chrome/browser/chromeos/login/user_image_screen.cc @@ -110,7 +110,8 @@ void UserImageScreen::StopCamera() { camera_controller_.Stop(); } -void UserImageScreen::OnPhotoTaken(const SkBitmap& image) { +void UserImageScreen::OnNonDefaultImageSelected(const SkBitmap& image, + int image_index) { camera_controller_.Stop(); UserManager* user_manager = UserManager::Get(); @@ -119,20 +120,23 @@ void UserImageScreen::OnPhotoTaken(const SkBitmap& image) { const UserManager::User& user = user_manager->logged_in_user(); DCHECK(!user.email().empty()); - user_manager->SetLoggedInUserImage(image, - UserManager::User::kExternalImageIndex); - user_manager->SaveUserImage(user.email(), image); + user_manager->SetLoggedInUserImage(image, image_index); + user_manager->SaveUserImage(user.email(), image, image_index); get_screen_observer()->OnExit(ScreenObserver::USER_IMAGE_SELECTED); +} +void UserImageScreen::OnPhotoTaken(const SkBitmap& image) { + OnNonDefaultImageSelected(image, UserManager::User::kExternalImageIndex); UMA_HISTOGRAM_ENUMERATION("UserImage.FirstTimeChoice", kHistogramImageFromCamera, kHistogramImagesCount); } void UserImageScreen::OnProfileImageSelected(const SkBitmap& image) { - // TODO(avayvod): Save profile image differently to allow for its update - // later on login. - OnPhotoTaken(image); + OnNonDefaultImageSelected(image, UserManager::User::kProfileImageIndex); + UMA_HISTOGRAM_ENUMERATION("UserImage.FirstTimeChoice", + kHistogramImageFromProfile, + kHistogramImagesCount); } void UserImageScreen::OnDefaultImageSelected(int index) { @@ -149,7 +153,8 @@ void UserImageScreen::OnDefaultImageSelected(int index) { user_manager->SetLoggedInUserImage(*image, index); user_manager->SaveUserImagePath( user.email(), - GetDefaultImagePath(static_cast<size_t>(index))); + GetDefaultImagePath(index), + index); get_screen_observer()->OnExit(ScreenObserver::USER_IMAGE_SELECTED); UMA_HISTOGRAM_ENUMERATION("UserImage.FirstTimeChoice", diff --git a/chrome/browser/chromeos/login/user_image_screen.h b/chrome/browser/chromeos/login/user_image_screen.h index ecc1c4a..d9af994 100644 --- a/chrome/browser/chromeos/login/user_image_screen.h +++ b/chrome/browser/chromeos/login/user_image_screen.h @@ -53,6 +53,9 @@ class UserImageScreen: public WizardScreen, virtual void OnDownloadSuccess(const SkBitmap& profile_image) OVERRIDE; private: + // Common method that handles setting photo or profile image. + void OnNonDefaultImageSelected(const SkBitmap& image, int image_index); + CameraController camera_controller_; NotificationRegistrar registrar_; diff --git a/chrome/browser/chromeos/login/user_manager.cc b/chrome/browser/chromeos/login/user_manager.cc index 2d8d85b..1c0bf09 100644 --- a/chrome/browser/chromeos/login/user_manager.cc +++ b/chrome/browser/chromeos/login/user_manager.cc @@ -54,6 +54,10 @@ const char kUserOAuthTokenStatus[] = "OAuthTokenStatus"; // depends on that and it's hard to figure out what). const char kGuestUser[] = ""; +// Names of nodes with info about user image. +const char kImagePathNodeName[] = "path"; +const char kImageIndexNodeName[] = "index"; + base::LazyInstance<UserManager> g_user_manager(base::LINKER_INITIALIZED); // Stores user's OAuthTokenStatus in local state. Runs on UI thread. @@ -93,13 +97,18 @@ UserManager::OAuthTokenStatus GetOAuthTokenStatusFromLocalState( return UserManager::OAUTH_TOKEN_STATUS_UNKNOWN; } -// Stores path to the image in local state. Runs on UI thread. -void SavePathToLocalState(const std::string& username, - const std::string& image_path) { +// Stores path to the image and its index in local state. Runs on UI thread. +void SaveImageToLocalState(const std::string& username, + const std::string& image_path, + int image_index) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); PrefService* local_state = g_browser_process->local_state(); DictionaryPrefUpdate images_update(local_state, kUserImages); - images_update->SetWithoutPathExpansion(username, new StringValue(image_path)); + base::DictionaryValue* image_properties = new base::DictionaryValue(); + image_properties->Set(kImagePathNodeName, new StringValue(image_path)); + image_properties->Set(kImageIndexNodeName, + new base::FundamentalValue(image_index)); + images_update->SetWithoutPathExpansion(username, image_properties); DVLOG(1) << "Saving path to user image in Local State."; local_state->SavePersistentPrefs(); UserManager::Get()->NotifyLocalStateChanged(); @@ -111,10 +120,11 @@ void SavePathToLocalState(const std::string& username, } // Saves image to file with specified path. Runs on FILE thread. -// Posts task for saving image path to local state on UI thread. +// Posts task for saving image info to local state on UI thread. void SaveImageToFile(const SkBitmap& image, const FilePath& image_path, - const std::string& username) { + const std::string& username, + int image_index) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); std::vector<unsigned char> encoded_image; if (!gfx::PNGCodec::EncodeBGRASkBitmap(image, true, &encoded_image)) { @@ -132,8 +142,8 @@ void SaveImageToFile(const SkBitmap& image, BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, - NewRunnableFunction(&SavePathToLocalState, - username, image_path.value())); + NewRunnableFunction(&SaveImageToLocalState, + username, image_path.value(), image_index)); } // Deletes user's image file. Runs on FILE thread. @@ -325,28 +335,56 @@ std::vector<UserManager::User> UserManager::GetUsers() const { user.set_email(email); user.set_oauth_token_status(GetOAuthTokenStatusFromLocalState(email)); - std::string image_path; - // Get account image path. - if (prefs_images && - prefs_images->GetStringWithoutPathExpansion(email, &image_path)) { - int default_image_id = kDefaultImagesCount; - if (IsDefaultImagePath(image_path, &default_image_id)) { - DCHECK(default_image_id >= 0); - DCHECK(default_image_id < kDefaultImagesCount); - int resource_id = kDefaultImageResources[default_image_id]; - user.SetImage( - *ResourceBundle::GetSharedInstance().GetBitmapNamed( - resource_id), - default_image_id); - } else { - UserImages::const_iterator image_it = user_images_.find(email); - if (image_it == user_images_.end()) { - // Insert the default image so we don't send another request if - // GetUsers is called twice. - user_images_[email] = user.image(); - image_loader_->Start(email, image_path, false); + if (prefs_images) { + // Get account image path. + // TODO(avayvod): Reading image path as a string is here for + // backward compatibility. + std::string image_path; + base::DictionaryValue* image_properties; + if (prefs_images->GetStringWithoutPathExpansion(email, &image_path)) { + int default_image_id = kDefaultImagesCount; + if (IsDefaultImagePath(image_path, &default_image_id)) { + DCHECK(default_image_id >= 0); + DCHECK(default_image_id < kDefaultImagesCount); + int resource_id = kDefaultImageResources[default_image_id]; + user.SetImage( + *ResourceBundle::GetSharedInstance().GetBitmapNamed( + resource_id), + default_image_id); } else { - user.SetImage(image_it->second, User::kExternalImageIndex); + UserImages::const_iterator image_it = user_images_.find(email); + if (image_it == user_images_.end()) { + // Insert the default image so we don't send another request if + // GetUsers is called twice. + user_images_[email] = user.image(); + image_loader_->Start( + email, image_path, User::kExternalImageIndex, false); + } else { + user.SetImage(image_it->second, User::kExternalImageIndex); + } + } + } else if (prefs_images->GetDictionaryWithoutPathExpansion( + email, &image_properties)) { + int image_index = User::kInvalidImageIndex; + image_properties->GetString(kImagePathNodeName, &image_path); + image_properties->GetInteger(kImageIndexNodeName, &image_index); + if (image_index >= 0 && image_index < kDefaultImagesCount) { + int resource_id = kDefaultImageResources[image_index]; + user.SetImage( + *ResourceBundle::GetSharedInstance().GetBitmapNamed( + resource_id), + image_index); + } else if (image_index == User::kExternalImageIndex || + image_index == User::kProfileImageIndex) { + UserImages::const_iterator image_it = user_images_.find(email); + if (image_it == user_images_.end()) { + // Insert the default image so we don't send another request if + // GetUsers is called twice. + user_images_[email] = user.image(); + image_loader_->Start(email, image_path, image_index, false); + } else { + user.SetImage(image_it->second, image_index); + } } } } @@ -519,17 +557,19 @@ void UserManager::SetUserImage(const std::string& username, if (logged_in_user_.email() == username) logged_in_user_.SetImage(image, default_image_index); if (should_save_image) - SaveUserImage(username, image); + SaveUserImage(username, image, default_image_index); } void UserManager::LoadLoggedInUserImage(const FilePath& path) { if (logged_in_user_.email().empty()) return; - image_loader_->Start(logged_in_user_.email(), path.value(), true); + image_loader_->Start( + logged_in_user_.email(), path.value(), User::kExternalImageIndex, true); } void UserManager::SaveUserImage(const std::string& username, - const SkBitmap& image) { + const SkBitmap& image, + int image_index) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); FilePath image_path = GetImagePathForUser(username); DVLOG(1) << "Saving user image to " << image_path.value(); @@ -538,7 +578,7 @@ void UserManager::SaveUserImage(const std::string& username, BrowserThread::FILE, FROM_HERE, NewRunnableFunction(&SaveImageToFile, - image, image_path, username)); + image, image_path, username, image_index)); } void UserManager::SaveUserOAuthStatus(const std::string& username, @@ -554,8 +594,9 @@ UserManager::OAuthTokenStatus UserManager::GetUserOAuthStatus( } void UserManager::SaveUserImagePath(const std::string& username, - const std::string& image_path) { - SavePathToLocalState(username, image_path); + const std::string& image_path, + int image_index) { + SaveImageToLocalState(username, image_path, image_index); } void UserManager::SetDefaultUserImage(const std::string& username) { @@ -569,7 +610,7 @@ void UserManager::SetDefaultUserImage(const std::string& username) { SkBitmap user_image = *ResourceBundle::GetSharedInstance().GetBitmapNamed( resource_id); - SavePathToLocalState(username, user_image_path); + SaveImageToLocalState(username, user_image_path, image_id); SetLoggedInUserImage(user_image, image_id); } @@ -595,9 +636,10 @@ int UserManager::GetUserDefaultImageIndex(const std::string& username) { void UserManager::OnImageLoaded(const std::string& username, const SkBitmap& image, + int image_index, bool should_save_image) { DVLOG(1) << "Loaded image for " << username; - SetUserImage(username, image, User::kExternalImageIndex, should_save_image); + SetUserImage(username, image, image_index, should_save_image); } bool UserManager::IsLoggedInAsGuest() const { diff --git a/chrome/browser/chromeos/login/user_manager.h b/chrome/browser/chromeos/login/user_manager.h index 47f7ec5..2554f16 100644 --- a/chrome/browser/chromeos/login/user_manager.h +++ b/chrome/browser/chromeos/login/user_manager.h @@ -138,7 +138,8 @@ class UserManager : public UserImageLoader::Delegate, // and sends LOGIN_USER_IMAGE_CHANGED notification about the image // changed via NotificationService. void SaveUserImage(const std::string& username, - const SkBitmap& image); + const SkBitmap& image, + int image_index); // Saves user's oauth token status in local state preferences. void SaveUserOAuthStatus(const std::string& username, @@ -151,7 +152,8 @@ class UserManager : public UserImageLoader::Delegate, // Sends LOGIN_USER_IMAGE_CHANGED notification about the image changed // via NotificationService. void SaveUserImagePath(const std::string& username, - const std::string& image_path); + const std::string& image_path, + int image_index); // Returns the index of user's default image or |kInvalidImageIndex| // if some error occurs (like Local State corruption). @@ -160,6 +162,7 @@ class UserManager : public UserImageLoader::Delegate, // chromeos::UserImageLoader::Delegate implementation. virtual void OnImageLoaded(const std::string& username, const SkBitmap& image, + int image_index, bool save_image); // NotificationObserver implementation. |