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