Index: ash/system/tray_accessibility.cc |
diff --git a/ash/system/tray_accessibility.cc b/ash/system/tray_accessibility.cc |
index 854e81cc5ed592d6101cbfa023b5219bf0a2c25a..23b3bfa65f0f317919b0f36d8d2543675786ff2d 100644 |
--- a/ash/system/tray_accessibility.cc |
+++ b/ash/system/tray_accessibility.cc |
@@ -12,6 +12,7 @@ |
#include "ash/shell.h" |
#include "ash/shell_port.h" |
#include "ash/strings/grit/ash_strings.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_controller.h" |
@@ -19,28 +20,23 @@ |
#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_popup_item_style.h" |
#include "ash/system/tray/tray_popup_utils.h" |
#include "ash/system/tray/tri_view.h" |
-#include "base/strings/utf_string_conversions.h" |
#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/resource/resource_bundle.h" |
#include "ui/gfx/image/image.h" |
#include "ui/gfx/paint_vector_icon.h" |
+#include "ui/gfx/vector_icon_types.h" |
+#include "ui/message_center/message_center.h" |
#include "ui/native_theme/native_theme.h" |
#include "ui/resources/grit/ui_resources.h" |
-#include "ui/views/background.h" |
-#include "ui/views/controls/button/custom_button.h" |
-#include "ui/views/controls/image_view.h" |
-#include "ui/views/controls/label.h" |
#include "ui/views/controls/separator.h" |
-#include "ui/views/layout/box_layout.h" |
-#include "ui/views/layout/grid_layout.h" |
#include "ui/views/widget/widget.h" |
namespace ash { |
namespace { |
+const char kNotificationId[] = "chrome://settings/accessibility"; |
+ |
enum AccessibilityState { |
A11Y_NONE = 0, |
A11Y_SPOKEN_FEEDBACK = 1 << 0, |
@@ -94,6 +90,17 @@ LoginStatus GetCurrentLoginStatus() { |
return Shell::Get()->session_controller()->login_status(); |
} |
+// Returns notification icon based on the enabled accessibility state. |
+const gfx::VectorIcon& GetNotificationIcon(uint32_t enabled_accessibility) { |
+ if ((enabled_accessibility & A11Y_BRAILLE_DISPLAY_CONNECTED) && |
+ (enabled_accessibility & A11Y_SPOKEN_FEEDBACK)) { |
+ return kSystemMenuAccessibilityIcon; |
+ } |
+ if (enabled_accessibility & A11Y_BRAILLE_DISPLAY_CONNECTED) |
+ return kNotificationAccessibilityBrailleIcon; |
+ return kSystemMenuAccessibilityChromevoxIcon; |
+} |
+ |
} // namespace |
namespace tray { |
@@ -125,84 +132,6 @@ class DefaultAccessibilityView : public TrayItemMore { |
}; |
//////////////////////////////////////////////////////////////////////////////// |
-// ash::tray::AccessibilityPopupView |
- |
-AccessibilityPopupView::AccessibilityPopupView(uint32_t enabled_state_bits) |
- : label_(CreateLabel(enabled_state_bits)) {} |
- |
-void AccessibilityPopupView::Init() { |
- set_background(views::Background::CreateThemedSolidBackground( |
- this, ui::NativeTheme::kColorId_BubbleBackground)); |
- |
- views::GridLayout* layout = new views::GridLayout(this); |
- SetLayoutManager(layout); |
- |
- views::ImageView* close_button = new views::ImageView(); |
- close_button->SetImage( |
- ResourceBundle::GetSharedInstance().GetImageSkiaNamed(IDR_MESSAGE_CLOSE)); |
- close_button->SetHorizontalAlignment(views::ImageView::CENTER); |
- close_button->SetVerticalAlignment(views::ImageView::CENTER); |
- |
- views::ImageView* icon = new views::ImageView; |
- icon->SetImage( |
- gfx::CreateVectorIcon(kSystemMenuAccessibilityIcon, kMenuIconColor)); |
- |
- views::ColumnSet* columns = layout->AddColumnSet(0); |
- |
- columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal / 2); |
- |
- // Icon |
- columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, |
- 0, /* resize percent */ |
- views::GridLayout::FIXED, kNotificationIconWidth, |
- kNotificationIconWidth); |
- |
- columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal / 2); |
- |
- // Contents |
- columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, |
- 100, /* resize percent */ |
- views::GridLayout::FIXED, kTrayNotificationContentsWidth, |
- kTrayNotificationContentsWidth); |
- |
- columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal / 2); |
- |
- // Close button |
- columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::LEADING, |
- 0, /* resize percent */ |
- views::GridLayout::FIXED, kNotificationButtonWidth, |
- kNotificationButtonWidth); |
- |
- // Layout rows |
- layout->AddPaddingRow(0, kTrayPopupPaddingBetweenItems); |
- layout->StartRow(0, 0); |
- layout->AddView(icon); |
- layout->AddView(label_); |
- layout->AddView(close_button); |
- layout->AddPaddingRow(0, kTrayPopupPaddingBetweenItems); |
-} |
- |
-views::Label* AccessibilityPopupView::CreateLabel(uint32_t 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::tray::AccessibilityDetailedView |
AccessibilityDetailedView::AccessibilityDetailedView(SystemTrayItem* owner) |
@@ -305,65 +234,65 @@ void AccessibilityDetailedView::HandleViewClicked(views::View* view) { |
UserMetricsAction user_action; |
if (view == spoken_feedback_view_) { |
user_action = delegate->IsSpokenFeedbackEnabled() |
- ? ash::UMA_STATUS_AREA_DISABLE_SPOKEN_FEEDBACK |
- : ash::UMA_STATUS_AREA_ENABLE_SPOKEN_FEEDBACK; |
+ ? UMA_STATUS_AREA_DISABLE_SPOKEN_FEEDBACK |
+ : UMA_STATUS_AREA_ENABLE_SPOKEN_FEEDBACK; |
delegate->ToggleSpokenFeedback(A11Y_NOTIFICATION_NONE); |
} else if (view == high_contrast_view_) { |
user_action = delegate->IsHighContrastEnabled() |
- ? ash::UMA_STATUS_AREA_DISABLE_HIGH_CONTRAST |
- : ash::UMA_STATUS_AREA_ENABLE_HIGH_CONTRAST; |
+ ? UMA_STATUS_AREA_DISABLE_HIGH_CONTRAST |
+ : UMA_STATUS_AREA_ENABLE_HIGH_CONTRAST; |
delegate->ToggleHighContrast(); |
} else if (view == screen_magnifier_view_) { |
user_action = delegate->IsMagnifierEnabled() |
- ? ash::UMA_STATUS_AREA_DISABLE_MAGNIFIER |
- : ash::UMA_STATUS_AREA_ENABLE_MAGNIFIER; |
+ ? UMA_STATUS_AREA_DISABLE_MAGNIFIER |
+ : UMA_STATUS_AREA_ENABLE_MAGNIFIER; |
delegate->SetMagnifierEnabled(!delegate->IsMagnifierEnabled()); |
} else if (large_cursor_view_ && view == large_cursor_view_) { |
user_action = delegate->IsLargeCursorEnabled() |
- ? ash::UMA_STATUS_AREA_DISABLE_LARGE_CURSOR |
- : ash::UMA_STATUS_AREA_ENABLE_LARGE_CURSOR; |
+ ? UMA_STATUS_AREA_DISABLE_LARGE_CURSOR |
+ : UMA_STATUS_AREA_ENABLE_LARGE_CURSOR; |
delegate->SetLargeCursorEnabled(!delegate->IsLargeCursorEnabled()); |
} else if (autoclick_view_ && view == autoclick_view_) { |
user_action = delegate->IsAutoclickEnabled() |
- ? ash::UMA_STATUS_AREA_DISABLE_AUTO_CLICK |
- : ash::UMA_STATUS_AREA_ENABLE_AUTO_CLICK; |
+ ? UMA_STATUS_AREA_DISABLE_AUTO_CLICK |
+ : UMA_STATUS_AREA_ENABLE_AUTO_CLICK; |
delegate->SetAutoclickEnabled(!delegate->IsAutoclickEnabled()); |
} else if (virtual_keyboard_view_ && view == virtual_keyboard_view_) { |
user_action = delegate->IsVirtualKeyboardEnabled() |
- ? ash::UMA_STATUS_AREA_DISABLE_VIRTUAL_KEYBOARD |
- : ash::UMA_STATUS_AREA_ENABLE_VIRTUAL_KEYBOARD; |
+ ? UMA_STATUS_AREA_DISABLE_VIRTUAL_KEYBOARD |
+ : UMA_STATUS_AREA_ENABLE_VIRTUAL_KEYBOARD; |
delegate->SetVirtualKeyboardEnabled(!delegate->IsVirtualKeyboardEnabled()); |
} else if (caret_highlight_view_ && view == caret_highlight_view_) { |
user_action = delegate->IsCaretHighlightEnabled() |
- ? ash::UMA_STATUS_AREA_DISABLE_CARET_HIGHLIGHT |
- : ash::UMA_STATUS_AREA_ENABLE_CARET_HIGHLIGHT; |
+ ? UMA_STATUS_AREA_DISABLE_CARET_HIGHLIGHT |
+ : UMA_STATUS_AREA_ENABLE_CARET_HIGHLIGHT; |
delegate->SetCaretHighlightEnabled(!delegate->IsCaretHighlightEnabled()); |
} else if (mono_audio_view_ && view == mono_audio_view_) { |
user_action = delegate->IsMonoAudioEnabled() |
- ? ash::UMA_STATUS_AREA_DISABLE_MONO_AUDIO |
- : ash::UMA_STATUS_AREA_ENABLE_MONO_AUDIO; |
+ ? UMA_STATUS_AREA_DISABLE_MONO_AUDIO |
+ : UMA_STATUS_AREA_ENABLE_MONO_AUDIO; |
delegate->SetMonoAudioEnabled(!delegate->IsMonoAudioEnabled()); |
} else if (highlight_mouse_cursor_view_ && |
view == highlight_mouse_cursor_view_) { |
user_action = delegate->IsCursorHighlightEnabled() |
- ? ash::UMA_STATUS_AREA_DISABLE_HIGHLIGHT_MOUSE_CURSOR |
- : ash::UMA_STATUS_AREA_ENABLE_HIGHLIGHT_MOUSE_CURSOR; |
+ ? UMA_STATUS_AREA_DISABLE_HIGHLIGHT_MOUSE_CURSOR |
+ : UMA_STATUS_AREA_ENABLE_HIGHLIGHT_MOUSE_CURSOR; |
delegate->SetCursorHighlightEnabled(!delegate->IsCursorHighlightEnabled()); |
} else if (highlight_keyboard_focus_view_ && |
view == highlight_keyboard_focus_view_) { |
user_action = delegate->IsFocusHighlightEnabled() |
- ? ash::UMA_STATUS_AREA_DISABLE_HIGHLIGHT_KEYBOARD_FOCUS |
- : ash::UMA_STATUS_AREA_ENABLE_HIGHLIGHT_KEYBOARD_FOCUS; |
+ ? UMA_STATUS_AREA_DISABLE_HIGHLIGHT_KEYBOARD_FOCUS |
+ : UMA_STATUS_AREA_ENABLE_HIGHLIGHT_KEYBOARD_FOCUS; |
delegate->SetFocusHighlightEnabled(!delegate->IsFocusHighlightEnabled()); |
} else if (sticky_keys_view_ && view == sticky_keys_view_) { |
user_action = delegate->IsStickyKeysEnabled() |
- ? ash::UMA_STATUS_AREA_DISABLE_STICKY_KEYS |
- : ash::UMA_STATUS_AREA_ENABLE_STICKY_KEYS; |
+ ? UMA_STATUS_AREA_DISABLE_STICKY_KEYS |
+ : UMA_STATUS_AREA_ENABLE_STICKY_KEYS; |
delegate->SetStickyKeysEnabled(!delegate->IsStickyKeysEnabled()); |
} else if (tap_dragging_view_ && view == tap_dragging_view_) { |
user_action = delegate->IsTapDraggingEnabled() |
- ? ash::UMA_STATUS_AREA_DISABLE_TAP_DRAGGING |
- : ash::UMA_STATUS_AREA_ENABLE_TAP_DRAGGING; |
+ ? UMA_STATUS_AREA_DISABLE_TAP_DRAGGING |
+ : UMA_STATUS_AREA_ENABLE_TAP_DRAGGING; |
delegate->SetTapDraggingEnabled(!delegate->IsTapDraggingEnabled()); |
} else { |
return; |
@@ -416,9 +345,7 @@ TrayAccessibility::TrayAccessibility(SystemTray* system_tray) |
kSystemTrayAccessibilityIcon, |
UMA_ACCESSIBILITY), |
default_(NULL), |
- detailed_popup_(NULL), |
detailed_menu_(NULL), |
- request_popup_view_state_(A11Y_NONE), |
tray_icon_visible_(false), |
login_(GetCurrentLoginStatus()), |
previous_accessibility_state_(GetAccessibilityState()), |
@@ -469,21 +396,12 @@ views::View* TrayAccessibility::CreateDefaultView(LoginStatus status) { |
} |
views::View* TrayAccessibility::CreateDetailedView(LoginStatus status) { |
- CHECK(detailed_popup_ == NULL); |
CHECK(detailed_menu_ == NULL); |
- if (request_popup_view_state_) { |
- detailed_popup_ = |
- new tray::AccessibilityPopupView(request_popup_view_state_); |
- detailed_popup_->Init(); |
- request_popup_view_state_ = A11Y_NONE; |
- return detailed_popup_; |
- } else { |
- ShellPort::Get()->RecordUserMetricsAction( |
- ash::UMA_STATUS_AREA_DETAILED_ACCESSABILITY); |
- detailed_menu_ = CreateDetailedMenu(); |
- return detailed_menu_; |
- } |
+ ShellPort::Get()->RecordUserMetricsAction( |
+ UMA_STATUS_AREA_DETAILED_ACCESSIBILITY); |
+ detailed_menu_ = CreateDetailedMenu(); |
+ return detailed_menu_; |
} |
void TrayAccessibility::DestroyDefaultView() { |
@@ -491,7 +409,6 @@ void TrayAccessibility::DestroyDefaultView() { |
} |
void TrayAccessibility::DestroyDetailedView() { |
- detailed_popup_ = NULL; |
detailed_menu_ = NULL; |
} |
@@ -516,23 +433,55 @@ void TrayAccessibility::OnAccessibilityModeChanged( |
// return early if there's no change in the state that we keep track of. |
if (accessibility_state == previous_accessibility_state_) |
return; |
+ |
+ if (detailed_menu_) |
+ detailed_menu_->GetWidget()->Close(); |
+ |
+ message_center::MessageCenter* message_center = |
+ message_center::MessageCenter::Get(); |
+ message_center->RemoveNotification(kNotificationId, false /* by_user */); |
+ |
// Contains bits for spoken feedback and braille display connected currently |
// being enabled. |
uint32_t being_enabled = |
(accessibility_state & ~previous_accessibility_state_) & |
(A11Y_SPOKEN_FEEDBACK | A11Y_BRAILLE_DISPLAY_CONNECTED); |
- if ((notify == A11Y_NOTIFICATION_SHOW) && being_enabled != A11Y_NONE) { |
- // Shows popup if |notify| is true and the spoken feedback is being enabled. |
- request_popup_view_state_ = being_enabled; |
- ShowDetailedView(kTrayPopupAutoCloseDelayForTextInSeconds, false); |
+ previous_accessibility_state_ = accessibility_state; |
+ |
+ // Shows notification if |notify| is true and the spoken feedback is being |
+ // enabled or if a braille display is connected. |
+ if (notify != A11Y_NOTIFICATION_SHOW || being_enabled == A11Y_NONE) |
+ return; |
+ |
+ base::string16 text; |
+ base::string16 title; |
+ if (being_enabled & A11Y_BRAILLE_DISPLAY_CONNECTED && |
+ being_enabled & A11Y_SPOKEN_FEEDBACK) { |
+ text = |
+ l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED); |
+ title = l10n_util::GetStringUTF16( |
+ IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_BRAILLE_ENABLED_TITLE); |
+ } else if (being_enabled & A11Y_BRAILLE_DISPLAY_CONNECTED) { |
+ text = l10n_util::GetStringUTF16( |
+ IDS_ASH_STATUS_TRAY_BRAILLE_DISPLAY_CONNECTED); |
} else { |
- if (detailed_popup_) |
- detailed_popup_->GetWidget()->Close(); |
- if (detailed_menu_) |
- detailed_menu_->GetWidget()->Close(); |
+ title = l10n_util::GetStringUTF16( |
+ IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_TITLE); |
+ text = |
+ l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED); |
} |
- previous_accessibility_state_ = accessibility_state; |
+ std::unique_ptr<message_center::Notification> notification = |
+ base::MakeUnique<message_center::Notification>( |
+ message_center::NOTIFICATION_TYPE_SIMPLE, kNotificationId, title, |
+ text, |
+ gfx::Image(gfx::CreateVectorIcon(GetNotificationIcon(being_enabled), |
+ kMenuIconSize, kMenuIconColor)), |
+ base::string16(), GURL(), |
+ message_center::NotifierId(message_center::NotifierId::APPLICATION, |
+ system_notifier::kNotifierAccessibility), |
+ message_center::RichNotificationData(), nullptr); |
+ message_center->AddNotification(std::move(notification)); |
} |
} // namespace ash |