168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright 2013 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/chromeos/profiles/profile_list_chromeos.h" 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <algorithm> 868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/shell.h" 1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/command_line.h" 1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/chromeos/profiles/profile_helper.h" 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/profiles/profile_avatar_icon_util.h" 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/signin/core/common/profile_management_switches.h" 166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h" 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// static 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ProfileList* ProfileList::Create(ProfileInfoInterface* profile_cache) { 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return new chromeos::ProfileListChromeOS(profile_cache); 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace chromeos { 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ProfileListChromeOS::ProfileListChromeOS(ProfileInfoInterface* profile_cache) 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) : profile_info_(profile_cache) { 2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ProfileListChromeOS::~ProfileListChromeOS() { 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ClearMenu(); 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)size_t ProfileListChromeOS::GetNumberOfItems() const { 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return items_.size(); 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const AvatarMenu::Item& ProfileListChromeOS::GetItemAt(size_t index) const { 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_LT(index, items_.size()); 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return *items_[index]; 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ProfileListChromeOS::RebuildMenu() { 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ClearMenu(); 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Filter for profiles associated with logged-in users. 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserList users = 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->GetLoggedInUsers(); 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Add corresponding profiles. 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (user_manager::UserList::const_iterator it = users.begin(); 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) it != users.end(); 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ++it) { 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) size_t i = profile_info_->GetIndexOfProfileWithPath( 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileHelper::GetProfilePathByUserIdHash((*it)->username_hash())); 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gfx::Image icon = gfx::Image((*it)->GetImage()); 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!switches::IsNewProfileManagement() && !icon.IsEmpty()) { 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // old avatar menu uses resized-small images 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) icon = profiles::GetAvatarIconForMenu(icon, true); 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AvatarMenu::Item* item = new AvatarMenu::Item(i, i, icon); 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) item->name = (*it)->GetDisplayName(); 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) item->sync_state = profile_info_->GetUserNameOfProfileAtIndex(i); 650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) item->profile_path = profile_info_->GetPathOfProfileAtIndex(i); 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) item->supervised = false; 6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) item->signed_in = true; 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) item->active = profile_info_->GetPathOfProfileAtIndex(i) == 6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) active_profile_path_; 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) item->signin_required = profile_info_->ProfileIsSigninRequiredAtIndex(i); 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) items_.push_back(item); 7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) SortMenu(); 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // After sorting, assign items their actual indices. 7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (size_t i = 0; i < items_.size(); ++i) 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) items_[i]->menu_index = i; 7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)size_t ProfileListChromeOS::MenuIndexFromProfileIndex(size_t index) { 8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // On ChromeOS, the active profile might be Default, which does not show 8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // up in the model as a logged-in user. In that case, we return 0. 8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) size_t menu_index = 0; 8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (size_t i = 0; i < GetNumberOfItems(); ++i) { 8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (items_[i]->profile_index == index) { 8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) menu_index = i; 8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return menu_index; 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ProfileListChromeOS::ActiveProfilePathChanged(base::FilePath& path) { 9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) active_profile_path_ = path; 9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ProfileListChromeOS::ClearMenu() { 10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) STLDeleteElements(&items_); 10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ProfileListChromeOS::SortMenu() { 10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Sort list of items by name. 10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::sort(items_.begin(), items_.end(), &AvatarMenu::CompareItems); 10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace chromeos 110