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)