diff options
author | avayvod@chromium.org <avayvod@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-25 06:33:40 +0000 |
---|---|---|
committer | avayvod@chromium.org <avayvod@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-25 06:33:40 +0000 |
commit | 022a8ca1d96755b98c26c6211968415fe7c2f458 (patch) | |
tree | bbede82d9395dd663e44acf684bf2befbf0ea1ef /chrome/browser/chromeos | |
parent | 3c0c0bf588c11dcfd838482461c72787f9fcc83c (diff) | |
download | chromium_src-022a8ca1d96755b98c26c6211968415fe7c2f458.zip chromium_src-022a8ca1d96755b98c26c6211968415fe7c2f458.tar.gz chromium_src-022a8ca1d96755b98c26c6211968415fe7c2f458.tar.bz2 |
Enable tooltips on users only if there're at least two users with the same display name.
BUG=cros:2318
TEST=Log in with two users with the same username but different domains. Check that tooltips are enabled on the next run of login screen. Remove one of the users. Check that tooltips are disabled and stay disabled until new user is added with duplicate username.
Review URL: http://codereview.chromium.org/2841026
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@50827 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chromeos')
-rw-r--r-- | chrome/browser/chromeos/login/existing_user_controller.cc | 43 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/user_controller.cc | 35 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/user_controller.h | 12 |
3 files changed, 73 insertions, 17 deletions
diff --git a/chrome/browser/chromeos/login/existing_user_controller.cc b/chrome/browser/chromeos/login/existing_user_controller.cc index 42e9197..9c2071d 100644 --- a/chrome/browser/chromeos/login/existing_user_controller.cc +++ b/chrome/browser/chromeos/login/existing_user_controller.cc @@ -6,6 +6,7 @@ #include <algorithm> #include <functional> +#include <set> #include "app/l10n_util.h" #include "app/resource_bundle.h" @@ -53,6 +54,26 @@ const char kParamSuffix[] = "\n"; // URL prefix for CAPTCHA image. const char kCaptchaUrlPrefix[] = "http://www.google.com/accounts/"; +// Checks if display names are unique. If there are duplicates, enables +// tooltips with full emails to let users distinguish their accounts. +// Otherwise, disables the tooltips. +void EnableTooltipsIfNeeded(const std::vector<UserController*>& controllers) { + bool show_name_tooltips = false; + std::set<std::string> visible_display_names; + for (size_t i = 0; i < controllers.size(); ++i) { + const std::string& display_name = + controllers[i]->user().GetDisplayName(); + if (visible_display_names.count(display_name) > 0) { + show_name_tooltips = true; + break; + } + visible_display_names.insert(display_name); + } + for (size_t i = 0; i < controllers.size(); ++i) + if (!controllers[i]->is_guest()) + controllers[i]->EnableNameTooltip(show_name_tooltips); +} + } // namespace ExistingUserController::ExistingUserController( @@ -73,10 +94,9 @@ ExistingUserController::ExistingUserController( UserController::kPadding)))); } - for (size_t i = 0, max = std::min(users.size(), max_users - 1); i < max; - ++i) { + size_t visible_users_count = std::min(users.size(), max_users - 1); + for (size_t i = 0; i < visible_users_count; ++i) controllers_.push_back(new UserController(this, users[i])); - } // Add the view representing the guest user last. controllers_.push_back(new UserController(this)); @@ -92,6 +112,8 @@ void ExistingUserController::Init() { static_cast<int>(controllers_.size())); } + EnableTooltipsIfNeeded(controllers_); + WmMessageListener::instance()->AddObserver(this); if (CrosLibrary::Get()->EnsureLoaded()) @@ -202,16 +224,13 @@ void ExistingUserController::RemoveUser(UserController* source) { UserManager::Get()->RemoveUser(source->user().email()); // We need to unmap entry windows, the windows will be unmapped in destructor. + controllers_.erase(controllers_.begin() + source->user_index()); delete source; - int new_size = static_cast<int>(controllers_.size()) - 1; - for (int i = 0; i < static_cast<int>(controllers_.size()); ++i) { - if (controllers_[i] == source) { - controllers_.erase(controllers_.begin() + i); - --i; - } else { - controllers_[i]->UpdateUserCount(i, new_size); - } - } + + EnableTooltipsIfNeeded(controllers_); + int new_size = static_cast<int>(controllers_.size()); + for (int i = 0; i < new_size; ++i) + controllers_[i]->UpdateUserCount(i, new_size); } void ExistingUserController::OnLoginFailure(const std::string& error) { diff --git a/chrome/browser/chromeos/login/user_controller.cc b/chrome/browser/chromeos/login/user_controller.cc index 211c747..4484d24 100644 --- a/chrome/browser/chromeos/login/user_controller.cc +++ b/chrome/browser/chromeos/login/user_controller.cc @@ -83,6 +83,7 @@ UserController::UserController(Delegate* delegate) : user_index_(-1), is_user_selected_(false), is_guest_(true), + show_name_tooltip_(false), delegate_(delegate), password_field_(NULL), submit_button_(NULL), @@ -92,7 +93,9 @@ UserController::UserController(Delegate* delegate) label_window_(NULL), unselected_label_window_(NULL), user_view_(NULL), - new_user_view_(NULL) { + new_user_view_(NULL), + label_view_(NULL), + unselected_label_view_(NULL) { registrar_.Add( this, NotificationType::LOGIN_USER_IMAGE_CHANGED, @@ -104,6 +107,7 @@ UserController::UserController(Delegate* delegate, : user_index_(-1), is_user_selected_(false), is_guest_(false), + show_name_tooltip_(false), user_(user), delegate_(delegate), password_field_(NULL), @@ -114,7 +118,9 @@ UserController::UserController(Delegate* delegate, label_window_(NULL), unselected_label_window_(NULL), user_view_(NULL), - new_user_view_(NULL) { + new_user_view_(NULL), + label_view_(NULL), + unselected_label_view_(NULL) { registrar_.Add( this, NotificationType::LOGIN_USER_IMAGE_CHANGED, @@ -126,6 +132,8 @@ UserController::~UserController() { image_window_->Close(); user_view_ = NULL; new_user_view_ = NULL; + label_view_ = NULL; + unselected_label_view_ = NULL; border_window_->Close(); label_window_->Close(); unselected_label_window_->Close(); @@ -157,6 +165,22 @@ void UserController::ClearAndEnablePassword() { } } +void UserController::EnableNameTooltip(bool enable) { + if (is_guest_) + return; + + std::wstring tooltip_text; + if (enable) + tooltip_text = UTF8ToWide(user_.email()); + + if (user_view_) + user_view_->SetTooltipText(tooltip_text); + if (label_view_) + label_view_->SetTooltipText(tooltip_text); + if (unselected_label_view_) + unselected_label_view_->SetTooltipText(tooltip_text); +} + void UserController::ButtonPressed(views::Button* sender, const views::Event& event) { Login(); @@ -258,7 +282,6 @@ WidgetGtk* UserController::CreateImageWindow(int index) { if (!is_guest_) { user_view_->SetImage(user_.image()); - user_view_->SetTooltipText(UTF8ToWide(user_.email())); } else { user_view_->SetImage(*ResourceBundle::GetSharedInstance().GetBitmapNamed( IDR_LOGIN_OTHER_USER)); @@ -325,8 +348,10 @@ WidgetGtk* UserController::CreateLabelWindow(int index, views::Label* label = new views::Label(text); label->SetColor(kTextColor); label->SetFont(font); - if (!is_guest_) - label->SetTooltipText(UTF8ToWide(user_.email())); + if (type == WM_IPC_WINDOW_LOGIN_LABEL) + label_view_ = label; + else + unselected_label_view_ = label; window->SetContentsView(label); diff --git a/chrome/browser/chromeos/login/user_controller.h b/chrome/browser/chromeos/login/user_controller.h index e9834f6..8a022b3 100644 --- a/chrome/browser/chromeos/login/user_controller.h +++ b/chrome/browser/chromeos/login/user_controller.h @@ -70,9 +70,13 @@ class UserController : public views::ButtonListener, int user_index() const { return user_index_; } bool is_user_selected() const { return is_user_selected_; } + bool is_guest() const { return is_guest_; } const UserManager::User& user() const { return user_; } + // Enables or disables tooltip with user's email. + void EnableNameTooltip(bool enable); + // Resets password text and sets the enabled state of the password. void ClearAndEnablePassword(); @@ -148,6 +152,10 @@ class UserController : public views::ButtonListener, // Is this the guest user? const bool is_guest_; + // Should we show tooltips above user image and label to help distinguish + // users with the same display name. + bool show_name_tooltip_; + // If is_guest_ is false, this is the user being shown. UserManager::User user_; @@ -172,6 +180,10 @@ class UserController : public views::ButtonListener, // View that that is used for new user login. NewUserView* new_user_view_; + // Views that show display name of the user. + views::Label* label_view_; + views::Label* unselected_label_view_; + NotificationRegistrar registrar_; DISALLOW_COPY_AND_ASSIGN(UserController); |