19ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
29ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
39ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// found in the LICENSE file.
49ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
59ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/profiles/profile_window.h"
69ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/command_line.h"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/files/file_path.h"
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/prefs/pref_service.h"
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/strings/utf_string_conversions.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/about_flags.h"
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/browser_process.h"
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/lifetime/application_lifetime.h"
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/pref_service_flags_storage.h"
169ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/profiles/profile.h"
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/profiles/profile_avatar_icon_util.h"
18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/profiles/profile_manager.h"
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/signin/account_reconcilor_factory.h"
209ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/ui/browser.h"
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/profile_chooser_constants.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/user_manager.h"
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/common/chrome_switches.h"
2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/common/pref_names.h"
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/common/url_constants.h"
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/signin/core/browser/account_reconcilor.h"
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/signin/core/common/profile_management_switches.h"
29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/browser_thread.h"
309ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "content/public/browser/user_metrics.h"
319ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
329ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#if !defined(OS_IOS)
339ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/ui/browser_finder.h"
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/ui/browser_list.h"
350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/ui/browser_list_observer.h"
369ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/ui/browser_window.h"
379ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/ui/startup/startup_browser_creator.h"
389ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#endif  // !defined (OS_IOS)
399ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UserMetricsAction;
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing content::BrowserThread;
429ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace {
44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char kNewProfileManagementExperimentInternalName[] =
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    "enable-new-profile-management";
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Handles running a callback when a new Browser for the given profile
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// has been completely created.
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class BrowserAddedForProfileObserver : public chrome::BrowserListObserver {
510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) public:
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowserAddedForProfileObserver(
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Profile* profile,
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ProfileManager::CreateCallback callback)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : profile_(profile),
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        callback_(callback) {
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(!callback_.is_null());
580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    BrowserList::AddObserver(this);
590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~BrowserAddedForProfileObserver() {
610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) private:
640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Overridden from BrowserListObserver:
650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void OnBrowserAdded(Browser* browser) OVERRIDE {
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (browser->profile() == profile_) {
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      BrowserList::RemoveObserver(this);
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      callback_.Run(profile_, Profile::CREATE_STATUS_INITIALIZED);
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Profile for which the browser should be opened.
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Profile* profile_;
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ProfileManager::CreateCallback callback_;
760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowserAddedForProfileObserver);
780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)};
790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void OpenBrowserWindowForProfile(
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ProfileManager::CreateCallback callback,
820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    bool always_create,
830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    bool is_new_profile,
840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    chrome::HostDesktopType desktop_type,
850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    Profile* profile,
860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    Profile::CreateStatus status) {
87ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (status != Profile::CREATE_STATUS_INITIALIZED)
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  chrome::startup::IsProcessStartup is_process_startup =
930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      chrome::startup::IS_NOT_PROCESS_STARTUP;
940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  chrome::startup::IsFirstRun is_first_run = chrome::startup::IS_NOT_FIRST_RUN;
950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // If this is a brand new profile, then start a first run window.
970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (is_new_profile) {
980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    is_process_startup = chrome::startup::IS_PROCESS_STARTUP;
990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    is_first_run = chrome::startup::IS_FIRST_RUN;
1000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If |always_create| is false, and we have a |callback| to run, check
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // whether a browser already exists so that we can run the callback. We don't
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // want to rely on the observer listening to OnBrowserSetLastActive in this
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // case, as you could manually activate an incorrect browser and trigger
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // a false positive.
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!always_create) {
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Browser* browser = chrome::FindTabbedBrowser(profile, false, desktop_type);
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (browser) {
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      browser->window()->Activate();
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (!callback.is_null())
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        callback.Run(profile, Profile::CREATE_STATUS_INITIALIZED);
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // If there is a callback, create an observer to make sure it is only
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // run when the browser has been completely created. This observer will
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // delete itself once that happens. This should not leak, because we are
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // passing |always_create| = true to FindOrCreateNewWindow below, which ends
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // up calling LaunchBrowser and opens a new window. If for whatever reason
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // that fails, either something has crashed, or the observer will be cleaned
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // up when a different browser for this profile is opened.
1240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!callback.is_null())
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    new BrowserAddedForProfileObserver(profile, callback);
1260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We already dealt with the case when |always_create| was false and a browser
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // existed, which means that here a browser definitely needs to be created.
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Passing true for |always_create| means we won't duplicate the code that
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // tries to find a browser.
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  profiles::FindOrCreateNewWindowForProfile(
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      profile,
1330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      is_process_startup,
1340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      is_first_run,
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      desktop_type,
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      true);
137ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
13923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Called after a |guest_profile| is available to be used by the user manager.
14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Based on the value of |tutorial_mode| we determine a url to be displayed
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// by the webui and run the |callback|, if it exists. After opening a profile,
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// perform |profile_open_action|.
14323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void OnUserManagerGuestProfileCreated(
14423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const base::FilePath& profile_path_to_focus,
14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    profiles::UserManagerTutorialMode tutorial_mode,
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    profiles::UserManagerProfileSelected profile_open_action,
14723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const base::Callback<void(Profile*, const std::string&)>& callback,
14823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    Profile* guest_profile,
14923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    Profile::CreateStatus status) {
15023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (status != Profile::CREATE_STATUS_INITIALIZED || callback.is_null())
15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return;
15223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
15323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Tell the webui which user should be focused.
15423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  std::string page = chrome::kChromeUIUserManagerURL;
15523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
15623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (tutorial_mode == profiles::USER_MANAGER_TUTORIAL_OVERVIEW) {
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    page += profiles::kUserManagerDisplayTutorial;
15823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  } else if (!profile_path_to_focus.empty()) {
15923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const ProfileInfoCache& cache =
16023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        g_browser_process->profile_manager()->GetProfileInfoCache();
16123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    size_t index = cache.GetIndexOfProfileWithPath(profile_path_to_focus);
16223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    if (index != std::string::npos) {
16323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      page += "#";
16423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      page += base::IntToString(index);
16523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    }
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (profile_open_action ==
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             profiles::USER_MANAGER_SELECT_PROFILE_TASK_MANAGER) {
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    page += profiles::kUserManagerSelectProfileTaskManager;
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (profile_open_action ==
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             profiles::USER_MANAGER_SELECT_PROFILE_ABOUT_CHROME) {
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    page += profiles::kUserManagerSelectProfileAboutChrome;
17223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
17323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  callback.Run(guest_profile, page);
17423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
17523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Updates Chrome services that require notification when
177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// the new_profile_management's status changes.
178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void UpdateServicesWithNewProfileManagementFlag(Profile* profile,
179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                bool new_flag_status) {
180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AccountReconcilor* account_reconcilor =
181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      AccountReconcilorFactory::GetForProfile(profile);
182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  account_reconcilor->OnNewProfileManagementFlagChanged(new_flag_status);
183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
185ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace
186ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1879ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochnamespace profiles {
1889ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// User Manager parameters are prefixed with hash.
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kUserManagerDisplayTutorial[] = "#tutorial";
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kUserManagerSelectProfileTaskManager[] = "#task-manager";
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kUserManagerSelectProfileAboutChrome[] = "#about-chrome";
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1949ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochvoid FindOrCreateNewWindowForProfile(
1959ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    Profile* profile,
1969ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    chrome::startup::IsProcessStartup process_startup,
1979ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    chrome::startup::IsFirstRun is_first_run,
1989ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    chrome::HostDesktopType desktop_type,
1999ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    bool always_create) {
2009ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#if defined(OS_IOS)
2019ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  NOTREACHED();
2029ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#else
2039ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  DCHECK(profile);
2049ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
2059ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (!always_create) {
2069ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    Browser* browser = chrome::FindTabbedBrowser(profile, false, desktop_type);
2079ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    if (browser) {
2089ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      browser->window()->Activate();
2099ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      return;
2109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    }
2119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  }
2129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
2139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  content::RecordAction(UserMetricsAction("NewWindow"));
2149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  CommandLine command_line(CommandLine::NO_PROGRAM);
2159ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  int return_code;
2169ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  StartupBrowserCreator browser_creator;
2179ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  browser_creator.LaunchBrowser(command_line, profile, base::FilePath(),
2189ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                process_startup, is_first_run, &return_code);
2199ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#endif  // defined(OS_IOS)
2209ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
2219ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SwitchToProfile(const base::FilePath& path,
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     chrome::HostDesktopType desktop_type,
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     bool always_create,
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     ProfileManager::CreateCallback callback,
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     ProfileMetrics::ProfileOpen metric) {
227ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  g_browser_process->profile_manager()->CreateProfileAsync(
228ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      path,
229ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      base::Bind(&OpenBrowserWindowForProfile,
2300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 callback,
231ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 always_create,
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 false,
233ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 desktop_type),
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16(),
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16(),
2362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      std::string());
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProfileMetrics::LogProfileSwitchUser(metric);
238ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
239ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void SwitchToGuestProfile(chrome::HostDesktopType desktop_type,
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          ProfileManager::CreateCallback callback) {
2420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  g_browser_process->profile_manager()->CreateProfileAsync(
2430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ProfileManager::GetGuestProfilePath(),
2440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      base::Bind(&OpenBrowserWindowForProfile,
2450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 callback,
2460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 false,
2470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 false,
2480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 desktop_type),
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16(),
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16(),
2510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      std::string());
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProfileMetrics::LogProfileSwitchUser(ProfileMetrics::SWITCH_PROFILE_GUEST);
2530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
2540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void CreateAndSwitchToNewProfile(chrome::HostDesktopType desktop_type,
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 ProfileManager::CreateCallback callback,
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 ProfileMetrics::ProfileAdd metric) {
2580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ProfileInfoCache& cache =
2590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      g_browser_process->profile_manager()->GetProfileInfoCache();
2600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int placeholder_avatar_index = profiles::GetPlaceholderAvatarIndex();
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ProfileManager::CreateMultiProfileAsync(
2630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      cache.ChooseNameForNewProfile(placeholder_avatar_index),
2640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::UTF8ToUTF16(profiles::GetDefaultAvatarIconUrl(
2650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          placeholder_avatar_index)),
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&OpenBrowserWindowForProfile,
2670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 callback,
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 true,
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 true,
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 desktop_type),
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      std::string());
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProfileMetrics::LogProfileAddNewUser(metric);
27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GuestBrowserCloseSuccess(const base::FilePath& profile_path) {
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UserManager::Show(profile_path,
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    profiles::USER_MANAGER_NO_TUTORIAL,
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION);
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
281d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void CloseGuestProfileWindows() {
282d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
283d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Profile* profile = profile_manager->GetProfileByPath(
284d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ProfileManager::GetGuestProfilePath());
285d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
286d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (profile) {
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BrowserList::CloseAllBrowsersWithProfile(
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        profile, base::Bind(&GuestBrowserCloseSuccess));
289d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
290d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
291d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid LockBrowserCloseSuccess(const base::FilePath& profile_path) {
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ProfileInfoCache* cache =
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      &g_browser_process->profile_manager()->GetProfileInfoCache();
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cache->SetProfileSigninRequiredAtIndex(
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      cache->GetIndexOfProfileWithPath(profile_path), true);
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UserManager::Show(profile_path,
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    profiles::USER_MANAGER_NO_TUTORIAL,
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION);
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LockProfile(Profile* profile) {
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(profile);
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (profile) {
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BrowserList::CloseAllBrowsersWithProfile(
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        profile, base::Bind(&LockBrowserCloseSuccess));
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
31123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void CreateGuestProfileForUserManager(
31223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const base::FilePath& profile_path_to_focus,
31323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    profiles::UserManagerTutorialMode tutorial_mode,
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    profiles::UserManagerProfileSelected profile_open_action,
31523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const base::Callback<void(Profile*, const std::string&)>& callback) {
31623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Create the guest profile, if necessary, and open the User Manager
31723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // from the guest profile.
31823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  g_browser_process->profile_manager()->CreateProfileAsync(
31923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      ProfileManager::GetGuestProfilePath(),
32023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      base::Bind(&OnUserManagerGuestProfileCreated,
32123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                 profile_path_to_focus,
32223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                 tutorial_mode,
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 profile_open_action,
32423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                 callback),
32523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      base::string16(),
32623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      base::string16(),
32723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      std::string());
32823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
32923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
33023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ShowUserManagerMaybeWithTutorial(Profile* profile) {
331c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Guest users cannot appear in the User Manager, nor display a tutorial.
332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!profile || profile->IsGuestSession()) {
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UserManager::Show(base::FilePath(),
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      profiles::USER_MANAGER_NO_TUTORIAL,
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION);
33623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return;
33723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UserManager::Show(base::FilePath(),
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    profiles::USER_MANAGER_TUTORIAL_OVERVIEW,
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION);
34123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
34223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void EnableNewProfileManagementPreview(Profile* profile) {
344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_ANDROID)
345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  NOTREACHED();
346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else
3476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // TODO(rogerta): instead of setting experiment flags and command line
3486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // args, we should set a profile preference.
3496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  const about_flags::Experiment experiment = {
3506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      kNewProfileManagementExperimentInternalName,
3516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      0,  // string id for title of experiment
3526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      0,  // string id for description of experiment
3536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      0,  // supported platforms
3546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      about_flags::Experiment::ENABLE_DISABLE_VALUE,
3556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      switches::kEnableNewProfileManagement,
3566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "",  // not used with ENABLE_DISABLE_VALUE type
3576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      switches::kDisableNewProfileManagement,
3586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      "",  // not used with ENABLE_DISABLE_VALUE type
3596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      NULL,  // not used with ENABLE_DISABLE_VALUE type
3606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      3
3616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  };
3620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  about_flags::PrefServiceFlagsStorage flags_storage(
3630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      g_browser_process->local_state());
3640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  about_flags::SetExperimentEnabled(
3650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      &flags_storage,
3666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      experiment.NameForChoice(1),
3670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      true);
3680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  switches::EnableNewProfileManagementForTesting(
370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      CommandLine::ForCurrentProcess());
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UserManager::Show(base::FilePath(),
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    profiles::USER_MANAGER_TUTORIAL_OVERVIEW,
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION);
374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateServicesWithNewProfileManagementFlag(profile, true);
375f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
3760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DisableNewProfileManagementPreview(Profile* profile) {
3795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  about_flags::PrefServiceFlagsStorage flags_storage(
3805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      g_browser_process->local_state());
3815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  about_flags::SetExperimentEnabled(
3825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      &flags_storage,
3835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      kNewProfileManagementExperimentInternalName,
3845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      false);
3855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  chrome::AttemptRestart();
386f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateServicesWithNewProfileManagementFlag(profile, false);
3875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
3885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void BubbleViewModeFromAvatarBubbleMode(
3906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    BrowserWindow::AvatarBubbleMode mode,
3916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    BubbleViewMode* bubble_view_mode,
3926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    TutorialMode* tutorial_mode) {
3936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  *tutorial_mode = TUTORIAL_MODE_NONE;
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  switch (mode) {
395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case BrowserWindow::AVATAR_BUBBLE_MODE_ACCOUNT_MANAGEMENT:
3966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      *bubble_view_mode = BUBBLE_VIEW_MODE_ACCOUNT_MANAGEMENT;
3976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return;
398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case BrowserWindow::AVATAR_BUBBLE_MODE_SIGNIN:
3996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      *bubble_view_mode = BUBBLE_VIEW_MODE_GAIA_SIGNIN;
4006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return;
401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case BrowserWindow::AVATAR_BUBBLE_MODE_ADD_ACCOUNT:
4026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      *bubble_view_mode = BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT;
4036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return;
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case BrowserWindow::AVATAR_BUBBLE_MODE_REAUTH:
4056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      *bubble_view_mode = BUBBLE_VIEW_MODE_GAIA_REAUTH;
4066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return;
4076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case BrowserWindow::AVATAR_BUBBLE_MODE_CONFIRM_SIGNIN:
4086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      *bubble_view_mode = BUBBLE_VIEW_MODE_PROFILE_CHOOSER;
4096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      *tutorial_mode = TUTORIAL_MODE_CONFIRM_SIGNIN;
4106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return;
41103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case BrowserWindow::AVATAR_BUBBLE_MODE_SHOW_ERROR:
41203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      *bubble_view_mode = BUBBLE_VIEW_MODE_PROFILE_CHOOSER;
41303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      *tutorial_mode = TUTORIAL_MODE_SHOW_ERROR;
41403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return;
4156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    default:
4166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      *bubble_view_mode = profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER;
417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4209ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}  // namespace profiles
421