Chromium Code Reviews| 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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 53 const char kPasswordTokenKey[] = "gaia_password_token"; | 53 const char kPasswordTokenKey[] = "gaia_password_token"; |
| 54 const char kUseGAIAPictureKey[] = "use_gaia_picture"; | 54 const char kUseGAIAPictureKey[] = "use_gaia_picture"; |
| 55 const char kBackgroundAppsKey[] = "background_apps"; | 55 const char kBackgroundAppsKey[] = "background_apps"; |
| 56 const char kGAIAPictureFileNameKey[] = "gaia_picture_file_name"; | 56 const char kGAIAPictureFileNameKey[] = "gaia_picture_file_name"; |
| 57 const char kIsOmittedFromProfileListKey[] = "is_omitted_from_profile_list"; | 57 const char kIsOmittedFromProfileListKey[] = "is_omitted_from_profile_list"; |
| 58 const char kSigninRequiredKey[] = "signin_required"; | 58 const char kSigninRequiredKey[] = "signin_required"; |
| 59 const char kSupervisedUserId[] = "managed_user_id"; | 59 const char kSupervisedUserId[] = "managed_user_id"; |
| 60 const char kProfileIsEphemeral[] = "is_ephemeral"; | 60 const char kProfileIsEphemeral[] = "is_ephemeral"; |
| 61 const char kActiveTimeKey[] = "active_time"; | 61 const char kActiveTimeKey[] = "active_time"; |
| 62 const char kIsAuthErrorKey[] = "is_auth_error"; | 62 const char kIsAuthErrorKey[] = "is_auth_error"; |
| 63 const char kStatistics[] = "statistics"; | |
|
anthonyvd
2015/10/23 15:53:13
nit: kStatisticsKey
lwchkg
2015/10/24 02:02:32
Acknowledged.
| |
| 63 | 64 |
| 64 // First eight are generic icons, which use IDS_NUMBERED_PROFILE_NAME. | 65 // First eight are generic icons, which use IDS_NUMBERED_PROFILE_NAME. |
| 65 const int kDefaultNames[] = { | 66 const int kDefaultNames[] = { |
| 66 IDS_DEFAULT_AVATAR_NAME_8, | 67 IDS_DEFAULT_AVATAR_NAME_8, |
| 67 IDS_DEFAULT_AVATAR_NAME_9, | 68 IDS_DEFAULT_AVATAR_NAME_9, |
| 68 IDS_DEFAULT_AVATAR_NAME_10, | 69 IDS_DEFAULT_AVATAR_NAME_10, |
| 69 IDS_DEFAULT_AVATAR_NAME_11, | 70 IDS_DEFAULT_AVATAR_NAME_11, |
| 70 IDS_DEFAULT_AVATAR_NAME_12, | 71 IDS_DEFAULT_AVATAR_NAME_12, |
| 71 IDS_DEFAULT_AVATAR_NAME_13, | 72 IDS_DEFAULT_AVATAR_NAME_13, |
| 72 IDS_DEFAULT_AVATAR_NAME_14, | 73 IDS_DEFAULT_AVATAR_NAME_14, |
| (...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 492 const { | 493 const { |
| 493 std::string icon_url; | 494 std::string icon_url; |
| 494 GetInfoForProfileAtIndex(index)->GetString(kAvatarIconKey, &icon_url); | 495 GetInfoForProfileAtIndex(index)->GetString(kAvatarIconKey, &icon_url); |
| 495 size_t icon_index = 0; | 496 size_t icon_index = 0; |
| 496 if (!profiles::IsDefaultAvatarIconUrl(icon_url, &icon_index)) | 497 if (!profiles::IsDefaultAvatarIconUrl(icon_url, &icon_index)) |
| 497 DLOG(WARNING) << "Unknown avatar icon: " << icon_url; | 498 DLOG(WARNING) << "Unknown avatar icon: " << icon_url; |
| 498 | 499 |
| 499 return icon_index; | 500 return icon_index; |
| 500 } | 501 } |
| 501 | 502 |
| 503 | |
| 504 bool ProfileInfoCache::GetStatisticOfProfileAtIndex(size_t index, | |
| 505 const std::string& category, int* out_value) const { | |
| 506 const base::DictionaryValue* statistics; | |
| 507 if (!GetInfoForProfileAtIndex(index)->GetDictionaryWithoutPathExpansion( | |
| 508 kStatistics, &statistics)) | |
| 509 return false; | |
| 510 | |
| 511 return statistics->GetIntegerWithoutPathExpansion(category, out_value); | |
| 512 } | |
| 513 | |
| 514 std::map<std::string, int> ProfileInfoCache::GetAllStatisticOfProfileAtIndex( | |
| 515 size_t index) const { | |
| 516 const base::DictionaryValue* statistics; | |
| 517 std::map<std::string, int> out_value; | |
| 518 | |
| 519 if (!GetInfoForProfileAtIndex(index)->GetDictionaryWithoutPathExpansion( | |
| 520 kStatistics, &statistics)) | |
| 521 return out_value; // No statistics are set, so return an empty map. | |
| 522 | |
| 523 for (base::DictionaryValue::Iterator it(*statistics); !it.IsAtEnd(); | |
| 524 it.Advance()) { | |
| 525 int value; | |
| 526 if (it.value().GetAsInteger(&value)) { | |
| 527 out_value.insert(std::make_pair(it.key(), value)); | |
| 528 } | |
| 529 } | |
| 530 return out_value; | |
| 531 } | |
| 532 | |
| 533 scoped_ptr<base::DictionaryValue> | |
| 534 ProfileInfoCache::GetAllStatisticsOfProfileAtIndexAsDictionaryValue( | |
| 535 size_t index) const { | |
| 536 const base::DictionaryValue* statistics; | |
| 537 | |
| 538 if (!GetInfoForProfileAtIndex(index)->GetDictionaryWithoutPathExpansion( | |
| 539 kStatistics, &statistics)) | |
| 540 // No statistics are set, so return an empty map. | |
| 541 return make_scoped_ptr(new base::DictionaryValue()).Pass(); | |
| 542 | |
| 543 return statistics->CreateDeepCopy().Pass(); | |
| 544 } | |
| 545 | |
| 502 void ProfileInfoCache::SetProfileActiveTimeAtIndex(size_t index) { | 546 void ProfileInfoCache::SetProfileActiveTimeAtIndex(size_t index) { |
| 503 if (base::Time::Now() - GetProfileActiveTimeAtIndex(index) < | 547 if (base::Time::Now() - GetProfileActiveTimeAtIndex(index) < |
| 504 base::TimeDelta::FromHours(1)) { | 548 base::TimeDelta::FromHours(1)) { |
| 505 return; | 549 return; |
| 506 } | 550 } |
| 507 | 551 |
| 508 scoped_ptr<base::DictionaryValue> info( | 552 scoped_ptr<base::DictionaryValue> info( |
| 509 GetInfoForProfileAtIndex(index)->DeepCopy()); | 553 GetInfoForProfileAtIndex(index)->DeepCopy()); |
| 510 info->SetDouble(kActiveTimeKey, base::Time::Now().ToDoubleT()); | 554 info->SetDouble(kActiveTimeKey, base::Time::Now().ToDoubleT()); |
| 511 // This takes ownership of |info|. | 555 // This takes ownership of |info|. |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 902 if (ChooseAvatarIconIndexForNewProfile(true, true, &icon_index)) | 946 if (ChooseAvatarIconIndexForNewProfile(true, true, &icon_index)) |
| 903 return icon_index; | 947 return icon_index; |
| 904 // Settle for any random icon, even if it's not unique. | 948 // Settle for any random icon, even if it's not unique. |
| 905 if (ChooseAvatarIconIndexForNewProfile(true, false, &icon_index)) | 949 if (ChooseAvatarIconIndexForNewProfile(true, false, &icon_index)) |
| 906 return icon_index; | 950 return icon_index; |
| 907 | 951 |
| 908 NOTREACHED(); | 952 NOTREACHED(); |
| 909 return 0; | 953 return 0; |
| 910 } | 954 } |
| 911 | 955 |
| 956 void ProfileInfoCache::SetStatisticOfProfileAtIndex(size_t index, | |
| 957 const std::string& category, int value) { | |
| 958 scoped_ptr<base::DictionaryValue> info( | |
| 959 GetInfoForProfileAtIndex(index)->DeepCopy()); | |
| 960 | |
| 961 base::DictionaryValue* statistics; | |
| 962 if (info->GetDictionaryWithoutPathExpansion(kStatistics, &statistics)) { | |
| 963 statistics = new base::DictionaryValue(); | |
| 964 info->SetWithoutPathExpansion(kStatistics, make_scoped_ptr(statistics)); | |
| 965 } | |
| 966 | |
| 967 statistics->SetIntegerWithoutPathExpansion(category, value); | |
| 968 // This takes ownership of |info|. | |
| 969 SetInfoForProfileAtIndex(index, info.release()); | |
| 970 | |
| 971 base::FilePath profile_path = GetPathOfProfileAtIndex(index); | |
| 972 FOR_EACH_OBSERVER(ProfileInfoCacheObserver, | |
| 973 observer_list_, | |
| 974 OnProfileSigninRequiredChanged(profile_path)); | |
| 975 } | |
| 976 | |
| 912 const base::FilePath& ProfileInfoCache::GetUserDataDir() const { | 977 const base::FilePath& ProfileInfoCache::GetUserDataDir() const { |
| 913 return user_data_dir_; | 978 return user_data_dir_; |
| 914 } | 979 } |
| 915 | 980 |
| 916 // static | 981 // static |
| 917 void ProfileInfoCache::RegisterPrefs(PrefRegistrySimple* registry) { | 982 void ProfileInfoCache::RegisterPrefs(PrefRegistrySimple* registry) { |
| 918 registry->RegisterDictionaryPref(prefs::kProfileInfoCache); | 983 registry->RegisterDictionaryPref(prefs::kProfileInfoCache); |
| 919 } | 984 } |
| 920 | 985 |
| 921 void ProfileInfoCache::DownloadHighResAvatarIfNeeded( | 986 void ProfileInfoCache::DownloadHighResAvatarIfNeeded( |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1281 // The profile info is in the cache but its entry isn't created yet, insert | 1346 // The profile info is in the cache but its entry isn't created yet, insert |
| 1282 // it in the map. | 1347 // it in the map. |
| 1283 scoped_ptr<ProfileAttributesEntry> new_entry(new ProfileAttributesEntry()); | 1348 scoped_ptr<ProfileAttributesEntry> new_entry(new ProfileAttributesEntry()); |
| 1284 profile_attributes_entries_.add(path, new_entry.Pass()); | 1349 profile_attributes_entries_.add(path, new_entry.Pass()); |
| 1285 profile_attributes_entries_.get(path)->Initialize(this, path); | 1350 profile_attributes_entries_.get(path)->Initialize(this, path); |
| 1286 } | 1351 } |
| 1287 | 1352 |
| 1288 *entry = profile_attributes_entries_.get(path); | 1353 *entry = profile_attributes_entries_.get(path); |
| 1289 return true; | 1354 return true; |
| 1290 } | 1355 } |
| OLD | NEW |