profiles_state.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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 "components/signin/core/browser/profile_oauth2_token_service.h"
22#include "components/signin/core/common/profile_management_switches.h"
23#include "grit/generated_resources.h"
24#include "ui/base/l10n/l10n_util.h"
25
26#if defined(OS_CHROMEOS)
27#include "chrome/browser/chromeos/login/users/user_manager.h"
28#endif
29
30namespace profiles {
31
32bool IsMultipleProfilesEnabled() {
33#if defined(OS_ANDROID)
34  return false;
35#endif
36  return true;
37}
38
39base::FilePath GetDefaultProfileDir(const base::FilePath& user_data_dir) {
40  base::FilePath default_profile_dir(user_data_dir);
41  default_profile_dir =
42      default_profile_dir.AppendASCII(chrome::kInitialProfile);
43  return default_profile_dir;
44}
45
46void RegisterPrefs(PrefRegistrySimple* registry) {
47  registry->RegisterStringPref(prefs::kProfileLastUsed, std::string());
48  registry->RegisterIntegerPref(prefs::kProfilesNumCreated, 1);
49  registry->RegisterListPref(prefs::kProfilesLastActive);
50}
51
52base::string16 GetAvatarNameForProfile(const base::FilePath& profile_path) {
53  base::string16 display_name;
54
55  if (profile_path == ProfileManager::GetGuestProfilePath()) {
56    display_name = l10n_util::GetStringUTF16(IDS_GUEST_PROFILE_NAME);
57  } else {
58    ProfileInfoCache& cache =
59        g_browser_process->profile_manager()->GetProfileInfoCache();
60    size_t index = cache.GetIndexOfProfileWithPath(profile_path);
61
62    if (index == std::string::npos)
63      return l10n_util::GetStringUTF16(IDS_SINGLE_PROFILE_DISPLAY_NAME);
64
65    // Using the --new-profile-management flag, there's a couple of rules
66    // about what the avatar button displays. If there's a single, local
67    // profile, with a default name (i.e. of the form Person %d), it should
68    // display IDS_SINGLE_PROFILE_DISPLAY_NAME. If this is a signed in profile,
69    // or the user has edited the profile name, or there are multiple profiles,
70    // it will return the actual name  of the profile.
71    base::string16 profile_name = cache.GetNameOfProfileAtIndex(index);
72    bool has_default_name = cache.ProfileIsUsingDefaultNameAtIndex(index);
73
74    if (cache.GetNumberOfProfiles() == 1 && has_default_name &&
75        cache.GetUserNameOfProfileAtIndex(index).empty()) {
76      display_name = l10n_util::GetStringUTF16(IDS_SINGLE_PROFILE_DISPLAY_NAME);
77    } else {
78      display_name = profile_name;
79    }
80  }
81  return display_name;
82}
83
84void UpdateProfileName(Profile* profile,
85                       const base::string16& new_profile_name) {
86  PrefService* pref_service = profile->GetPrefs();
87  // Updating the profile preference will cause the cache to be updated for
88  // this preference.
89  pref_service->SetString(prefs::kProfileName,
90                          base::UTF16ToUTF8(new_profile_name));
91}
92
93std::vector<std::string> GetSecondaryAccountsForProfile(
94    Profile* profile,
95    const std::string& primary_account) {
96  std::vector<std::string> accounts =
97      ProfileOAuth2TokenServiceFactory::GetForProfile(profile)->GetAccounts();
98
99  // The vector returned by ProfileOAuth2TokenService::GetAccounts() contains
100  // the primary account too, so we need to remove it from the list.
101  std::vector<std::string>::iterator primary_index =
102      std::find_if(accounts.begin(), accounts.end(),
103                   std::bind1st(std::equal_to<std::string>(), primary_account));
104  DCHECK(primary_index != accounts.end());
105  accounts.erase(primary_index);
106
107  return accounts;
108}
109
110bool IsRegularOrGuestSession(Browser* browser) {
111  Profile* profile = browser->profile();
112  return profile->IsGuestSession() || !profile->IsOffTheRecord();
113}
114
115void UpdateGaiaProfilePhotoIfNeeded(Profile* profile) {
116  // If the --google-profile-info flag isn't used, then the
117  // GAIAInfoUpdateService isn't initialized, and we can't download the picture.
118  if (!switches::IsGoogleProfileInfo())
119    return;
120
121  DCHECK(profile);
122  GAIAInfoUpdateServiceFactory::GetInstance()->GetForProfile(profile)->Update();
123}
124
125SigninErrorController* GetSigninErrorController(Profile* profile) {
126  ProfileOAuth2TokenService* token_service =
127      ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
128  return token_service ? token_service->signin_error_controller() : NULL;
129}
130
131}  // namespace profiles
132