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/profiles/profile_list_desktop.h" 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/profiles/profile_avatar_icon_util.h" 968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h" 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/signin/core/common/profile_management_switches.h" 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ProfileListDesktop::ProfileListDesktop(ProfileInfoInterface* profile_cache) 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : profile_info_(profile_cache), 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) omitted_item_count_(0) { 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ProfileListDesktop::~ProfileListDesktop() { 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ClearMenu(); 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// static 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ProfileList* ProfileList::Create(ProfileInfoInterface* profile_cache) { 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return new ProfileListDesktop(profile_cache); 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)size_t ProfileListDesktop::GetNumberOfItems() const { 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return items_.size(); 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const AvatarMenu::Item& ProfileListDesktop::GetItemAt(size_t index) const { 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_LT(index, items_.size()); 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return *items_[index]; 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ProfileListDesktop::RebuildMenu() { 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ClearMenu(); 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const size_t count = profile_info_->GetNumberOfProfiles(); 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (size_t i = 0; i < count; ++i) { 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (profile_info_->IsOmittedProfileAtIndex(i)) { 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) omitted_item_count_++; 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) continue; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Image icon = profile_info_->GetAvatarIconOfProfileAtIndex(i); 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AvatarMenu::Item* item = new AvatarMenu::Item(i - omitted_item_count_, 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) i, 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) icon); 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) item->name = profile_info_->GetNameOfProfileAtIndex(i); 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) item->sync_state = profile_info_->GetUserNameOfProfileAtIndex(i); 530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) item->profile_path = profile_info_->GetPathOfProfileAtIndex(i); 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) item->supervised = profile_info_->ProfileIsSupervisedAtIndex(i); 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) item->signed_in = !item->sync_state.empty(); 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!item->signed_in) { 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) item->sync_state = l10n_util::GetStringUTF16( 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch item->supervised ? IDS_SUPERVISED_USER_AVATAR_LABEL : 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IDS_PROFILES_LOCAL_PROFILE_STATE); 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) item->active = profile_info_->GetPathOfProfileAtIndex(i) == 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) active_profile_path_; 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) item->signin_required = profile_info_->ProfileIsSigninRequiredAtIndex(i); 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) items_.push_back(item); 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // One omitted item is expected when a supervised-user profile is in the 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // process of being registered, but there shouldn't be more than one. 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG_IF(2, (omitted_item_count_ > 1)) << omitted_item_count_ 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << " profiles omitted fom list."; 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)size_t ProfileListDesktop::MenuIndexFromProfileIndex(size_t index) { 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const size_t menu_count = GetNumberOfItems(); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_LT(index, menu_count + omitted_item_count_); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // In the common case, valid profile-cache indices correspond to indices in 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the menu. 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!omitted_item_count_) 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return index; 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < menu_count; ++i) { 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const AvatarMenu::Item item = GetItemAt(i); 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (item.profile_index == index) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return i; 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The desired index was not found; return a fallback value. 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; 9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ProfileListDesktop::ActiveProfilePathChanged(base::FilePath& path) { 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) active_profile_path_ = path; 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ProfileListDesktop::ClearMenu() { 9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) STLDeleteElements(&items_); 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) omitted_item_count_ = 0; 9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 100