| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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_attributes_storage.h" | 5 #include "chrome/browser/profiles/profile_attributes_storage.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/i18n/number_formatting.h" |
| 9 #include "base/i18n/string_compare.h" | 10 #include "base/i18n/string_compare.h" |
| 10 #include "base/rand_util.h" | 11 #include "base/rand_util.h" |
| 11 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 13 #include "chrome/browser/profiles/profile_avatar_icon_util.h" | 14 #include "chrome/browser/profiles/profile_avatar_icon_util.h" |
| 14 #include "chrome/grit/generated_resources.h" | 15 #include "chrome/grit/generated_resources.h" |
| 15 #include "third_party/icu/source/i18n/unicode/coll.h" | 16 #include "third_party/icu/source/i18n/unicode/coll.h" |
| 16 #include "ui/base/l10n/l10n_util.h" | 17 #include "ui/base/l10n/l10n_util.h" |
| 17 | 18 |
| 18 namespace { | 19 namespace { |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 std::sort(ret.begin(), ret.end(), | 114 std::sort(ret.begin(), ret.end(), |
| 114 ProfileAttributesSortComparator(collator.get())); | 115 ProfileAttributesSortComparator(collator.get())); |
| 115 return ret; | 116 return ret; |
| 116 } | 117 } |
| 117 | 118 |
| 118 base::string16 ProfileAttributesStorage::ChooseNameForNewProfile( | 119 base::string16 ProfileAttributesStorage::ChooseNameForNewProfile( |
| 119 size_t icon_index) const { | 120 size_t icon_index) const { |
| 120 base::string16 name; | 121 base::string16 name; |
| 121 for (int name_index = 1; ; ++name_index) { | 122 for (int name_index = 1; ; ++name_index) { |
| 122 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) | 123 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) |
| 123 name = l10n_util::GetStringFUTF16Int(IDS_NEW_NUMBERED_PROFILE_NAME, | 124 // Using native digits will break IsDefaultProfileName() below because |
| 124 name_index); | 125 // it uses sscanf. |
| 126 // TODO(jshin): fix IsDefaultProfileName to handle native digits. |
| 127 name = l10n_util::GetStringFUTF16(IDS_NEW_NUMBERED_PROFILE_NAME, |
| 128 base::IntToString16(name_index)); |
| 125 #else | 129 #else |
| 126 if (icon_index < profiles::GetGenericAvatarIconCount()) { | 130 if (icon_index < profiles::GetGenericAvatarIconCount()) { |
| 127 name = l10n_util::GetStringFUTF16Int(IDS_NUMBERED_PROFILE_NAME, | 131 name = l10n_util::GetStringFUTF16Int(IDS_NUMBERED_PROFILE_NAME, |
| 128 name_index); | 132 name_index); |
| 129 } else { | 133 } else { |
| 134 // TODO(jshin): Check with UX if appending |name_index| to the default |
| 135 // name without a space is intended. |
| 130 name = l10n_util::GetStringUTF16( | 136 name = l10n_util::GetStringUTF16( |
| 131 kDefaultNames[icon_index - profiles::GetGenericAvatarIconCount()]); | 137 kDefaultNames[icon_index - profiles::GetGenericAvatarIconCount()]); |
| 132 if (name_index > 1) | 138 if (name_index > 1) |
| 133 name.append(base::UTF8ToUTF16(base::IntToString(name_index))); | 139 name.append(base::FormatNumber(name_index)); |
| 134 } | 140 } |
| 135 #endif | 141 #endif |
| 136 | 142 |
| 137 // Loop through previously named profiles to ensure we're not duplicating. | 143 // Loop through previously named profiles to ensure we're not duplicating. |
| 138 std::vector<ProfileAttributesEntry*> entries = | 144 std::vector<ProfileAttributesEntry*> entries = |
| 139 const_cast<ProfileAttributesStorage*>(this)->GetAllProfilesAttributes(); | 145 const_cast<ProfileAttributesStorage*>(this)->GetAllProfilesAttributes(); |
| 140 | 146 |
| 141 if (std::none_of(entries.begin(), entries.end(), | 147 if (std::none_of(entries.begin(), entries.end(), |
| 142 [name](ProfileAttributesEntry* entry) { | 148 [name](ProfileAttributesEntry* entry) { |
| 143 return entry->GetName() == name; | 149 return entry->GetName() == name; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 if (GetRandomAvatarIconIndex(true, true, used_icon_indices, &icon_index)) | 197 if (GetRandomAvatarIconIndex(true, true, used_icon_indices, &icon_index)) |
| 192 return icon_index; | 198 return icon_index; |
| 193 | 199 |
| 194 // Settle for any random icon, even if it's not already used. | 200 // Settle for any random icon, even if it's not already used. |
| 195 if (GetRandomAvatarIconIndex(true, false, used_icon_indices, &icon_index)) | 201 if (GetRandomAvatarIconIndex(true, false, used_icon_indices, &icon_index)) |
| 196 return icon_index; | 202 return icon_index; |
| 197 | 203 |
| 198 NOTREACHED(); | 204 NOTREACHED(); |
| 199 return 0; | 205 return 0; |
| 200 } | 206 } |
| OLD | NEW |