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/profiles/profile_list_desktop.h"
      6 
      7 #include "chrome/browser/profiles/profile.h"
      8 #include "chrome/browser/profiles/profile_avatar_icon_util.h"
      9 #include "chrome/browser/profiles/profile_info_cache.h"
     10 #include "components/signin/core/common/profile_management_switches.h"
     11 #include "grit/generated_resources.h"
     12 #include "ui/base/l10n/l10n_util.h"
     13 
     14 ProfileListDesktop::ProfileListDesktop(ProfileInfoInterface* profile_cache)
     15     : profile_info_(profile_cache),
     16       omitted_item_count_(0) {
     17 }
     18 
     19 ProfileListDesktop::~ProfileListDesktop() {
     20   ClearMenu();
     21 }
     22 
     23 // static
     24 ProfileList* ProfileList::Create(ProfileInfoInterface* profile_cache) {
     25   return new ProfileListDesktop(profile_cache);
     26 }
     27 
     28 size_t ProfileListDesktop::GetNumberOfItems() const {
     29   return items_.size();
     30 }
     31 
     32 const AvatarMenu::Item& ProfileListDesktop::GetItemAt(size_t index) const {
     33   DCHECK_LT(index, items_.size());
     34   return *items_[index];
     35 }
     36 
     37 void ProfileListDesktop::RebuildMenu() {
     38   ClearMenu();
     39 
     40   const size_t count = profile_info_->GetNumberOfProfiles();
     41   for (size_t i = 0; i < count; ++i) {
     42     if (profile_info_->IsOmittedProfileAtIndex(i)) {
     43       omitted_item_count_++;
     44       continue;
     45     }
     46 
     47     gfx::Image icon = profile_info_->GetAvatarIconOfProfileAtIndex(i);
     48     AvatarMenu::Item* item = new AvatarMenu::Item(i - omitted_item_count_,
     49                                                   i,
     50                                                   icon);
     51     item->name = profile_info_->GetNameOfProfileAtIndex(i);
     52     item->sync_state = profile_info_->GetUserNameOfProfileAtIndex(i);
     53     item->profile_path = profile_info_->GetPathOfProfileAtIndex(i);
     54     item->supervised = profile_info_->ProfileIsSupervisedAtIndex(i);
     55     item->signed_in = !item->sync_state.empty();
     56     if (!item->signed_in) {
     57       item->sync_state = l10n_util::GetStringUTF16(
     58           item->supervised ? IDS_MANAGED_USER_AVATAR_LABEL :
     59                              IDS_PROFILES_LOCAL_PROFILE_STATE);
     60     }
     61     item->active = profile_info_->GetPathOfProfileAtIndex(i) ==
     62         active_profile_path_;
     63     item->signin_required = profile_info_->ProfileIsSigninRequiredAtIndex(i);
     64     items_.push_back(item);
     65   }
     66   // One omitted item is expected when a supervised-user profile is in the
     67   // process of being registered, but there shouldn't be more than one.
     68   VLOG_IF(2, (omitted_item_count_ > 1)) << omitted_item_count_
     69                                         << " profiles omitted fom list.";
     70 }
     71 
     72 size_t ProfileListDesktop::MenuIndexFromProfileIndex(size_t index) {
     73   const size_t menu_count = GetNumberOfItems();
     74   DCHECK_LT(index, menu_count + omitted_item_count_);
     75 
     76   // In the common case, valid profile-cache indices correspond to indices in
     77   // the menu.
     78   if (!omitted_item_count_)
     79     return index;
     80 
     81   for (size_t i = 0; i < menu_count; ++i) {
     82     const AvatarMenu::Item item = GetItemAt(i);
     83     if (item.profile_index == index)
     84       return i;
     85   }
     86 
     87   // The desired index was not found; return a fallback value.
     88   NOTREACHED();
     89   return 0;
     90 }
     91 
     92 void ProfileListDesktop::ActiveProfilePathChanged(base::FilePath& path) {
     93   active_profile_path_ = path;
     94 }
     95 
     96 void ProfileListDesktop::ClearMenu() {
     97   STLDeleteElements(&items_);
     98   omitted_item_count_ = 0;
     99 }
    100