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/profiles/profile_info_cache.h" | 5 #include "chrome/browser/profiles/profile_info_cache.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/files/file_util.h" | 8 #include "base/files/file_util.h" |
9 #include "base/i18n/case_conversion.h" | 9 #include "base/i18n/case_conversion.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 | 177 |
178 // For profiles that don't have the "using default avatar" state set yet, | 178 // For profiles that don't have the "using default avatar" state set yet, |
179 // assume it's the same as the "using default name" state. | 179 // assume it's the same as the "using default name" state. |
180 if (!info->HasKey(kIsUsingDefaultAvatarKey)) { | 180 if (!info->HasKey(kIsUsingDefaultAvatarKey)) { |
181 info->SetBoolean(kIsUsingDefaultAvatarKey, using_default_name); | 181 info->SetBoolean(kIsUsingDefaultAvatarKey, using_default_name); |
182 } | 182 } |
183 } | 183 } |
184 | 184 |
185 // If needed, start downloading the high-res avatars and migrate any legacy | 185 // If needed, start downloading the high-res avatars and migrate any legacy |
186 // profile names. | 186 // profile names. |
187 if (switches::IsNewAvatarMenu() && !disable_avatar_download_for_testing_) | 187 if (!disable_avatar_download_for_testing_) |
188 MigrateLegacyProfileNamesAndDownloadAvatars(); | 188 MigrateLegacyProfileNamesAndDownloadAvatars(); |
189 } | 189 } |
190 | 190 |
191 ProfileInfoCache::~ProfileInfoCache() { | 191 ProfileInfoCache::~ProfileInfoCache() { |
192 STLDeleteContainerPairSecondPointers( | 192 STLDeleteContainerPairSecondPointers( |
193 cached_avatar_images_.begin(), cached_avatar_images_.end()); | 193 cached_avatar_images_.begin(), cached_avatar_images_.end()); |
194 STLDeleteContainerPairSecondPointers( | 194 STLDeleteContainerPairSecondPointers( |
195 avatar_images_downloads_in_progress_.begin(), | 195 avatar_images_downloads_in_progress_.begin(), |
196 avatar_images_downloads_in_progress_.end()); | 196 avatar_images_downloads_in_progress_.end()); |
197 } | 197 } |
(...skipping 20 matching lines...) Expand all Loading... |
218 info->SetString(kSupervisedUserId, supervised_user_id); | 218 info->SetString(kSupervisedUserId, supervised_user_id); |
219 info->SetBoolean(kIsOmittedFromProfileListKey, !supervised_user_id.empty()); | 219 info->SetBoolean(kIsOmittedFromProfileListKey, !supervised_user_id.empty()); |
220 info->SetBoolean(kProfileIsEphemeral, false); | 220 info->SetBoolean(kProfileIsEphemeral, false); |
221 info->SetBoolean(kIsUsingDefaultNameKey, IsDefaultProfileName(name)); | 221 info->SetBoolean(kIsUsingDefaultNameKey, IsDefaultProfileName(name)); |
222 // Assume newly created profiles use a default avatar. | 222 // Assume newly created profiles use a default avatar. |
223 info->SetBoolean(kIsUsingDefaultAvatarKey, true); | 223 info->SetBoolean(kIsUsingDefaultAvatarKey, true); |
224 cache->SetWithoutPathExpansion(key, info.release()); | 224 cache->SetWithoutPathExpansion(key, info.release()); |
225 | 225 |
226 sorted_keys_.insert(FindPositionForProfile(key, name), key); | 226 sorted_keys_.insert(FindPositionForProfile(key, name), key); |
227 | 227 |
228 if (switches::IsNewAvatarMenu() && !disable_avatar_download_for_testing_) | 228 if (!disable_avatar_download_for_testing_) |
229 DownloadHighResAvatarIfNeeded(icon_index, profile_path); | 229 DownloadHighResAvatarIfNeeded(icon_index, profile_path); |
230 | 230 |
231 FOR_EACH_OBSERVER(ProfileInfoCacheObserver, | 231 FOR_EACH_OBSERVER(ProfileInfoCacheObserver, |
232 observer_list_, | 232 observer_list_, |
233 OnProfileAdded(profile_path)); | 233 OnProfileAdded(profile_path)); |
234 } | 234 } |
235 | 235 |
236 void ProfileInfoCache::AddObserver(ProfileInfoCacheObserver* obs) { | 236 void ProfileInfoCache::AddObserver(ProfileInfoCacheObserver* obs) { |
237 observer_list_.AddObserver(obs); | 237 observer_list_.AddObserver(obs); |
238 } | 238 } |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 } | 324 } |
325 | 325 |
326 const gfx::Image& ProfileInfoCache::GetAvatarIconOfProfileAtIndex( | 326 const gfx::Image& ProfileInfoCache::GetAvatarIconOfProfileAtIndex( |
327 size_t index) { | 327 size_t index) { |
328 if (IsUsingGAIAPictureOfProfileAtIndex(index)) { | 328 if (IsUsingGAIAPictureOfProfileAtIndex(index)) { |
329 const gfx::Image* image = GetGAIAPictureOfProfileAtIndex(index); | 329 const gfx::Image* image = GetGAIAPictureOfProfileAtIndex(index); |
330 if (image) | 330 if (image) |
331 return *image; | 331 return *image; |
332 } | 332 } |
333 | 333 |
334 // Use the high resolution version of the avatar if it exists. | 334 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS) |
335 if (switches::IsNewAvatarMenu()) { | 335 // Use the high resolution version of the avatar if it exists. Mobile and |
336 const gfx::Image* image = GetHighResAvatarOfProfileAtIndex(index); | 336 // ChromeOS don't need the high resolution version so no need to fetch it. |
337 if (image) | 337 const gfx::Image* image = GetHighResAvatarOfProfileAtIndex(index); |
338 return *image; | 338 if (image) |
339 } | 339 return *image; |
| 340 #endif |
340 | 341 |
341 int resource_id = profiles::GetDefaultAvatarIconResourceIDAtIndex( | 342 int resource_id = profiles::GetDefaultAvatarIconResourceIDAtIndex( |
342 GetAvatarIconIndexOfProfileAtIndex(index)); | 343 GetAvatarIconIndexOfProfileAtIndex(index)); |
343 return ResourceBundle::GetSharedInstance().GetNativeImageNamed(resource_id); | 344 return ResourceBundle::GetSharedInstance().GetNativeImageNamed(resource_id); |
344 } | 345 } |
345 | 346 |
346 std::string ProfileInfoCache::GetLocalAuthCredentialsOfProfileAtIndex( | 347 std::string ProfileInfoCache::GetLocalAuthCredentialsOfProfileAtIndex( |
347 size_t index) const { | 348 size_t index) const { |
348 std::string credentials; | 349 std::string credentials; |
349 GetInfoForProfileAtIndex(index)->GetString(kAuthCredentialsKey, &credentials); | 350 GetInfoForProfileAtIndex(index)->GetString(kAuthCredentialsKey, &credentials); |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 size_t icon_index) { | 579 size_t icon_index) { |
579 scoped_ptr<base::DictionaryValue> info( | 580 scoped_ptr<base::DictionaryValue> info( |
580 GetInfoForProfileAtIndex(index)->DeepCopy()); | 581 GetInfoForProfileAtIndex(index)->DeepCopy()); |
581 info->SetString(kAvatarIconKey, | 582 info->SetString(kAvatarIconKey, |
582 profiles::GetDefaultAvatarIconUrl(icon_index)); | 583 profiles::GetDefaultAvatarIconUrl(icon_index)); |
583 // This takes ownership of |info|. | 584 // This takes ownership of |info|. |
584 SetInfoForProfileAtIndex(index, info.release()); | 585 SetInfoForProfileAtIndex(index, info.release()); |
585 | 586 |
586 base::FilePath profile_path = GetPathOfProfileAtIndex(index); | 587 base::FilePath profile_path = GetPathOfProfileAtIndex(index); |
587 | 588 |
588 if (switches::IsNewAvatarMenu() && !disable_avatar_download_for_testing_) | 589 if (!disable_avatar_download_for_testing_) |
589 DownloadHighResAvatarIfNeeded(icon_index, profile_path); | 590 DownloadHighResAvatarIfNeeded(icon_index, profile_path); |
590 | 591 |
591 FOR_EACH_OBSERVER(ProfileInfoCacheObserver, | 592 FOR_EACH_OBSERVER(ProfileInfoCacheObserver, |
592 observer_list_, | 593 observer_list_, |
593 OnProfileAvatarChanged(profile_path)); | 594 OnProfileAvatarChanged(profile_path)); |
594 } | 595 } |
595 | 596 |
596 void ProfileInfoCache::SetIsOmittedProfileAtIndex(size_t index, | 597 void ProfileInfoCache::SetIsOmittedProfileAtIndex(size_t index, |
597 bool is_omitted) { | 598 bool is_omitted) { |
598 if (IsOmittedProfileAtIndex(index) == is_omitted) | 599 if (IsOmittedProfileAtIndex(index) == is_omitted) |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
857 default_name_format.c_str(), | 858 default_name_format.c_str(), |
858 &generic_profile_number); | 859 &generic_profile_number); |
859 // Unless it matched the format, this is a custom name. | 860 // Unless it matched the format, this is a custom name. |
860 return assignments == 1; | 861 return assignments == 1; |
861 } | 862 } |
862 | 863 |
863 base::string16 ProfileInfoCache::ChooseNameForNewProfile( | 864 base::string16 ProfileInfoCache::ChooseNameForNewProfile( |
864 size_t icon_index) const { | 865 size_t icon_index) const { |
865 base::string16 name; | 866 base::string16 name; |
866 for (int name_index = 1; ; ++name_index) { | 867 for (int name_index = 1; ; ++name_index) { |
867 if (switches::IsNewAvatarMenu()) { | 868 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS) |
868 name = l10n_util::GetStringFUTF16Int(IDS_NEW_NUMBERED_PROFILE_NAME, | 869 name = l10n_util::GetStringFUTF16Int(IDS_NEW_NUMBERED_PROFILE_NAME, |
869 name_index); | 870 name_index); |
870 } else if (icon_index < profiles::GetGenericAvatarIconCount()) { | 871 #else |
| 872 if (icon_index < profiles::GetGenericAvatarIconCount()) { |
871 name = l10n_util::GetStringFUTF16Int(IDS_NUMBERED_PROFILE_NAME, | 873 name = l10n_util::GetStringFUTF16Int(IDS_NUMBERED_PROFILE_NAME, |
872 name_index); | 874 name_index); |
873 } else { | 875 } else { |
874 name = l10n_util::GetStringUTF16( | 876 name = l10n_util::GetStringUTF16( |
875 kDefaultNames[icon_index - profiles::GetGenericAvatarIconCount()]); | 877 kDefaultNames[icon_index - profiles::GetGenericAvatarIconCount()]); |
876 if (name_index > 1) | 878 if (name_index > 1) |
877 name.append(base::UTF8ToUTF16(base::IntToString(name_index))); | 879 name.append(base::UTF8ToUTF16(base::IntToString(name_index))); |
878 } | 880 } |
| 881 #endif |
879 | 882 |
880 // Loop through previously named profiles to ensure we're not duplicating. | 883 // Loop through previously named profiles to ensure we're not duplicating. |
881 bool name_found = false; | 884 bool name_found = false; |
882 for (size_t i = 0; i < GetNumberOfProfiles(); ++i) { | 885 for (size_t i = 0; i < GetNumberOfProfiles(); ++i) { |
883 if (GetNameOfProfileAtIndex(i) == name) { | 886 if (GetNameOfProfileAtIndex(i) == name) { |
884 name_found = true; | 887 name_found = true; |
885 break; | 888 break; |
886 } | 889 } |
887 } | 890 } |
888 if (!name_found) | 891 if (!name_found) |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1020 if (GetAvatarIconIndexOfProfileAtIndex(i) == icon_index) | 1023 if (GetAvatarIconIndexOfProfileAtIndex(i) == icon_index) |
1021 return false; | 1024 return false; |
1022 } | 1025 } |
1023 return true; | 1026 return true; |
1024 } | 1027 } |
1025 | 1028 |
1026 bool ProfileInfoCache::ChooseAvatarIconIndexForNewProfile( | 1029 bool ProfileInfoCache::ChooseAvatarIconIndexForNewProfile( |
1027 bool allow_generic_icon, | 1030 bool allow_generic_icon, |
1028 bool must_be_unique, | 1031 bool must_be_unique, |
1029 size_t* out_icon_index) const { | 1032 size_t* out_icon_index) const { |
1030 // Always allow all icons for new profiles if using the | 1033 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS) |
1031 // --new-avatar-menu flag. | 1034 // Always allow the generic icon when displaying the new avatar menu. |
1032 if (switches::IsNewAvatarMenu()) | 1035 allow_generic_icon = true; |
1033 allow_generic_icon = true; | 1036 #endif |
1034 size_t start = allow_generic_icon ? 0 : profiles::GetGenericAvatarIconCount(); | 1037 size_t start = allow_generic_icon ? 0 : profiles::GetGenericAvatarIconCount(); |
1035 size_t end = profiles::GetDefaultAvatarIconCount(); | 1038 size_t end = profiles::GetDefaultAvatarIconCount(); |
1036 size_t count = end - start; | 1039 size_t count = end - start; |
1037 | 1040 |
1038 int rand = base::RandInt(0, count); | 1041 int rand = base::RandInt(0, count); |
1039 for (size_t i = 0; i < count; ++i) { | 1042 for (size_t i = 0; i < count; ++i) { |
1040 size_t icon_index = start + (rand + i) % count; | 1043 size_t icon_index = start + (rand + i) % count; |
1041 if (!must_be_unique || IconIndexIsUnique(icon_index)) { | 1044 if (!must_be_unique || IconIndexIsUnique(icon_index)) { |
1042 *out_icon_index = icon_index; | 1045 *out_icon_index = icon_index; |
1043 return true; | 1046 return true; |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1193 const std::string& file_name, | 1196 const std::string& file_name, |
1194 const base::FilePath& profile_path) { | 1197 const base::FilePath& profile_path) { |
1195 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1198 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1196 | 1199 |
1197 FOR_EACH_OBSERVER(ProfileInfoCacheObserver, | 1200 FOR_EACH_OBSERVER(ProfileInfoCacheObserver, |
1198 observer_list_, | 1201 observer_list_, |
1199 OnProfileHighResAvatarLoaded(profile_path)); | 1202 OnProfileHighResAvatarLoaded(profile_path)); |
1200 } | 1203 } |
1201 | 1204 |
1202 void ProfileInfoCache::MigrateLegacyProfileNamesAndDownloadAvatars() { | 1205 void ProfileInfoCache::MigrateLegacyProfileNamesAndDownloadAvatars() { |
1203 DCHECK(switches::IsNewAvatarMenu()); | |
1204 | |
1205 // Only do this on desktop platforms. | 1206 // Only do this on desktop platforms. |
1206 #if !defined(OS_ANDROID) && !defined(OS_IOS) && !defined(OS_CHROMEOS) | 1207 #if !defined(OS_ANDROID) && !defined(OS_IOS) && !defined(OS_CHROMEOS) |
1207 // Migrate any legacy profile names ("First user", "Default Profile") to | 1208 // Migrate any legacy profile names ("First user", "Default Profile") to |
1208 // new style default names ("Person 1"). The problem here is that every | 1209 // new style default names ("Person 1"). The problem here is that every |
1209 // time you rename a profile, the ProfileInfoCache sorts itself, so | 1210 // time you rename a profile, the ProfileInfoCache sorts itself, so |
1210 // whatever you were iterating through is no longer valid. We need to | 1211 // whatever you were iterating through is no longer valid. We need to |
1211 // save a list of the profile paths (which thankfully do not change) that | 1212 // save a list of the profile paths (which thankfully do not change) that |
1212 // need to be renamed. We also can't pre-compute the new names, as they | 1213 // need to be renamed. We also can't pre-compute the new names, as they |
1213 // depend on the names of all the other profiles in the info cache, so they | 1214 // depend on the names of all the other profiles in the info cache, so they |
1214 // need to be re-computed after each rename. | 1215 // need to be re-computed after each rename. |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1280 // The profile info is in the cache but its entry isn't created yet, insert | 1281 // The profile info is in the cache but its entry isn't created yet, insert |
1281 // it in the map. | 1282 // it in the map. |
1282 scoped_ptr<ProfileAttributesEntry> new_entry(new ProfileAttributesEntry()); | 1283 scoped_ptr<ProfileAttributesEntry> new_entry(new ProfileAttributesEntry()); |
1283 profile_attributes_entries_.add(path, new_entry.Pass()); | 1284 profile_attributes_entries_.add(path, new_entry.Pass()); |
1284 profile_attributes_entries_.get(path)->Initialize(this, path); | 1285 profile_attributes_entries_.get(path)->Initialize(this, path); |
1285 } | 1286 } |
1286 | 1287 |
1287 *entry = profile_attributes_entries_.get(path); | 1288 *entry = profile_attributes_entries_.get(path); |
1288 return true; | 1289 return true; |
1289 } | 1290 } |
OLD | NEW |