tray_accessibility.cc revision 868fa2fe829687343ffae624259930155e16dbd8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray_accessibility.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_delegate.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/hover_highlight_view.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_details_view.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_item_more.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_notification_view.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kPaddingAroundBottomRow = 5;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum AccessibilityState {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  A11Y_NONE             = 0,
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  A11Y_SPOKEN_FEEDBACK  = 1 << 0,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  A11Y_HIGH_CONTRAST    = 1 << 1,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  A11Y_SCREEN_MAGNIFIER = 1 << 2,
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  A11Y_LARGE_CURSOR     = 1 << 3,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32 GetAccessibilityState() {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShellDelegate* shell_delegate = Shell::GetInstance()->delegate();
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 state = A11Y_NONE;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (shell_delegate->IsSpokenFeedbackEnabled())
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state |= A11Y_SPOKEN_FEEDBACK;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (shell_delegate->IsHighContrastEnabled())
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state |= A11Y_HIGH_CONTRAST;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (shell_delegate->IsMagnifierEnabled())
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state |= A11Y_SCREEN_MAGNIFIER;
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (shell_delegate->IsLargeCursorEnabled())
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    state |= A11Y_LARGE_CURSOR;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return state;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)user::LoginStatus GetCurrentLoginStatus() {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus();
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace tray {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DefaultAccessibilityView : public TrayItemMore {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit DefaultAccessibilityView(SystemTrayItem* owner)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : TrayItemMore(owner, true) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK).
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ToImageSkia());
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 label = bundle.GetLocalizedString(
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_ACCESSIBILITY);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetLabel(label);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetAccessibleName(label);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DefaultAccessibilityView() {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DefaultAccessibilityView);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AccessibilityPopupView : public TrayNotificationView {
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AccessibilityPopupView(SystemTrayItem* owner)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : TrayNotificationView(owner, IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InitView(GetLabel());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Label* GetLabel() {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Label* label = new views::Label(
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_BUBBLE));
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    label->SetMultiLine(true);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return label;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AccessibilityPopupView);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ash::internal::tray::AccessibilityDetailedView
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AccessibilityDetailedView::AccessibilityDetailedView(
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SystemTrayItem* owner, user::LoginStatus login) :
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TrayDetailsView(owner),
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        spoken_feedback_view_(NULL),
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        high_contrast_view_(NULL),
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        screen_magnifier_view_(NULL),
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        large_cursor_view_(NULL),
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        help_view_(NULL),
115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        settings_view_(NULL),
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        spoken_feedback_enabled_(false),
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        high_contrast_enabled_(false),
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        screen_magnifier_enabled_(false),
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        large_cursor_enabled_(false),
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        login_(login) {
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Reset();
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendAccessibilityList();
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendHelpEntries();
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSpecialRow(IDS_ASH_STATUS_TRAY_ACCESSIBILITY_TITLE, this);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::AppendAccessibilityList() {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateScrollableList();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShellDelegate* shell_delegate = Shell::GetInstance()->delegate();
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  spoken_feedback_enabled_ = shell_delegate->IsSpokenFeedbackEnabled();
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  spoken_feedback_view_ = AddScrollListItem(
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bundle.GetLocalizedString(
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SPOKEN_FEEDBACK),
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      spoken_feedback_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      spoken_feedback_enabled_);
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Large Cursor item is shown only in Login screen.
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (login_ == user::LOGGED_IN_NONE) {
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    large_cursor_enabled_ = shell_delegate->IsLargeCursorEnabled();
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    large_cursor_view_ = AddScrollListItem(
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        bundle.GetLocalizedString(
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            IDS_ASH_STATUS_TRAY_ACCESSIBILITY_LARGE_CURSOR),
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        large_cursor_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        large_cursor_enabled_);
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  high_contrast_enabled_ = shell_delegate->IsHighContrastEnabled();
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  high_contrast_view_ = AddScrollListItem(
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bundle.GetLocalizedString(
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_HIGH_CONTRAST_MODE),
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      high_contrast_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      high_contrast_enabled_);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  screen_magnifier_enabled_ = shell_delegate->IsMagnifierEnabled();
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  screen_magnifier_view_ = AddScrollListItem(
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bundle.GetLocalizedString(
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SCREEN_MAGNIFIER),
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      screen_magnifier_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      screen_magnifier_enabled_);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::AppendHelpEntries() {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Currently the help page requires a browser window.
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(yoshiki): show this even on login/lock screen. crbug.com/158286
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ == user::LOGGED_IN_NONE ||
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      login_ == user::LOGGED_IN_LOCKED)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* bottom_row = new View();
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::BoxLayout* layout = new
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::BoxLayout(views::BoxLayout::kHorizontal,
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       kTrayMenuBottomRowPadding,
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       kTrayMenuBottomRowPadding,
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       kTrayMenuBottomRowPaddingBetweenItems);
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->set_spread_blank_space(true);
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bottom_row->SetLayoutManager(layout);
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TrayPopupLabelButton* help = new TrayPopupLabelButton(
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this,
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bundle.GetLocalizedString(
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_LEARN_MORE));
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bottom_row->AddChildView(help);
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  help_view_ = help;
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  TrayPopupLabelButton* settings = new TrayPopupLabelButton(
193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      this,
194b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      bundle.GetLocalizedString(
195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SETTINGS));
196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bottom_row->AddChildView(settings);
197b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  settings_view_ = settings;
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(bottom_row);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)HoverHighlightView* AccessibilityDetailedView::AddScrollListItem(
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16& text,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Font::FontStyle style,
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool checked) {
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HoverHighlightView* container = new HoverHighlightView(this);
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container->AddCheckableLabel(text, style, checked);
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_content()->AddChildView(container);
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return container;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::OnViewClicked(views::View* sender) {
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShellDelegate* shell_delegate = Shell::GetInstance()->delegate();
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == footer()->content()) {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    owner()->system_tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == spoken_feedback_view_) {
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    shell_delegate->ToggleSpokenFeedback(ash::A11Y_NOTIFICATION_NONE);
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == high_contrast_view_) {
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    shell_delegate->ToggleHighContrast();
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == screen_magnifier_view_) {
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    shell_delegate->SetMagnifierEnabled(!shell_delegate->IsMagnifierEnabled());
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else if (large_cursor_view_ && sender == large_cursor_view_) {
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    shell_delegate->
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        SetLargeCursorEnabled(!shell_delegate->IsLargeCursorEnabled());
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::ButtonPressed(views::Button* sender,
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              const ui::Event& event) {
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SystemTrayDelegate* tray_delegate =
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->system_tray_delegate();
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == help_view_)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tray_delegate->ShowAccessibilityHelp();
234b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  else if (sender == settings_view_)
235b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    tray_delegate->ShowAccessibilitySettings();
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace tray
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ash::internal::TrayAccessibility
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayAccessibility::TrayAccessibility(SystemTray* system_tray)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_ACCESSIBILITY),
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_(NULL),
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_popup_(NULL),
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_menu_(NULL),
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_popup_view_(false),
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tray_icon_visible_(false),
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      login_(GetCurrentLoginStatus()),
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      previous_accessibility_state_(GetAccessibilityState()),
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_a11y_menu_on_lock_screen_(true) {
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(Shell::GetInstance()->delegate());
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(system_tray);
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->AddAccessibilityObserver(this);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayAccessibility::~TrayAccessibility() {
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RemoveAccessibilityObserver(this);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayAccessibility::SetTrayIconVisible(bool visible) {
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (tray_view())
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tray_view()->SetVisible(visible);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tray_icon_visible_ = visible;
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)tray::AccessibilityDetailedView* TrayAccessibility::CreateDetailedMenu() {
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new tray::AccessibilityDetailedView(this, login_);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TrayAccessibility::GetInitialVisibility() {
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shows accessibility icon if any accessibility feature is enabled.
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Otherwise, doen't show it.
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetAccessibilityState() != A11Y_NONE;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayAccessibility::CreateDefaultView(user::LoginStatus status) {
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(default_ == NULL);
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shows accessibility menu if:
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // - on login screen (not logged in);
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // - "Enable accessibility menu" on chrome://settings is checked;
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // - or any of accessibility features is enabled
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Otherwise, not shows it.
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShellDelegate* delegate = Shell::GetInstance()->delegate();
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ != user::LOGGED_IN_NONE &&
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !delegate->ShouldAlwaysShowAccessibilityMenu() &&
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // On login screen, keeps the initial visivility of the menu.
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (status != user::LOGGED_IN_LOCKED || !show_a11y_menu_on_lock_screen_) &&
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetAccessibilityState() == A11Y_NONE)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(default_ == NULL);
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  default_ = new tray::DefaultAccessibilityView(this);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayAccessibility::CreateDetailedView(user::LoginStatus status) {
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(detailed_popup_ == NULL);
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(detailed_menu_ == NULL);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (request_popup_view_) {
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detailed_popup_ = new tray::AccessibilityPopupView(this);
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    request_popup_view_ = false;
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return detailed_popup_;
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detailed_menu_ = CreateDetailedMenu();
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return detailed_menu_;
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayAccessibility::DestroyDefaultView() {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = NULL;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayAccessibility::DestroyDetailedView() {
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  detailed_popup_ = NULL;
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  detailed_menu_ = NULL;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayAccessibility::UpdateAfterLoginStatusChange(user::LoginStatus status) {
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Stores the a11y feature status on just entering the lock screen.
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ != user::LOGGED_IN_LOCKED && status == user::LOGGED_IN_LOCKED)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_a11y_menu_on_lock_screen_ = (GetAccessibilityState() != A11Y_NONE);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  login_ = status;
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetTrayIconVisible(GetInitialVisibility());
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayAccessibility::OnAccessibilityModeChanged(
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AccessibilityNotificationVisibility notify) {
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetTrayIconVisible(GetInitialVisibility());
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 accessibility_state = GetAccessibilityState();
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((notify == ash::A11Y_NOTIFICATION_SHOW)&&
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !(previous_accessibility_state_ & A11Y_SPOKEN_FEEDBACK) &&
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (accessibility_state & A11Y_SPOKEN_FEEDBACK)) {
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Shows popup if |notify| is true and the spoken feedback is being enabled.
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    request_popup_view_ = true;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PopupDetailedView(kTrayPopupAutoCloseDelayForTextInSeconds, false);
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (detailed_popup_)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_popup_->GetWidget()->Close();
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (detailed_menu_)
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_menu_->GetWidget()->Close();
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  previous_accessibility_state_ = accessibility_state;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
356