Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3971)

Unified Diff: chrome/browser/profiles/profile_info_cache.cc

Issue 210043005: [Profiles] Use high resolution avatars if they exist (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/profiles/profile_info_cache.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/profiles/profile_info_cache.cc
diff --git a/chrome/browser/profiles/profile_info_cache.cc b/chrome/browser/profiles/profile_info_cache.cc
index 8055c9638c2b26452770a21239d0e41165f63bcb..b17dfe5c0ba8a4f076c64bea6be4d41873027a5f 100644
--- a/chrome/browser/profiles/profile_info_cache.cc
+++ b/chrome/browser/profiles/profile_info_cache.cc
@@ -10,6 +10,7 @@
#include "base/i18n/case_conversion.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
+#include "base/path_service.h"
#include "base/prefs/pref_registry_simple.h"
#include "base/prefs/pref_service.h"
#include "base/prefs/scoped_user_pref_update.h"
@@ -22,6 +23,7 @@
#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/common/chrome_paths.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/profile_management_switches.h"
#include "content/public/browser/browser_thread.h"
@@ -60,6 +62,7 @@ const char kActiveTimeKey[] = "active_time";
const char kDefaultUrlPrefix[] = "chrome://theme/IDR_PROFILE_AVATAR_";
const char kGAIAPictureFileName[] = "Google Profile Picture.png";
+const char kHighResAvatarFolderName[] = "Avatars";
const int kDefaultAvatarIconResources[] = {
IDR_PROFILE_AVATAR_0,
@@ -90,6 +93,37 @@ const int kDefaultAvatarIconResources[] = {
IDR_PROFILE_AVATAR_25,
};
+// File names for the high-res avatar icon resources. In the same order as
+// the avatars in kDefaultAvatarIconResources.
+const char* kDefaultAvatarIconResourceFileNames[] = {
+ "chrome_avatar_generic.png",
+ "chrome_avatar_generic_aqua.png",
+ "chrome_avatar_generic_blue.png",
+ "chrome_avatar_generic_green.png",
+ "chrome_avatar_generic_orange.png",
+ "chrome_avatar_generic_purple.png",
+ "chrome_avatar_generic_red.png",
+ "chrome_avatar_generic_yellow.png",
+ "chrome_avatar_secret_agent.png",
+ "chrome_avatar_superhero.png",
+ "chrome_avatar_volley_ball.png",
+ "chrome_avatar_businessman.png",
+ "chrome_avatar_ninja.png",
+ "chrome_avatar_alien.png",
+ "chrome_avatar_smiley.png",
+ "chrome_avatar_flower.png",
+ "chrome_avatar_pizza.png",
+ "chrome_avatar_soccer.png",
+ "chrome_avatar_burger.png",
+ "chrome_avatar_cat.png",
+ "chrome_avatar_cupcake.png",
+ "chrome_avatar_dog.png",
+ "chrome_avatar_horse.png",
+ "chrome_avatar_margarita.png",
+ "chrome_avatar_note.png",
+ "chrome_avatar_sun_cloud.png",
Roger Tawa OOO till Jul 10th 2014/03/25 14:39:49 Do we really need chrome_ prefix ?
noms (inactive) 2014/03/25 19:24:22 Nope! On 2014/03/25 14:39:49, Roger Tawa wrote:
+};
+
const size_t kDefaultAvatarIconsCount = arraysize(kDefaultAvatarIconResources);
// The first 8 icons are generic.
@@ -152,6 +186,10 @@ void ReadBitmap(const base::FilePath& image_path,
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
*out_image = NULL;
+ // If the path doesn't exist, don't even try reading it.
+ if (!base::PathExists(image_path))
+ return;
+
std::string image_data;
if (!base::ReadFileToString(image_path, &image_data)) {
LOG(ERROR) << "Failed to read PNG file from disk.";
@@ -225,7 +263,7 @@ ProfileInfoCache::ProfileInfoCache(PrefService* prefs,
ProfileInfoCache::~ProfileInfoCache() {
STLDeleteContainerPairSecondPointers(
- gaia_pictures_.begin(), gaia_pictures_.end());
+ cached_avatar_images_.begin(), cached_avatar_images_.end());
}
void ProfileInfoCache::AddProfileToCache(const base::FilePath& profile_path,
@@ -364,6 +402,13 @@ const gfx::Image& ProfileInfoCache::GetAvatarIconOfProfileAtIndex(
return *image;
}
+ // Use the high resolution version of the avatar if it exists.
+ if (switches::IsNewProfileManagement()) {
+ const gfx::Image* image = GetHighResAvatarOfProfileAtIndex(index);
+ if (image)
+ return *image;
+ }
+
int resource_id = GetDefaultAvatarIconResourceIDAtIndex(
GetAvatarIconIndexOfProfileAtIndex(index));
return ResourceBundle::GetSharedInstance().GetNativeImageNamed(resource_id);
@@ -412,30 +457,58 @@ const gfx::Image* ProfileInfoCache::GetGAIAPictureOfProfileAtIndex(
std::string key = CacheKeyFromProfilePath(path);
// If the picture is already loaded then use it.
- if (gaia_pictures_.count(key)) {
- if (gaia_pictures_[key]->IsEmpty())
+ if (cached_avatar_images_.count(key)) {
+ if (cached_avatar_images_[key]->IsEmpty())
return NULL;
- return gaia_pictures_[key];
+ return cached_avatar_images_[key];
}
std::string file_name;
GetInfoForProfileAtIndex(index)->GetString(
kGAIAPictureFileNameKey, &file_name);
- // If the picture is not on disk or it is already being loaded then return
- // NULL.
- if (file_name.empty() || gaia_pictures_loading_[key])
+ // If the picture is not on disk then return NULL.
+ if (file_name.empty())
return NULL;
- gaia_pictures_loading_[key] = true;
base::FilePath image_path = path.AppendASCII(file_name);
+ LoadAvatarPictureFromPath(key, image_path);
+ return NULL;
+}
+
+const gfx::Image* ProfileInfoCache::GetHighResAvatarOfProfileAtIndex(
+ size_t index) const {
+ int avatar_index = GetAvatarIconIndexOfProfileAtIndex(index);
+ std::string key = kDefaultAvatarIconResourceFileNames[avatar_index];
+
+ // If the picture is already loaded then use it.
+ if (cached_avatar_images_.count(key)) {
+ if (cached_avatar_images_[key]->IsEmpty())
+ return NULL;
+ return cached_avatar_images_[key];
+ }
+
+ base::FilePath user_data_dir;
+ PathService::Get(chrome::DIR_USER_DATA, &user_data_dir);
+ base::FilePath image_path =
+ user_data_dir.AppendASCII(kHighResAvatarFolderName).AppendASCII(key);
+ LoadAvatarPictureFromPath(key, image_path);
+ return NULL;
+}
Roger Tawa OOO till Jul 10th 2014/03/25 14:39:49 GetGAIAPictureOfProfileAtIndex() and GetHighResAva
noms (inactive) 2014/03/25 19:24:22 Unfortunately GetGAIAPictureOfProfileAtIndex() is
+
+void ProfileInfoCache::LoadAvatarPictureFromPath(
+ const std::string& key,
+ const base::FilePath& image_path) const {
+ // If the picture is already being loaded then don't try loading it again.
+ if (cached_avatar_images_loading_[key])
+ return;
+ cached_avatar_images_loading_[key] = true;
+
gfx::Image** image = new gfx::Image*;
BrowserThread::PostTaskAndReply(BrowserThread::FILE, FROM_HERE,
base::Bind(&ReadBitmap, image_path, image),
- base::Bind(&ProfileInfoCache::OnGAIAPictureLoaded,
- const_cast<ProfileInfoCache*>(this)->AsWeakPtr(), path, image));
-
- return NULL;
+ base::Bind(&ProfileInfoCache::OnAvatarPictureLoaded,
+ const_cast<ProfileInfoCache*>(this)->AsWeakPtr(), key, image));
}
bool ProfileInfoCache::ProfileIsManagedAtIndex(size_t index) const {
@@ -474,19 +547,18 @@ bool ProfileInfoCache::ProfileIsUsingDefaultNameAtIndex(size_t index) const {
return value;
}
-void ProfileInfoCache::OnGAIAPictureLoaded(const base::FilePath& path,
- gfx::Image** image) const {
+void ProfileInfoCache::OnAvatarPictureLoaded(const std::string& key,
+ gfx::Image** image) const {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- std::string key = CacheKeyFromProfilePath(path);
- gaia_pictures_loading_[key] = false;
+ cached_avatar_images_loading_[key] = false;
if (*image) {
- delete gaia_pictures_[key];
- gaia_pictures_[key] = *image;
+ delete cached_avatar_images_[key];
+ cached_avatar_images_[key] = *image;
} else {
// Place an empty image in the cache to avoid reloading it again.
- gaia_pictures_[key] = new gfx::Image();
+ cached_avatar_images_[key] = new gfx::Image();
Roger Tawa OOO till Jul 10th 2014/03/25 14:39:49 I still think there is a potential memory leak her
noms (inactive) 2014/03/25 19:24:22 I've just deleted |cached_avatar_images_[key]| in
}
delete image;
@@ -705,10 +777,11 @@ void ProfileInfoCache::SetGAIAPictureOfProfileAtIndex(size_t index,
std::string key = CacheKeyFromProfilePath(path);
// Delete the old bitmap from cache.
- std::map<std::string, gfx::Image*>::iterator it = gaia_pictures_.find(key);
- if (it != gaia_pictures_.end()) {
+ std::map<std::string, gfx::Image*>::iterator it =
+ cached_avatar_images_.find(key);
+ if (it != cached_avatar_images_.end()) {
delete it->second;
- gaia_pictures_.erase(it);
+ cached_avatar_images_.erase(it);
}
std::string old_file_name;
@@ -725,7 +798,7 @@ void ProfileInfoCache::SetGAIAPictureOfProfileAtIndex(size_t index,
}
} else {
// Save the new bitmap to disk.
- gaia_pictures_[key] = new gfx::Image(*image);
+ cached_avatar_images_[key] = new gfx::Image(*image);
scoped_ptr<ImageData> data(new ImageData);
scoped_refptr<base::RefCountedMemory> png_data = image->As1xPNGBytes();
data->assign(png_data->front(), png_data->front() + png_data->size());
« no previous file with comments | « chrome/browser/profiles/profile_info_cache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698