Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / ash / system / tray_accessibility.cc
index 8b1902d..4b3262d 100644 (file)
@@ -14,8 +14,8 @@
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/tray/tray_details_view.h"
 #include "ash/system/tray/tray_item_more.h"
-#include "ash/system/tray/tray_notification_view.h"
 #include "ash/system/tray/tray_popup_label_button.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/views/widget/widget.h"
 
 namespace ash {
-namespace internal {
-
 namespace {
 
 enum AccessibilityState {
-  A11Y_NONE             = 0,
-  A11Y_SPOKEN_FEEDBACK  = 1 << 0,
-  A11Y_HIGH_CONTRAST    = 1 << 1,
+  A11Y_NONE = 0,
+  A11Y_SPOKEN_FEEDBACK = 1 << 0,
+  A11Y_HIGH_CONTRAST = 1 << 1,
   A11Y_SCREEN_MAGNIFIER = 1 << 2,
-  A11Y_LARGE_CURSOR     = 1 << 3,
-  A11Y_AUTOCLICK        = 1 << 4,
+  A11Y_LARGE_CURSOR = 1 << 3,
+  A11Y_AUTOCLICK = 1 << 4,
+  A11Y_VIRTUAL_KEYBOARD = 1 << 5,
+  A11Y_BRAILLE_DISPLAY_CONNECTED = 1 << 6,
 };
 
 uint32 GetAccessibilityState() {
@@ -54,6 +54,10 @@ uint32 GetAccessibilityState() {
     state |= A11Y_LARGE_CURSOR;
   if (delegate->IsAutoclickEnabled())
     state |= A11Y_AUTOCLICK;
+  if (delegate->IsVirtualKeyboardEnabled())
+    state |= A11Y_VIRTUAL_KEYBOARD;
+  if (delegate->IsBrailleDisplayConnected())
+    state |= A11Y_BRAILLE_DISPLAY_CONNECTED;
   return state;
 }
 
@@ -76,6 +80,7 @@ class DefaultAccessibilityView : public TrayItemMore {
         IDS_ASH_STATUS_TRAY_ACCESSIBILITY);
     SetLabel(label);
     SetAccessibleName(label);
+    set_id(test::kAccessibilityTrayItemViewId);
   }
 
   virtual ~DefaultAccessibilityView() {
@@ -85,28 +90,38 @@ class DefaultAccessibilityView : public TrayItemMore {
   DISALLOW_COPY_AND_ASSIGN(DefaultAccessibilityView);
 };
 
-class AccessibilityPopupView : public TrayNotificationView {
- public:
-  AccessibilityPopupView(SystemTrayItem* owner)
-      : TrayNotificationView(owner, IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK) {
-    InitView(GetLabel());
-  }
+////////////////////////////////////////////////////////////////////////////////
+// ash::tray::AccessibilityPopupView
 
- private:
-  views::Label* GetLabel() {
-    views::Label* label = new views::Label(
-        l10n_util::GetStringUTF16(
-            IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_BUBBLE));
-    label->SetMultiLine(true);
-    label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-    return label;
-  }
+AccessibilityPopupView::AccessibilityPopupView(SystemTrayItem* owner,
+                                               uint32 enabled_state_bits)
+    : TrayNotificationView(owner, IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK),
+      label_(CreateLabel(enabled_state_bits)) {
+  InitView(label_);
+}
 
-  DISALLOW_COPY_AND_ASSIGN(AccessibilityPopupView);
-};
+views::Label* AccessibilityPopupView::CreateLabel(uint32 enabled_state_bits) {
+  DCHECK((enabled_state_bits &
+          (A11Y_SPOKEN_FEEDBACK | A11Y_BRAILLE_DISPLAY_CONNECTED)) != 0);
+  base::string16 text;
+  if (enabled_state_bits & A11Y_BRAILLE_DISPLAY_CONNECTED) {
+    text.append(l10n_util::GetStringUTF16(
+        IDS_ASH_STATUS_TRAY_BRAILLE_DISPLAY_CONNECTED_BUBBLE));
+  }
+  if (enabled_state_bits & A11Y_SPOKEN_FEEDBACK) {
+    if (!text.empty())
+      text.append(base::ASCIIToUTF16(" "));
+    text.append(l10n_util::GetStringUTF16(
+        IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_BUBBLE));
+  }
+  views::Label* label = new views::Label(text);
+  label->SetMultiLine(true);
+  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+  return label;
+}
 
 ////////////////////////////////////////////////////////////////////////////////
-// ash::internal::tray::AccessibilityDetailedView
+// ash::tray::AccessibilityDetailedView
 
 AccessibilityDetailedView::AccessibilityDetailedView(
     SystemTrayItem* owner, user::LoginStatus login) :
@@ -118,11 +133,13 @@ AccessibilityDetailedView::AccessibilityDetailedView(
         help_view_(NULL),
         settings_view_(NULL),
         autoclick_view_(NULL),
+        virtual_keyboard_view_(NULL),
         spoken_feedback_enabled_(false),
         high_contrast_enabled_(false),
         screen_magnifier_enabled_(false),
         large_cursor_enabled_(false),
         autoclick_enabled_(false),
+        virtual_keyboard_enabled_(false),
         login_(login) {
 
   Reset();
@@ -179,6 +196,13 @@ void AccessibilityDetailedView::AppendAccessibilityList() {
         autoclick_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
         autoclick_enabled_);
   }
+
+  virtual_keyboard_enabled_ = delegate->IsVirtualKeyboardEnabled();
+  virtual_keyboard_view_ =  AddScrollListItem(
+      bundle.GetLocalizedString(
+          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_VIRTUAL_KEYBOARD),
+      virtual_keyboard_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
+      virtual_keyboard_enabled_);
 }
 
 void AccessibilityDetailedView::AppendHelpEntries() {
@@ -261,6 +285,12 @@ void AccessibilityDetailedView::OnViewClicked(views::View* sender) {
             ash::UMA_STATUS_AREA_DISABLE_AUTO_CLICK :
             ash::UMA_STATUS_AREA_ENABLE_AUTO_CLICK);
     delegate->SetAutoclickEnabled(!delegate->IsAutoclickEnabled());
+  } else if (virtual_keyboard_view_ && sender == virtual_keyboard_view_) {
+    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
+        delegate->IsVirtualKeyboardEnabled() ?
+            ash::UMA_STATUS_AREA_DISABLE_VIRTUAL_KEYBOARD :
+            ash::UMA_STATUS_AREA_ENABLE_VIRTUAL_KEYBOARD);
+    delegate->SetVirtualKeyboardEnabled(!delegate->IsVirtualKeyboardEnabled());
   }
 }
 
@@ -277,14 +307,14 @@ void AccessibilityDetailedView::ButtonPressed(views::Button* sender,
 }  // namespace tray
 
 ////////////////////////////////////////////////////////////////////////////////
-// ash::internal::TrayAccessibility
+// ash::TrayAccessibility
 
 TrayAccessibility::TrayAccessibility(SystemTray* system_tray)
     : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_ACCESSIBILITY),
       default_(NULL),
       detailed_popup_(NULL),
       detailed_menu_(NULL),
-      request_popup_view_(false),
+      request_popup_view_state_(A11Y_NONE),
       tray_icon_visible_(false),
       login_(GetCurrentLoginStatus()),
       previous_accessibility_state_(GetAccessibilityState()),
@@ -341,9 +371,10 @@ views::View* TrayAccessibility::CreateDetailedView(user::LoginStatus status) {
   CHECK(detailed_popup_ == NULL);
   CHECK(detailed_menu_ == NULL);
 
-  if (request_popup_view_) {
-    detailed_popup_ = new tray::AccessibilityPopupView(this);
-    request_popup_view_ = false;
+  if (request_popup_view_state_) {
+    detailed_popup_ =
+        new tray::AccessibilityPopupView(this, request_popup_view_state_);
+    request_popup_view_state_ = A11Y_NONE;
     return detailed_popup_;
   } else {
     Shell::GetInstance()->metrics()->RecordUserMetricsAction(
@@ -376,11 +407,21 @@ void TrayAccessibility::OnAccessibilityModeChanged(
   SetTrayIconVisible(GetInitialVisibility());
 
   uint32 accessibility_state = GetAccessibilityState();
-  if ((notify == ash::A11Y_NOTIFICATION_SHOW) &&
-      !(previous_accessibility_state_ & A11Y_SPOKEN_FEEDBACK) &&
-      (accessibility_state & A11Y_SPOKEN_FEEDBACK)) {
+  // We'll get an extra notification if a braille display is connected when
+  // spoken feedback wasn't already enabled.  This is because the braille
+  // connection state is already updated when spoken feedback is enabled so
+  // that the notifications can be consolidated into one.  Therefore, we
+  // return early if there's no change in the state that we keep track of.
+  if (accessibility_state == previous_accessibility_state_)
+    return;
+  // Contains bits for spoken feedback and braille display connected currently
+  // being enabled.
+  uint32 being_enabled =
+      (accessibility_state & ~previous_accessibility_state_) &
+      (A11Y_SPOKEN_FEEDBACK | A11Y_BRAILLE_DISPLAY_CONNECTED);
+  if ((notify == ash::A11Y_NOTIFICATION_SHOW) && being_enabled != A11Y_NONE) {
     // Shows popup if |notify| is true and the spoken feedback is being enabled.
-    request_popup_view_ = true;
+    request_popup_view_state_ = being_enabled;
     PopupDetailedView(kTrayPopupAutoCloseDelayForTextInSeconds, false);
   } else {
     if (detailed_popup_)
@@ -392,5 +433,4 @@ void TrayAccessibility::OnAccessibilityModeChanged(
   previous_accessibility_state_ = accessibility_state;
 }
 
-}  // namespace internal
 }  // namespace ash