168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file.
468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/avatar_menu.h"
668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/ash_switches.h"
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/bind.h"
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/i18n/case_conversion.h"
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/metrics/field_trial.h"
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/browser_process.h"
1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/chrome_notification_types.h"
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/avatar_menu_actions.h"
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/avatar_menu_observer.h"
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/profile_list.h"
1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/profile_metrics.h"
1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/profile_window.h"
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/profiles_state.h"
2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/ash/chrome_shell_delegate.h"
2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h"
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_browser_creator.h"
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/user_manager.h"
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/signin/core/common/profile_management_switches.h"
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/public/browser/notification_service.h"
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "grit/theme_resources.h"
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_MANAGED_USERS)
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service.h"
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif
4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)using content::BrowserThread;
4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace {
4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Constants for the show profile switcher experiment
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kShowProfileSwitcherFieldTrialName[] = "ShowProfileSwitcher";
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kAlwaysShowSwitcherGroupName[] = "AlwaysShow";
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)AvatarMenu::AvatarMenu(ProfileInfoInterface* profile_cache,
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                       AvatarMenuObserver* observer,
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                       Browser* browser)
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    : profile_list_(ProfileList::Create(profile_cache)),
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      menu_actions_(AvatarMenuActions::Create()),
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_MANAGED_USERS)
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      supervised_user_observer_(this),
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      profile_info_(profile_cache),
6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      observer_(observer),
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      browser_(browser) {
6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(profile_info_);
6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Don't DCHECK(browser_) so that unit tests can reuse this ctor.
6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ActiveBrowserChanged(browser_);
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Register this as an observer of the info cache.
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      content::NotificationService::AllSources());
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_MANAGED_USERS)
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Register this as an observer of the SupervisedUserService to be notified
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // of changes to the custodian info.
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (browser_) {
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    supervised_user_observer_.Add(
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        SupervisedUserServiceFactory::GetForProfile(browser_->profile()));
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)AvatarMenu::~AvatarMenu() {
8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)AvatarMenu::Item::Item(size_t menu_index,
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                       size_t profile_index,
8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                       const gfx::Image& icon)
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    : icon(icon),
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      active(false),
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      signed_in(false),
9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      signin_required(false),
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      menu_index(menu_index),
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      profile_index(profile_index) {
9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)AvatarMenu::Item::~Item() {
9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// static
9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool AvatarMenu::ShouldShowAvatarMenu() {
10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (base::FieldTrialList::FindFullName(kShowProfileSwitcherFieldTrialName) ==
10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      kAlwaysShowSwitcherGroupName) {
10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // We should only be in this group when multi-profiles is enabled.
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    DCHECK(profiles::IsMultipleProfilesEnabled());
10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return true;
10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // TODO: Eliminate this ifdef. Add a delegate interface for the menu which
10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // would also help remove the Browser dependency in AvatarMenuActions
10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // implementations.
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (profiles::IsMultipleProfilesEnabled()) {
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_CHROMEOS)
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // On ChromeOS the menu will not be shown.
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#else
115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return switches::IsNewAvatarMenu() ||
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)           (g_browser_process->profile_manager() &&
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            g_browser_process->profile_manager()->GetNumberOfProfiles() > 1);
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return false;
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool AvatarMenu::CompareItems(const Item* item1, const Item* item2) {
12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return base::i18n::ToLower(item1->name).compare(
12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      base::i18n::ToLower(item2->name)) < 0;
12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AvatarMenu::SwitchToProfile(size_t index,
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 bool always_create,
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 ProfileMetrics::ProfileOpen metric) {
13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(profiles::IsMultipleProfilesEnabled() ||
13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)         index == GetActiveProfileIndex());
13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const Item& item = GetItemAt(index);
1340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (switches::IsNewAvatarMenu()) {
1360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Don't open a browser window for signed-out profiles.
1370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (item.signin_required) {
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      UserManager::Show(item.profile_path,
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        profiles::USER_MANAGER_NO_TUTORIAL,
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION);
1410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return;
1420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
1430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::FilePath path =
14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      profile_info_->GetPathOfProfileAtIndex(item.profile_index);
14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  chrome::HostDesktopType desktop_type = chrome::GetActiveDesktop();
14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (browser_)
15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    desktop_type = browser_->host_desktop_type();
15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  profiles::SwitchToProfile(path, desktop_type, always_create,
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            ProfileManager::CreateCallback(),
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            metric);
15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
15668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void AvatarMenu::AddNewProfile(ProfileMetrics::ProfileAdd type) {
15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  menu_actions_->AddNewProfile(type);
15968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void AvatarMenu::EditProfile(size_t index) {
16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Get the index in the profile cache from the menu index.
16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  size_t profile_index = profile_list_->GetItemAt(index).profile_index;
16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  Profile* profile = g_browser_process->profile_manager()->GetProfileByPath(
16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        profile_info_->GetPathOfProfileAtIndex(profile_index));
16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  menu_actions_->EditProfile(profile, profile_index);
16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void AvatarMenu::RebuildMenu() {
17268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  profile_list_->RebuildMenu();
17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
17468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)size_t AvatarMenu::GetNumberOfItems() const {
17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return profile_list_->GetNumberOfItems();
17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const AvatarMenu::Item& AvatarMenu::GetItemAt(size_t index) const {
18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return profile_list_->GetItemAt(index);
18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)size_t AvatarMenu::GetActiveProfileIndex() {
18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // During singleton profile deletion, this function can be called with no
18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // profiles in the model - crbug.com/102278 .
18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (profile_list_->GetNumberOfItems() == 0)
18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return 0;
18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
18968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  Profile* active_profile = NULL;
19068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!browser_)
19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    active_profile = ProfileManager::GetLastUsedProfile();
19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  else
19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    active_profile = browser_->profile();
19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  size_t index =
19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      profile_info_->GetIndexOfProfileWithPath(active_profile->GetPath());
19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  index = profile_list_->MenuIndexFromProfileIndex(index);
19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK_LT(index, profile_list_->GetNumberOfItems());
20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return index;
20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::string16 AvatarMenu::GetSupervisedUserInformation() const {
20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // |browser_| can be NULL in unit_tests.
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (browser_ && browser_->profile()->IsSupervised()) {
20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_MANAGED_USERS)
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    SupervisedUserService* service =
208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        SupervisedUserServiceFactory::GetForProfile(browser_->profile());
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 custodian =
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::UTF8ToUTF16(service->GetCustodianEmailAddress());
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return l10n_util::GetStringFUTF16(IDS_SUPERVISED_USER_INFO, custodian);
21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif
21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return base::string16();
21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const gfx::Image& AvatarMenu::GetSupervisedUserIcon() const {
21868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return ResourceBundle::GetSharedInstance().GetNativeImageNamed(
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      IDR_SUPERVISED_USER_ICON);
22068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
22168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void AvatarMenu::ActiveBrowserChanged(Browser* browser) {
22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  browser_ = browser;
22468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  menu_actions_->ActiveBrowserChanged(browser);
22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // If browser is not NULL, get the path of its active profile.
22768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::FilePath path;
22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (browser)
22968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    path = browser->profile()->GetPath();
23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  profile_list_->ActiveProfilePathChanged(path);
23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool AvatarMenu::ShouldShowAddNewProfileLink() const {
23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return menu_actions_->ShouldShowAddNewProfileLink();
23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool AvatarMenu::ShouldShowEditProfileLink() const {
23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return menu_actions_->ShouldShowEditProfileLink();
23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void AvatarMenu::Observe(int type,
24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                         const content::NotificationSource& source,
24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                         const content::NotificationDetails& details) {
24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK_EQ(chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, type);
24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  RebuildMenu();
24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (observer_)
24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    observer_->OnAvatarMenuChanged(this);
24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_MANAGED_USERS)
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid AvatarMenu::OnCustodianInfoChanged() {
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RebuildMenu();
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (observer_)
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    observer_->OnAvatarMenuChanged(this);
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
257