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/chromeos/profiles/profile_list_chromeos.h" 6 7 #include <algorithm> 8 9 #include "ash/shell.h" 10 #include "base/command_line.h" 11 #include "chrome/browser/chromeos/login/users/user_manager.h" 12 #include "chrome/browser/chromeos/profiles/profile_helper.h" 13 #include "chrome/browser/profiles/profile_avatar_icon_util.h" 14 #include "chrome/browser/profiles/profile_manager.h" 15 #include "chrome/common/chrome_switches.h" 16 #include "components/signin/core/common/profile_management_switches.h" 17 18 // static 19 ProfileList* ProfileList::Create(ProfileInfoInterface* profile_cache) { 20 return new chromeos::ProfileListChromeOS(profile_cache); 21 } 22 23 namespace chromeos { 24 25 ProfileListChromeOS::ProfileListChromeOS(ProfileInfoInterface* profile_cache) 26 : profile_info_(profile_cache) { 27 } 28 29 ProfileListChromeOS::~ProfileListChromeOS() { 30 ClearMenu(); 31 } 32 33 size_t ProfileListChromeOS::GetNumberOfItems() const { 34 return items_.size(); 35 } 36 37 const AvatarMenu::Item& ProfileListChromeOS::GetItemAt(size_t index) const { 38 DCHECK_LT(index, items_.size()); 39 return *items_[index]; 40 } 41 42 void ProfileListChromeOS::RebuildMenu() { 43 ClearMenu(); 44 45 // Filter for profiles associated with logged-in users. 46 UserList users = UserManager::Get()->GetLoggedInUsers(); 47 48 // Add corresponding profiles. 49 for (UserList::const_iterator it = users.begin(); 50 it != users.end(); ++it) { 51 size_t i = profile_info_->GetIndexOfProfileWithPath( 52 ProfileHelper::GetProfilePathByUserIdHash((*it)->username_hash())); 53 54 gfx::Image icon = gfx::Image((*it)->GetImage()); 55 if (!switches::IsNewProfileManagement() && !icon.IsEmpty()) { 56 // old avatar menu uses resized-small images 57 icon = profiles::GetAvatarIconForMenu(icon, true); 58 } 59 60 AvatarMenu::Item* item = new AvatarMenu::Item(i, i, icon); 61 item->name = (*it)->GetDisplayName(); 62 item->sync_state = profile_info_->GetUserNameOfProfileAtIndex(i); 63 item->profile_path = profile_info_->GetPathOfProfileAtIndex(i); 64 item->supervised = false; 65 item->signed_in = true; 66 item->active = profile_info_->GetPathOfProfileAtIndex(i) == 67 active_profile_path_; 68 item->signin_required = profile_info_->ProfileIsSigninRequiredAtIndex(i); 69 items_.push_back(item); 70 } 71 72 SortMenu(); 73 74 // After sorting, assign items their actual indices. 75 for (size_t i = 0; i < items_.size(); ++i) 76 items_[i]->menu_index = i; 77 } 78 79 size_t ProfileListChromeOS::MenuIndexFromProfileIndex(size_t index) { 80 // On ChromeOS, the active profile might be Default, which does not show 81 // up in the model as a logged-in user. In that case, we return 0. 82 size_t menu_index = 0; 83 84 for (size_t i = 0; i < GetNumberOfItems(); ++i) { 85 if (items_[i]->profile_index == index) { 86 menu_index = i; 87 break; 88 } 89 } 90 91 return menu_index; 92 } 93 94 void ProfileListChromeOS::ActiveProfilePathChanged(base::FilePath& path) { 95 active_profile_path_ = path; 96 } 97 98 void ProfileListChromeOS::ClearMenu() { 99 STLDeleteElements(&items_); 100 } 101 102 void ProfileListChromeOS::SortMenu() { 103 // Sort list of items by name. 104 std::sort(items_.begin(), items_.end(), &AvatarMenu::CompareItems); 105 } 106 107 } // namespace chromeos 108