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