Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/system/tray_accessibility.h" | 5 #include "ash/system/tray_accessibility.h" |
| 6 | 6 |
| 7 #include "ash/accessibility_delegate.h" | 7 #include "ash/accessibility_delegate.h" |
| 8 #include "ash/metrics/user_metrics_recorder.h" | 8 #include "ash/metrics/user_metrics_recorder.h" |
| 9 #include "ash/shell.h" | 9 #include "ash/shell.h" |
| 10 #include "ash/system/tray/hover_highlight_view.h" | 10 #include "ash/system/tray/hover_highlight_view.h" |
| 11 #include "ash/system/tray/system_tray.h" | 11 #include "ash/system/tray/system_tray.h" |
| 12 #include "ash/system/tray/system_tray_delegate.h" | 12 #include "ash/system/tray/system_tray_delegate.h" |
| 13 #include "ash/system/tray/system_tray_notifier.h" | 13 #include "ash/system/tray/system_tray_notifier.h" |
| 14 #include "ash/system/tray/tray_constants.h" | 14 #include "ash/system/tray/tray_constants.h" |
| 15 #include "ash/system/tray/tray_details_view.h" | 15 #include "ash/system/tray/tray_details_view.h" |
| 16 #include "ash/system/tray/tray_item_more.h" | 16 #include "ash/system/tray/tray_item_more.h" |
| 17 #include "ash/system/tray/tray_notification_view.h" | |
| 18 #include "ash/system/tray/tray_popup_label_button.h" | 17 #include "ash/system/tray/tray_popup_label_button.h" |
| 18 #include "base/strings/utf_string_conversions.h" | |
| 19 #include "grit/ash_resources.h" | 19 #include "grit/ash_resources.h" |
| 20 #include "grit/ash_strings.h" | 20 #include "grit/ash_strings.h" |
| 21 #include "ui/base/l10n/l10n_util.h" | 21 #include "ui/base/l10n/l10n_util.h" |
| 22 #include "ui/base/resource/resource_bundle.h" | 22 #include "ui/base/resource/resource_bundle.h" |
| 23 #include "ui/gfx/image/image.h" | 23 #include "ui/gfx/image/image.h" |
| 24 #include "ui/views/controls/image_view.h" | 24 #include "ui/views/controls/image_view.h" |
| 25 #include "ui/views/controls/label.h" | 25 #include "ui/views/controls/label.h" |
| 26 #include "ui/views/layout/box_layout.h" | 26 #include "ui/views/layout/box_layout.h" |
| 27 #include "ui/views/widget/widget.h" | 27 #include "ui/views/widget/widget.h" |
| 28 | 28 |
| 29 namespace ash { | 29 namespace ash { |
| 30 namespace internal { | 30 namespace internal { |
| 31 | 31 |
| 32 namespace { | 32 namespace { |
| 33 | 33 |
| 34 enum AccessibilityState { | 34 enum AccessibilityState { |
| 35 A11Y_NONE = 0, | 35 A11Y_NONE = 0, |
| 36 A11Y_SPOKEN_FEEDBACK = 1 << 0, | 36 A11Y_SPOKEN_FEEDBACK = 1 << 0, |
| 37 A11Y_HIGH_CONTRAST = 1 << 1, | 37 A11Y_HIGH_CONTRAST = 1 << 1, |
| 38 A11Y_SCREEN_MAGNIFIER = 1 << 2, | 38 A11Y_SCREEN_MAGNIFIER = 1 << 2, |
| 39 A11Y_LARGE_CURSOR = 1 << 3, | 39 A11Y_LARGE_CURSOR = 1 << 3, |
| 40 A11Y_AUTOCLICK = 1 << 4, | 40 A11Y_AUTOCLICK = 1 << 4, |
| 41 A11Y_VIRTUAL_KEYBOARD = 1 << 5, | 41 A11Y_VIRTUAL_KEYBOARD = 1 << 5, |
| 42 A11Y_BRAILLE_DISPLAY_CONNECTED = 1 << 6, | |
| 42 }; | 43 }; |
| 43 | 44 |
| 44 uint32 GetAccessibilityState() { | 45 uint32 GetAccessibilityState() { |
| 45 AccessibilityDelegate* delegate = | 46 AccessibilityDelegate* delegate = |
| 46 Shell::GetInstance()->accessibility_delegate(); | 47 Shell::GetInstance()->accessibility_delegate(); |
| 47 uint32 state = A11Y_NONE; | 48 uint32 state = A11Y_NONE; |
| 48 if (delegate->IsSpokenFeedbackEnabled()) | 49 if (delegate->IsSpokenFeedbackEnabled()) |
| 49 state |= A11Y_SPOKEN_FEEDBACK; | 50 state |= A11Y_SPOKEN_FEEDBACK; |
| 50 if (delegate->IsHighContrastEnabled()) | 51 if (delegate->IsHighContrastEnabled()) |
| 51 state |= A11Y_HIGH_CONTRAST; | 52 state |= A11Y_HIGH_CONTRAST; |
| 52 if (delegate->IsMagnifierEnabled()) | 53 if (delegate->IsMagnifierEnabled()) |
| 53 state |= A11Y_SCREEN_MAGNIFIER; | 54 state |= A11Y_SCREEN_MAGNIFIER; |
| 54 if (delegate->IsLargeCursorEnabled()) | 55 if (delegate->IsLargeCursorEnabled()) |
| 55 state |= A11Y_LARGE_CURSOR; | 56 state |= A11Y_LARGE_CURSOR; |
| 56 if (delegate->IsAutoclickEnabled()) | 57 if (delegate->IsAutoclickEnabled()) |
| 57 state |= A11Y_AUTOCLICK; | 58 state |= A11Y_AUTOCLICK; |
| 58 if (delegate->IsVirtualKeyboardEnabled()) | 59 if (delegate->IsVirtualKeyboardEnabled()) |
| 59 state |= A11Y_VIRTUAL_KEYBOARD; | 60 state |= A11Y_VIRTUAL_KEYBOARD; |
| 61 if (delegate->IsBrailleDisplayConnected()) | |
| 62 state |= A11Y_BRAILLE_DISPLAY_CONNECTED; | |
| 60 return state; | 63 return state; |
| 61 } | 64 } |
| 62 | 65 |
| 63 user::LoginStatus GetCurrentLoginStatus() { | 66 user::LoginStatus GetCurrentLoginStatus() { |
| 64 return Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus(); | 67 return Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus(); |
| 65 } | 68 } |
| 66 | 69 |
| 67 } // namespace | 70 } // namespace |
| 68 | 71 |
| 69 namespace tray { | 72 namespace tray { |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 81 SetAccessibleName(label); | 84 SetAccessibleName(label); |
| 82 } | 85 } |
| 83 | 86 |
| 84 virtual ~DefaultAccessibilityView() { | 87 virtual ~DefaultAccessibilityView() { |
| 85 } | 88 } |
| 86 | 89 |
| 87 private: | 90 private: |
| 88 DISALLOW_COPY_AND_ASSIGN(DefaultAccessibilityView); | 91 DISALLOW_COPY_AND_ASSIGN(DefaultAccessibilityView); |
| 89 }; | 92 }; |
| 90 | 93 |
| 91 class AccessibilityPopupView : public TrayNotificationView { | 94 //////////////////////////////////////////////////////////////////////////////// |
| 92 public: | 95 // ash::internal::tray::AccessibilityPopupView |
| 93 AccessibilityPopupView(SystemTrayItem* owner) | 96 |
| 94 : TrayNotificationView(owner, IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK) { | 97 AccessibilityPopupView::AccessibilityPopupView(SystemTrayItem* owner, |
| 95 InitView(GetLabel()); | 98 uint32 enabled_state_bits) |
| 99 : TrayNotificationView(owner, IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK), | |
| 100 label_(CreateLabel(enabled_state_bits)) { | |
| 101 InitView(label_); | |
| 102 } | |
| 103 | |
| 104 views::Label* AccessibilityPopupView::CreateLabel(uint32 enabled_state_bits) { | |
| 105 DCHECK((enabled_state_bits & | |
| 106 (A11Y_SPOKEN_FEEDBACK | A11Y_BRAILLE_DISPLAY_CONNECTED)) != 0); | |
| 107 base::string16 text; | |
| 108 if (enabled_state_bits & A11Y_BRAILLE_DISPLAY_CONNECTED) { | |
| 109 text.append(l10n_util::GetStringUTF16( | |
| 110 IDS_ASH_STATUS_TRAY_BRAILLE_DISPLAY_CONNECTED_BUBBLE)); | |
| 96 } | 111 } |
| 97 | 112 if (enabled_state_bits & A11Y_SPOKEN_FEEDBACK) { |
| 98 private: | 113 if (!text.empty()) |
| 99 views::Label* GetLabel() { | 114 text.append(base::ASCIIToUTF16(" ")); |
| 100 views::Label* label = new views::Label( | 115 text.append(l10n_util::GetStringUTF16( |
| 101 l10n_util::GetStringUTF16( | 116 IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_BUBBLE)); |
| 102 IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_BUBBLE)); | |
| 103 label->SetMultiLine(true); | |
| 104 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 105 return label; | |
| 106 } | 117 } |
| 107 | 118 LOG(ERROR) << "Popping up " << text; // TODO: remove. |
|
dmazzoni
2014/03/26 19:02:46
Reminder to remove this
| |
| 108 DISALLOW_COPY_AND_ASSIGN(AccessibilityPopupView); | 119 views::Label* label = new views::Label(text); |
| 109 }; | 120 label->SetMultiLine(true); |
| 121 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 122 return label; | |
| 123 } | |
| 110 | 124 |
| 111 //////////////////////////////////////////////////////////////////////////////// | 125 //////////////////////////////////////////////////////////////////////////////// |
| 112 // ash::internal::tray::AccessibilityDetailedView | 126 // ash::internal::tray::AccessibilityDetailedView |
| 113 | 127 |
| 114 AccessibilityDetailedView::AccessibilityDetailedView( | 128 AccessibilityDetailedView::AccessibilityDetailedView( |
| 115 SystemTrayItem* owner, user::LoginStatus login) : | 129 SystemTrayItem* owner, user::LoginStatus login) : |
| 116 TrayDetailsView(owner), | 130 TrayDetailsView(owner), |
| 117 spoken_feedback_view_(NULL), | 131 spoken_feedback_view_(NULL), |
| 118 high_contrast_view_(NULL), | 132 high_contrast_view_(NULL), |
| 119 screen_magnifier_view_(NULL), | 133 screen_magnifier_view_(NULL), |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 295 } // namespace tray | 309 } // namespace tray |
| 296 | 310 |
| 297 //////////////////////////////////////////////////////////////////////////////// | 311 //////////////////////////////////////////////////////////////////////////////// |
| 298 // ash::internal::TrayAccessibility | 312 // ash::internal::TrayAccessibility |
| 299 | 313 |
| 300 TrayAccessibility::TrayAccessibility(SystemTray* system_tray) | 314 TrayAccessibility::TrayAccessibility(SystemTray* system_tray) |
| 301 : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_ACCESSIBILITY), | 315 : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_ACCESSIBILITY), |
| 302 default_(NULL), | 316 default_(NULL), |
| 303 detailed_popup_(NULL), | 317 detailed_popup_(NULL), |
| 304 detailed_menu_(NULL), | 318 detailed_menu_(NULL), |
| 305 request_popup_view_(false), | 319 request_popup_view_state_(A11Y_NONE), |
| 306 tray_icon_visible_(false), | 320 tray_icon_visible_(false), |
| 307 login_(GetCurrentLoginStatus()), | 321 login_(GetCurrentLoginStatus()), |
| 308 previous_accessibility_state_(GetAccessibilityState()), | 322 previous_accessibility_state_(GetAccessibilityState()), |
| 309 show_a11y_menu_on_lock_screen_(true) { | 323 show_a11y_menu_on_lock_screen_(true) { |
| 310 DCHECK(Shell::GetInstance()->delegate()); | 324 DCHECK(Shell::GetInstance()->delegate()); |
| 311 DCHECK(system_tray); | 325 DCHECK(system_tray); |
| 312 Shell::GetInstance()->system_tray_notifier()->AddAccessibilityObserver(this); | 326 Shell::GetInstance()->system_tray_notifier()->AddAccessibilityObserver(this); |
| 313 } | 327 } |
| 314 | 328 |
| 315 TrayAccessibility::~TrayAccessibility() { | 329 TrayAccessibility::~TrayAccessibility() { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 352 CHECK(default_ == NULL); | 366 CHECK(default_ == NULL); |
| 353 default_ = new tray::DefaultAccessibilityView(this); | 367 default_ = new tray::DefaultAccessibilityView(this); |
| 354 | 368 |
| 355 return default_; | 369 return default_; |
| 356 } | 370 } |
| 357 | 371 |
| 358 views::View* TrayAccessibility::CreateDetailedView(user::LoginStatus status) { | 372 views::View* TrayAccessibility::CreateDetailedView(user::LoginStatus status) { |
| 359 CHECK(detailed_popup_ == NULL); | 373 CHECK(detailed_popup_ == NULL); |
| 360 CHECK(detailed_menu_ == NULL); | 374 CHECK(detailed_menu_ == NULL); |
| 361 | 375 |
| 362 if (request_popup_view_) { | 376 if (request_popup_view_state_) { |
| 363 detailed_popup_ = new tray::AccessibilityPopupView(this); | 377 detailed_popup_ = |
| 364 request_popup_view_ = false; | 378 new tray::AccessibilityPopupView(this, request_popup_view_state_); |
| 379 request_popup_view_state_ = A11Y_NONE; | |
| 365 return detailed_popup_; | 380 return detailed_popup_; |
| 366 } else { | 381 } else { |
| 367 Shell::GetInstance()->metrics()->RecordUserMetricsAction( | 382 Shell::GetInstance()->metrics()->RecordUserMetricsAction( |
| 368 ash::UMA_STATUS_AREA_DETAILED_ACCESSABILITY); | 383 ash::UMA_STATUS_AREA_DETAILED_ACCESSABILITY); |
| 369 detailed_menu_ = CreateDetailedMenu(); | 384 detailed_menu_ = CreateDetailedMenu(); |
| 370 return detailed_menu_; | 385 return detailed_menu_; |
| 371 } | 386 } |
| 372 } | 387 } |
| 373 | 388 |
| 374 void TrayAccessibility::DestroyDefaultView() { | 389 void TrayAccessibility::DestroyDefaultView() { |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 387 | 402 |
| 388 login_ = status; | 403 login_ = status; |
| 389 SetTrayIconVisible(GetInitialVisibility()); | 404 SetTrayIconVisible(GetInitialVisibility()); |
| 390 } | 405 } |
| 391 | 406 |
| 392 void TrayAccessibility::OnAccessibilityModeChanged( | 407 void TrayAccessibility::OnAccessibilityModeChanged( |
| 393 AccessibilityNotificationVisibility notify) { | 408 AccessibilityNotificationVisibility notify) { |
| 394 SetTrayIconVisible(GetInitialVisibility()); | 409 SetTrayIconVisible(GetInitialVisibility()); |
| 395 | 410 |
| 396 uint32 accessibility_state = GetAccessibilityState(); | 411 uint32 accessibility_state = GetAccessibilityState(); |
| 397 if ((notify == ash::A11Y_NOTIFICATION_SHOW) && | 412 // We'll get an extra notification if a braille display is connected when |
| 398 !(previous_accessibility_state_ & A11Y_SPOKEN_FEEDBACK) && | 413 // spoken feedback wasn't already enabled. This is because the braille |
| 399 (accessibility_state & A11Y_SPOKEN_FEEDBACK)) { | 414 // connection state is already updated when spoken feedback is enabled so |
| 415 // that the notifications can be consolidated into one. Therefore, we | |
| 416 // return early if there's no change in the state that we keep track of. | |
| 417 if (accessibility_state == previous_accessibility_state_) | |
| 418 return; | |
| 419 // Contains bits for spoken feedback and braille display connected currently | |
| 420 // being enabled. | |
| 421 uint32 being_enabled = | |
| 422 (accessibility_state & ~previous_accessibility_state_) & | |
| 423 (A11Y_SPOKEN_FEEDBACK | A11Y_BRAILLE_DISPLAY_CONNECTED); | |
| 424 if ((notify == ash::A11Y_NOTIFICATION_SHOW) && being_enabled != A11Y_NONE) { | |
| 400 // Shows popup if |notify| is true and the spoken feedback is being enabled. | 425 // Shows popup if |notify| is true and the spoken feedback is being enabled. |
| 401 request_popup_view_ = true; | 426 request_popup_view_state_ = being_enabled; |
| 402 PopupDetailedView(kTrayPopupAutoCloseDelayForTextInSeconds, false); | 427 PopupDetailedView(kTrayPopupAutoCloseDelayForTextInSeconds, false); |
| 403 } else { | 428 } else { |
| 429 LOG(ERROR) << "Closing"; | |
|
dmazzoni
2014/03/26 19:02:46
Remove
| |
| 404 if (detailed_popup_) | 430 if (detailed_popup_) |
| 405 detailed_popup_->GetWidget()->Close(); | 431 detailed_popup_->GetWidget()->Close(); |
| 406 if (detailed_menu_) | 432 if (detailed_menu_) |
| 407 detailed_menu_->GetWidget()->Close(); | 433 detailed_menu_->GetWidget()->Close(); |
| 408 } | 434 } |
| 409 | 435 |
| 410 previous_accessibility_state_ = accessibility_state; | 436 previous_accessibility_state_ = accessibility_state; |
| 411 } | 437 } |
| 412 | 438 |
| 413 } // namespace internal | 439 } // namespace internal |
| 414 } // namespace ash | 440 } // namespace ash |
| OLD | NEW |