1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/profiles/profiles_state.h" 6 7 #include "base/files/file_path.h" 8 #include "base/prefs/pref_registry_simple.h" 9 #include "base/prefs/pref_service.h" 10 #include "base/strings/utf_string_conversions.h" 11 #include "chrome/browser/browser_process.h" 12 #include "chrome/browser/profiles/gaia_info_update_service.h" 13 #include "chrome/browser/profiles/gaia_info_update_service_factory.h" 14 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/profiles/profile_info_cache.h" 16 #include "chrome/browser/profiles/profile_manager.h" 17 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 18 #include "chrome/browser/ui/browser.h" 19 #include "chrome/common/chrome_constants.h" 20 #include "chrome/common/pref_names.h" 21 #include "chrome/grit/generated_resources.h" 22 #include "components/signin/core/browser/profile_oauth2_token_service.h" 23 #include "components/signin/core/common/profile_management_switches.h" 24 #include "ui/base/l10n/l10n_util.h" 25 #include "ui/gfx/text_elider.h" 26 27 namespace profiles { 28 29 bool IsMultipleProfilesEnabled() { 30 #if defined(OS_ANDROID) 31 return false; 32 #endif 33 return true; 34 } 35 36 base::FilePath GetDefaultProfileDir(const base::FilePath& user_data_dir) { 37 base::FilePath default_profile_dir(user_data_dir); 38 default_profile_dir = 39 default_profile_dir.AppendASCII(chrome::kInitialProfile); 40 return default_profile_dir; 41 } 42 43 void RegisterPrefs(PrefRegistrySimple* registry) { 44 // Preferences about global profile information. 45 registry->RegisterStringPref(prefs::kProfileLastUsed, std::string()); 46 registry->RegisterIntegerPref(prefs::kProfilesNumCreated, 1); 47 registry->RegisterListPref(prefs::kProfilesLastActive); 48 49 // Preferences about the user manager. 50 registry->RegisterBooleanPref(prefs::kBrowserGuestModeEnabled, true); 51 registry->RegisterBooleanPref(prefs::kBrowserAddPersonEnabled, true); 52 } 53 54 base::string16 GetAvatarNameForProfile(const base::FilePath& profile_path) { 55 base::string16 display_name; 56 57 if (profile_path == ProfileManager::GetGuestProfilePath()) { 58 display_name = l10n_util::GetStringUTF16(IDS_GUEST_PROFILE_NAME); 59 } else { 60 const ProfileInfoCache& cache = 61 g_browser_process->profile_manager()->GetProfileInfoCache(); 62 size_t index = cache.GetIndexOfProfileWithPath(profile_path); 63 64 if (index == std::string::npos) 65 return l10n_util::GetStringUTF16(IDS_SINGLE_PROFILE_DISPLAY_NAME); 66 67 // Using the --new-avatar-menu flag, there's a couple of rules about what 68 // the avatar button displays. If there's a single profile, with a default 69 // name (i.e. of the form Person %d) not manually set, it should display 70 // IDS_SINGLE_PROFILE_DISPLAY_NAME. If the profile is signed in but is using 71 // a default name, use the profiles's email address. Otherwise, it 72 // will return the actual name of the profile. 73 const base::string16 profile_name = cache.GetNameOfProfileAtIndex(index); 74 const base::string16 email = cache.GetUserNameOfProfileAtIndex(index); 75 bool is_default_name = cache.ProfileIsUsingDefaultNameAtIndex(index) && 76 cache.IsDefaultProfileName(profile_name); 77 78 if (cache.GetNumberOfProfiles() == 1 && is_default_name) 79 display_name = l10n_util::GetStringUTF16(IDS_SINGLE_PROFILE_DISPLAY_NAME); 80 else 81 display_name = (is_default_name && !email.empty()) ? email : profile_name; 82 } 83 return display_name; 84 } 85 86 base::string16 GetAvatarButtonTextForProfile(Profile* profile) { 87 const int kMaxCharactersToDisplay = 15; 88 base::string16 name = GetAvatarNameForProfile(profile->GetPath()); 89 name = gfx::TruncateString(name, 90 kMaxCharactersToDisplay, 91 gfx::CHARACTER_BREAK); 92 if (profile->IsSupervised()) { 93 name = l10n_util::GetStringFUTF16(IDS_SUPERVISED_USER_NEW_AVATAR_LABEL, 94 name); 95 } 96 return name; 97 } 98 99 void UpdateProfileName(Profile* profile, 100 const base::string16& new_profile_name) { 101 const ProfileInfoCache& cache = 102 g_browser_process->profile_manager()->GetProfileInfoCache(); 103 size_t profile_index = cache.GetIndexOfProfileWithPath(profile->GetPath()); 104 if (profile_index == std::string::npos) 105 return; 106 107 if (new_profile_name == cache.GetNameOfProfileAtIndex(profile_index)) 108 return; 109 110 // This is only called when updating the profile name through the UI, 111 // so we can assume the user has done this on purpose. 112 PrefService* pref_service = profile->GetPrefs(); 113 pref_service->SetBoolean(prefs::kProfileUsingDefaultName, false); 114 115 // Updating the profile preference will cause the cache to be updated for 116 // this preference. 117 pref_service->SetString(prefs::kProfileName, 118 base::UTF16ToUTF8(new_profile_name)); 119 } 120 121 std::vector<std::string> GetSecondaryAccountsForProfile( 122 Profile* profile, 123 const std::string& primary_account) { 124 std::vector<std::string> accounts = 125 ProfileOAuth2TokenServiceFactory::GetForProfile(profile)->GetAccounts(); 126 127 // The vector returned by ProfileOAuth2TokenService::GetAccounts() contains 128 // the primary account too, so we need to remove it from the list. 129 std::vector<std::string>::iterator primary_index = 130 std::find_if(accounts.begin(), accounts.end(), 131 std::bind1st(std::equal_to<std::string>(), primary_account)); 132 DCHECK(primary_index != accounts.end()); 133 accounts.erase(primary_index); 134 135 return accounts; 136 } 137 138 bool IsRegularOrGuestSession(Browser* browser) { 139 Profile* profile = browser->profile(); 140 return profile->IsGuestSession() || !profile->IsOffTheRecord(); 141 } 142 143 void UpdateGaiaProfilePhotoIfNeeded(Profile* profile) { 144 // If the --google-profile-info flag isn't used, then the 145 // GAIAInfoUpdateService isn't initialized, and we can't download the picture. 146 if (!switches::IsGoogleProfileInfo()) 147 return; 148 149 DCHECK(profile); 150 GAIAInfoUpdateServiceFactory::GetInstance()->GetForProfile(profile)->Update(); 151 } 152 153 SigninErrorController* GetSigninErrorController(Profile* profile) { 154 ProfileOAuth2TokenService* token_service = 155 ProfileOAuth2TokenServiceFactory::GetForProfile(profile); 156 return token_service ? token_service->signin_error_controller() : NULL; 157 } 158 159 Profile* SetActiveProfileToGuestIfLocked() { 160 Profile* active_profile = ProfileManager::GetLastUsedProfile(); 161 DCHECK(active_profile); 162 163 if (active_profile->IsGuestSession()) 164 return active_profile; 165 166 ProfileManager* profile_manager = g_browser_process->profile_manager(); 167 const ProfileInfoCache& cache = profile_manager->GetProfileInfoCache(); 168 size_t index = cache.GetIndexOfProfileWithPath(active_profile->GetPath()); 169 if (!cache.ProfileIsSigninRequiredAtIndex(index)) 170 return NULL; 171 172 // The guest profile must have been loaded already. 173 Profile* guest_profile = profile_manager->GetProfile( 174 ProfileManager::GetGuestProfilePath()); 175 DCHECK(guest_profile); 176 177 PrefService* local_state = g_browser_process->local_state(); 178 DCHECK(local_state); 179 local_state->SetString(prefs::kProfileLastUsed, 180 guest_profile->GetPath().BaseName().MaybeAsASCII()); 181 return guest_profile; 182 } 183 184 } // namespace profiles 185