Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ash / system / ime / tray_ime.cc
index 87e254a..303b4fa 100644 (file)
@@ -6,10 +6,11 @@
 
 #include <vector>
 
+#include "ash/metrics/user_metrics_recorder.h"
 #include "ash/root_window_controller.h"
+#include "ash/session/session_state_delegate.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
-#include "ash/system/system_notifier.h"
 #include "ash/system/tray/hover_highlight_view.h"
 #include "ash/system/tray/system_tray.h"
 #include "ash/system/tray/system_tray_delegate.h"
 #include "base/strings/utf_string_conversions.h"
 #include "grit/ash_resources.h"
 #include "grit/ash_strings.h"
-#include "ui/base/l10n/l10n_util.h"
+#include "ui/accessibility/ax_enums.h"
+#include "ui/accessibility/ax_view_state.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/gfx/font.h"
 #include "ui/gfx/image/image.h"
-#include "ui/message_center/message_center.h"
-#include "ui/message_center/notification.h"
-#include "ui/message_center/notification_delegate.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/widget/widget.h"
 
-using message_center::Notification;
+namespace ash {
+namespace tray {
+
+// A |HoverHighlightView| that uses bold or normal font depending on whetehr
+// it is selected.  This view exposes itself as a checkbox to the accessibility
+// framework.
+class SelectableHoverHighlightView : public HoverHighlightView {
+ public:
+  SelectableHoverHighlightView(ViewClickListener* listener,
+                               const base::string16& label,
+                               bool selected)
+      : HoverHighlightView(listener), selected_(selected) {
+    AddLabel(
+        label, gfx::ALIGN_LEFT, selected ? gfx::Font::BOLD : gfx::Font::NORMAL);
+  }
 
-namespace {
+  ~SelectableHoverHighlightView() override {}
 
-const char kIMENotificationId[] = "chrome://settings/ime";
+ protected:
+  // Overridden from views::View.
+  void GetAccessibleState(ui::AXViewState* state) override {
+    HoverHighlightView::GetAccessibleState(state);
+    state->role = ui::AX_ROLE_CHECK_BOX;
+    if (selected_)
+      state->AddStateFlag(ui::AX_STATE_CHECKED);
+  }
 
-}  // namespace
+ private:
+  bool selected_;
 
-namespace ash {
-namespace internal {
-namespace tray {
+  DISALLOW_COPY_AND_ASSIGN(SelectableHoverHighlightView);
+};
 
 class IMEDefaultView : public TrayItemMore {
  public:
@@ -60,7 +80,7 @@ class IMEDefaultView : public TrayItemMore {
     UpdateLabel(info);
   }
 
-  virtual ~IMEDefaultView() {}
+  ~IMEDefaultView() override {}
 
   void UpdateLabel(const IMEInfo& info) {
     SetLabel(info.name);
@@ -85,7 +105,7 @@ class IMEDetailedView : public TrayDetailsView,
     Update(list, property_list);
   }
 
-  virtual ~IMEDetailedView() {}
+  ~IMEDetailedView() override {}
 
   void Update(const IMEInfoList& list,
               const IMEPropertyInfoList& property_list) {
@@ -94,7 +114,12 @@ class IMEDetailedView : public TrayDetailsView,
     AppendIMEList(list);
     if (!property_list.empty())
       AppendIMEProperties(property_list);
-    if (login_ != user::LOGGED_IN_NONE && login_ != user::LOGGED_IN_LOCKED)
+    bool userAddingRunning = ash::Shell::GetInstance()
+                                 ->session_state_delegate()
+                                 ->IsInSecondaryLoginScreen();
+
+    if (login_ != user::LOGGED_IN_NONE && login_ != user::LOGGED_IN_LOCKED &&
+        !userAddingRunning)
       AppendSettings();
     AppendHeaderEntry();
 
@@ -111,9 +136,8 @@ class IMEDetailedView : public TrayDetailsView,
     ime_map_.clear();
     CreateScrollableList();
     for (size_t i = 0; i < list.size(); i++) {
-      HoverHighlightView* container = new HoverHighlightView(this);
-      container->AddLabel(list[i].name,
-          list[i].selected ? gfx::Font::BOLD : gfx::Font::NORMAL);
+      HoverHighlightView* container = new SelectableHoverHighlightView(
+          this, list[i].name, list[i].selected);
       scroll_content()->AddChildView(container);
       ime_map_[container] = list[i].id;
     }
@@ -122,13 +146,11 @@ class IMEDetailedView : public TrayDetailsView,
   void AppendIMEProperties(const IMEPropertyInfoList& property_list) {
     property_map_.clear();
     for (size_t i = 0; i < property_list.size(); i++) {
-      HoverHighlightView* container = new HoverHighlightView(this);
-      container->AddLabel(
-          property_list[i].name,
-          property_list[i].selected ? gfx::Font::BOLD : gfx::Font::NORMAL);
+      HoverHighlightView* container = new SelectableHoverHighlightView(
+          this, property_list[i].name, property_list[i].selected);
       if (i == 0)
-        container->set_border(views::Border::CreateSolidSidedBorder(1, 0, 0, 0,
-        kBorderLightColor));
+        container->SetBorder(views::Border::CreateSolidSidedBorder(
+            1, 0, 0, 0, kBorderLightColor));
       scroll_content()->AddChildView(container);
       property_map_[container] = property_list[i].key;
     }
@@ -136,24 +158,30 @@ class IMEDetailedView : public TrayDetailsView,
 
   void AppendSettings() {
     HoverHighlightView* container = new HoverHighlightView(this);
-    container->AddLabel(ui::ResourceBundle::GetSharedInstance().
-        GetLocalizedString(IDS_ASH_STATUS_TRAY_IME_SETTINGS),
+    container->AddLabel(
+        ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
+            IDS_ASH_STATUS_TRAY_IME_SETTINGS),
+        gfx::ALIGN_LEFT,
         gfx::Font::NORMAL);
     AddChildView(container);
     settings_ = container;
   }
 
   // Overridden from ViewClickListener.
-  virtual void OnViewClicked(views::View* sender) OVERRIDE {
+  void OnViewClicked(views::View* sender) override {
     SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
     if (sender == footer()->content()) {
-      owner()->system_tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
+      TransitionToDefaultView();
     } else if (sender == settings_) {
+      Shell::GetInstance()->metrics()->RecordUserMetricsAction(
+          ash::UMA_STATUS_AREA_IME_SHOW_DETAILED);
       delegate->ShowIMESettings();
     } else {
       std::map<views::View*, std::string>::const_iterator ime_find;
       ime_find = ime_map_.find(sender);
       if (ime_find != ime_map_.end()) {
+        Shell::GetInstance()->metrics()->RecordUserMetricsAction(
+            ash::UMA_STATUS_AREA_IME_SWITCH_MODE);
         std::string ime_id = ime_find->second;
         delegate->SwitchIME(ime_id);
         GetWidget()->Close();
@@ -184,62 +212,32 @@ TrayIME::TrayIME(SystemTray* system_tray)
     : SystemTrayItem(system_tray),
       tray_label_(NULL),
       default_(NULL),
-      detailed_(NULL),
-      message_shown_(false) {
+      detailed_(NULL) {
   Shell::GetInstance()->system_tray_notifier()->AddIMEObserver(this);
 }
 
 TrayIME::~TrayIME() {
   Shell::GetInstance()->system_tray_notifier()->RemoveIMEObserver(this);
-  message_center::MessageCenter::Get()->RemoveNotification(
-      kIMENotificationId, false /* by_user */);
 }
 
 void TrayIME::UpdateTrayLabel(const IMEInfo& current, size_t count) {
   if (tray_label_) {
+    bool visible = count > 1;
+    tray_label_->SetVisible(visible);
+    // Do not change label before hiding because this change is noticeable.
+    if (!visible)
+      return;
     if (current.third_party) {
-      tray_label_->label()->SetText(current.short_name + UTF8ToUTF16("*"));
+      tray_label_->label()->SetText(
+          current.short_name + base::UTF8ToUTF16("*"));
     } else {
       tray_label_->label()->SetText(current.short_name);
     }
-    tray_label_->SetVisible(count > 1);
     SetTrayLabelItemBorder(tray_label_, system_tray()->shelf_alignment());
     tray_label_->Layout();
   }
 }
 
-void TrayIME::UpdateOrCreateNotification() {
-  message_center::MessageCenter* message_center =
-      message_center::MessageCenter::Get();
-
-  if (!message_center->HasNotification(kIMENotificationId) && message_shown_)
-    return;
-
-  SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
-  IMEInfo current;
-  delegate->GetCurrentIME(&current);
-
-  ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
-  scoped_ptr<Notification> notification(new Notification(
-      message_center::NOTIFICATION_TYPE_SIMPLE,
-      kIMENotificationId,
-      // TODO(zork): Use IDS_ASH_STATUS_TRAY_THIRD_PARTY_IME_TURNED_ON_BUBBLE
-      // for third party IMEs
-      l10n_util::GetStringFUTF16(
-          IDS_ASH_STATUS_TRAY_IME_TURNED_ON_BUBBLE,
-          current.medium_name),
-      base::string16(),  // message
-      bundle.GetImageNamed(IDR_AURA_UBER_TRAY_IME),
-      base::string16(),  // display_source
-      message_center::NotifierId(system_notifier::NOTIFIER_INPUT_METHOD),
-      message_center::RichNotificationData(),
-      new message_center::HandleNotificationClickedDelegate(
-          base::Bind(&TrayIME::PopupDetailedView,
-                     base::Unretained(this), 0, true))));
-  message_center->AddNotification(notification.Pass());
-  message_shown_ = true;
-}
-
 views::View* TrayIME::CreateTrayView(user::LoginStatus status) {
   CHECK(tray_label_ == NULL);
   tray_label_ = new TrayItemView(this);
@@ -290,7 +288,7 @@ void TrayIME::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
   tray_label_->Layout();
 }
 
-void TrayIME::OnIMERefresh(bool show_message) {
+void TrayIME::OnIMERefresh() {
   SystemTrayDelegate* delegate = Shell::GetInstance()->system_tray_delegate();
   IMEInfoList list;
   IMEInfo current;
@@ -305,10 +303,6 @@ void TrayIME::OnIMERefresh(bool show_message) {
     default_->UpdateLabel(current);
   if (detailed_)
     detailed_->Update(list, property_list);
-
-  if (list.size() > 1 && show_message)
-    UpdateOrCreateNotification();
 }
 
-}  // namespace internal
 }  // namespace ash