profile_list_chromeos.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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
17// static
18ProfileList* ProfileList::Create(ProfileInfoInterface* profile_cache) {
19  return new chromeos::ProfileListChromeOS(profile_cache);
20}
21
22namespace chromeos {
23
24ProfileListChromeOS::ProfileListChromeOS(ProfileInfoInterface* profile_cache)
25    : profile_info_(profile_cache) {
26}
27
28ProfileListChromeOS::~ProfileListChromeOS() {
29  ClearMenu();
30}
31
32size_t ProfileListChromeOS::GetNumberOfItems() const {
33  return items_.size();
34}
35
36const AvatarMenu::Item& ProfileListChromeOS::GetItemAt(size_t index) const {
37  DCHECK_LT(index, items_.size());
38  return *items_[index];
39}
40
41void ProfileListChromeOS::RebuildMenu() {
42  ClearMenu();
43
44  // Filter for profiles associated with logged-in users.
45  UserList users = UserManager::Get()->GetLoggedInUsers();
46
47  // Add corresponding profiles.
48  for (UserList::const_iterator it = users.begin();
49       it != users.end(); ++it) {
50    size_t i = profile_info_->GetIndexOfProfileWithPath(
51        ProfileHelper::GetProfilePathByUserIdHash((*it)->username_hash()));
52
53    gfx::Image icon = gfx::Image((*it)->GetImage());
54    if (!CommandLine::ForCurrentProcess()->HasSwitch(
55        switches::kNewProfileManagement) && !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->managed = 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
79size_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
94void ProfileListChromeOS::ActiveProfilePathChanged(base::FilePath& path) {
95  active_profile_path_ = path;
96}
97
98void ProfileListChromeOS::ClearMenu() {
99  STLDeleteElements(&items_);
100}
101
102void ProfileListChromeOS::SortMenu() {
103  // Sort list of items by name.
104  std::sort(items_.begin(), items_.end(), &AvatarMenu::CompareItems);
105}
106
107}  // namespace chromeos
108