summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos
diff options
context:
space:
mode:
authoravayvod@chromium.org <avayvod@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-25 06:33:40 +0000
committeravayvod@chromium.org <avayvod@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-25 06:33:40 +0000
commit022a8ca1d96755b98c26c6211968415fe7c2f458 (patch)
treebbede82d9395dd663e44acf684bf2befbf0ea1ef /chrome/browser/chromeos
parent3c0c0bf588c11dcfd838482461c72787f9fcc83c (diff)
downloadchromium_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.cc43
-rw-r--r--chrome/browser/chromeos/login/user_controller.cc35
-rw-r--r--chrome/browser/chromeos/login/user_controller.h12
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);