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