summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos
diff options
context:
space:
mode:
authoravayvod@chromium.org <avayvod@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-29 18:26:05 +0000
committeravayvod@chromium.org <avayvod@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-29 18:26:05 +0000
commitf202429bdd316c214b193e1807d9c1161b9fd575 (patch)
tree9a79c493691419bed4190d60acc2e6e7d82b202e /chrome/browser/chromeos
parent78d78a682025d5c60a6a4db42cff6d1c17436fa0 (diff)
downloadchromium_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.cc5
-rw-r--r--chrome/browser/chromeos/login/default_user_images.h3
-rw-r--r--chrome/browser/chromeos/login/user_image_loader.cc4
-rw-r--r--chrome/browser/chromeos/login/user_image_loader.h6
-rw-r--r--chrome/browser/chromeos/login/user_image_screen.cc21
-rw-r--r--chrome/browser/chromeos/login/user_image_screen.h3
-rw-r--r--chrome/browser/chromeos/login/user_manager.cc116
-rw-r--r--chrome/browser/chromeos/login/user_manager.h7
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.