Home | History | Annotate | Download | only in profiles
      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