Chromium Code Reviews| Index: ash/system/tray_accessibility.cc |
| diff --git a/ash/system/tray_accessibility.cc b/ash/system/tray_accessibility.cc |
| index 4e94408bb1d7fbf7204861c64205329ac7fa31d8..f58f0061ebba87043a4dbfaafc450b3bffb34820 100644 |
| --- a/ash/system/tray_accessibility.cc |
| +++ b/ash/system/tray_accessibility.cc |
| @@ -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" |
| @@ -32,13 +32,14 @@ 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() { |
| @@ -57,6 +58,8 @@ uint32 GetAccessibilityState() { |
| state |= A11Y_AUTOCLICK; |
| if (delegate->IsVirtualKeyboardEnabled()) |
| state |= A11Y_VIRTUAL_KEYBOARD; |
| + if (delegate->IsBrailleDisplayConnected()) |
| + state |= A11Y_BRAILLE_DISPLAY_CONNECTED; |
| return state; |
| } |
| @@ -88,25 +91,36 @@ 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::internal::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)); |
| + } |
| + LOG(ERROR) << "Popping up " << text; // TODO: remove. |
|
dmazzoni
2014/03/26 19:02:46
Reminder to remove this
|
| + views::Label* label = new views::Label(text); |
| + label->SetMultiLine(true); |
| + label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + return label; |
| +} |
| //////////////////////////////////////////////////////////////////////////////// |
| // ash::internal::tray::AccessibilityDetailedView |
| @@ -302,7 +316,7 @@ TrayAccessibility::TrayAccessibility(SystemTray* system_tray) |
| 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()), |
| @@ -359,9 +373,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( |
| @@ -394,13 +409,24 @@ 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 { |
| + LOG(ERROR) << "Closing"; |
|
dmazzoni
2014/03/26 19:02:46
Remove
|
| if (detailed_popup_) |
| detailed_popup_->GetWidget()->Close(); |
| if (detailed_menu_) |