profiles_state.cc revision 116680a4aac90f2aa7413d9095a592090648e557
14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/profiles/profiles_state.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 88bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/prefs/pref_service.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/gaia_info_update_service.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/profiles/gaia_info_update_service_factory.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profiles/profile.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profiles/profile_info_cache.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/common/chrome_constants.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/signin/core/browser/profile_oauth2_token_service.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/signin/core/common/profile_management_switches.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/user_manager.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace profiles { 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsMultipleProfilesEnabled() { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetDefaultProfileDir(const base::FilePath& user_data_dir) { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath default_profile_dir(user_data_dir); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_profile_dir = 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_profile_dir.AppendASCII(chrome::kInitialProfile); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return default_profile_dir; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RegisterPrefs(PrefRegistrySimple* registry) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry->RegisterStringPref(prefs::kProfileLastUsed, std::string()); 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) registry->RegisterIntegerPref(prefs::kProfilesNumCreated, 1); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry->RegisterListPref(prefs::kProfilesLastActive); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::string16 GetAvatarNameForProfile(const base::FilePath& profile_path) { 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::string16 display_name; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (profile_path == ProfileManager::GetGuestProfilePath()) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_name = l10n_util::GetStringUTF16(IDS_GUEST_PROFILE_NAME); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileInfoCache& cache = 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_browser_process->profile_manager()->GetProfileInfoCache(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t index = cache.GetIndexOfProfileWithPath(profile_path); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index == std::string::npos) 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_SINGLE_PROFILE_DISPLAY_NAME); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Using the --new-profile-management flag, there's a couple of rules 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // about what the avatar button displays. If there's a single, local 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // profile, with a default name (i.e. of the form Person %d), it should 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // display IDS_SINGLE_PROFILE_DISPLAY_NAME. If this is a signed in profile, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or the user has edited the profile name, or there are multiple profiles, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it will return the actual name of the profile. 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::string16 profile_name = cache.GetNameOfProfileAtIndex(index); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_default_name = cache.ProfileIsUsingDefaultNameAtIndex(index); 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (cache.GetNumberOfProfiles() == 1 && has_default_name && 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) cache.GetUserNameOfProfileAtIndex(index).empty()) { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name = l10n_util::GetStringUTF16(IDS_SINGLE_PROFILE_DISPLAY_NAME); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_name = profile_name; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return display_name; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UpdateProfileName(Profile* profile, 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& new_profile_name) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* pref_service = profile->GetPrefs(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updating the profile preference will cause the cache to be updated for 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // this preference. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_service->SetString(prefs::kProfileName, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UTF16ToUTF8(new_profile_name)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<std::string> GetSecondaryAccountsForProfile( 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& primary_account) { 961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<std::string> accounts = 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(profile)->GetAccounts(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The vector returned by ProfileOAuth2TokenService::GetAccounts() contains 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the primary account too, so we need to remove it from the list. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string>::iterator primary_index = 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::find_if(accounts.begin(), accounts.end(), 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::bind1st(std::equal_to<std::string>(), primary_account)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(primary_index != accounts.end()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accounts.erase(primary_index); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return accounts; 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsRegularOrGuestSession(Browser* browser) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = browser->profile(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return profile->IsGuestSession() || !profile->IsOffTheRecord(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UpdateGaiaProfilePhotoIfNeeded(Profile* profile) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the --google-profile-info flag isn't used, then the 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GAIAInfoUpdateService isn't initialized, and we can't download the picture. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!switches::IsGoogleProfileInfo()) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(profile); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GAIAInfoUpdateServiceFactory::GetInstance()->GetForProfile(profile)->Update(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SigninErrorController* GetSigninErrorController(Profile* profile) { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileOAuth2TokenService* token_service = 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(profile); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return token_service ? token_service->signin_error_controller() : NULL; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace profiles 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)