d154d4412f0bd5dc96672d5774bb893946709184
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / profiles / profile_list_chromeos.cc
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