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)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/accessibility_delegate.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/metrics/user_metrics_recorder.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ash/session/session_state_delegate.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/hover_highlight_view.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_details_view.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_item_more.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button.h"
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/strings/utf_string_conversions.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum AccessibilityState {
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  A11Y_NONE = 0,
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  A11Y_SPOKEN_FEEDBACK = 1 << 0,
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  A11Y_HIGH_CONTRAST = 1 << 1,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  A11Y_SCREEN_MAGNIFIER = 1 << 2,
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  A11Y_LARGE_CURSOR = 1 << 3,
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  A11Y_AUTOCLICK = 1 << 4,
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  A11Y_VIRTUAL_KEYBOARD = 1 << 5,
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  A11Y_BRAILLE_DISPLAY_CONNECTED = 1 << 6,
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32 GetAccessibilityState() {
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AccessibilityDelegate* delegate =
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      Shell::GetInstance()->accessibility_delegate();
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 state = A11Y_NONE;
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (delegate->IsSpokenFeedbackEnabled())
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state |= A11Y_SPOKEN_FEEDBACK;
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (delegate->IsHighContrastEnabled())
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state |= A11Y_HIGH_CONTRAST;
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (delegate->IsMagnifierEnabled())
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state |= A11Y_SCREEN_MAGNIFIER;
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (delegate->IsLargeCursorEnabled())
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    state |= A11Y_LARGE_CURSOR;
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (delegate->IsAutoclickEnabled())
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    state |= A11Y_AUTOCLICK;
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (delegate->IsVirtualKeyboardEnabled())
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    state |= A11Y_VIRTUAL_KEYBOARD;
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (delegate->IsBrailleDisplayConnected())
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    state |= A11Y_BRAILLE_DISPLAY_CONNECTED;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return state;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)user::LoginStatus GetCurrentLoginStatus() {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus();
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace tray {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DefaultAccessibilityView : public TrayItemMore {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit DefaultAccessibilityView(SystemTrayItem* owner)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : TrayItemMore(owner, true) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK).
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ToImageSkia());
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 label = bundle.GetLocalizedString(
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_ACCESSIBILITY);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetLabel(label);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetAccessibleName(label);
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    set_id(test::kAccessibilityTrayItemViewId);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DefaultAccessibilityView() {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DefaultAccessibilityView);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch////////////////////////////////////////////////////////////////////////////////
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// ash::tray::AccessibilityPopupView
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochAccessibilityPopupView::AccessibilityPopupView(SystemTrayItem* owner,
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                               uint32 enabled_state_bits)
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    : TrayNotificationView(owner, IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK),
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      label_(CreateLabel(enabled_state_bits)) {
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  InitView(label_);
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochviews::Label* AccessibilityPopupView::CreateLabel(uint32 enabled_state_bits) {
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK((enabled_state_bits &
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          (A11Y_SPOKEN_FEEDBACK | A11Y_BRAILLE_DISPLAY_CONNECTED)) != 0);
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::string16 text;
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (enabled_state_bits & A11Y_BRAILLE_DISPLAY_CONNECTED) {
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    text.append(l10n_util::GetStringUTF16(
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        IDS_ASH_STATUS_TRAY_BRAILLE_DISPLAY_CONNECTED_BUBBLE));
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (enabled_state_bits & A11Y_SPOKEN_FEEDBACK) {
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (!text.empty())
114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      text.append(base::ASCIIToUTF16(" "));
115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    text.append(l10n_util::GetStringUTF16(
116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_BUBBLE));
117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  views::Label* label = new views::Label(text);
119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  label->SetMultiLine(true);
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return label;
122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// ash::tray::AccessibilityDetailedView
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AccessibilityDetailedView::AccessibilityDetailedView(
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SystemTrayItem* owner, user::LoginStatus login) :
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TrayDetailsView(owner),
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        spoken_feedback_view_(NULL),
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        high_contrast_view_(NULL),
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        screen_magnifier_view_(NULL),
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        large_cursor_view_(NULL),
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        help_view_(NULL),
135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        settings_view_(NULL),
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        autoclick_view_(NULL),
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        virtual_keyboard_view_(NULL),
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        spoken_feedback_enabled_(false),
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        high_contrast_enabled_(false),
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        screen_magnifier_enabled_(false),
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        large_cursor_enabled_(false),
1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        autoclick_enabled_(false),
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        virtual_keyboard_enabled_(false),
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        login_(login) {
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Reset();
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendAccessibilityList();
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendHelpEntries();
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSpecialRow(IDS_ASH_STATUS_TRAY_ACCESSIBILITY_TITLE, this);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::AppendAccessibilityList() {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateScrollableList();
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AccessibilityDelegate* delegate =
1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      Shell::GetInstance()->accessibility_delegate();
1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  spoken_feedback_enabled_ = delegate->IsSpokenFeedbackEnabled();
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  spoken_feedback_view_ = AddScrollListItem(
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bundle.GetLocalizedString(
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SPOKEN_FEEDBACK),
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      spoken_feedback_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      spoken_feedback_enabled_);
167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Large Cursor item is shown only in Login screen.
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (login_ == user::LOGGED_IN_NONE) {
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    large_cursor_enabled_ = delegate->IsLargeCursorEnabled();
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    large_cursor_view_ = AddScrollListItem(
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        bundle.GetLocalizedString(
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            IDS_ASH_STATUS_TRAY_ACCESSIBILITY_LARGE_CURSOR),
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        large_cursor_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        large_cursor_enabled_);
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  high_contrast_enabled_ = delegate->IsHighContrastEnabled();
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  high_contrast_view_ = AddScrollListItem(
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bundle.GetLocalizedString(
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_HIGH_CONTRAST_MODE),
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      high_contrast_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      high_contrast_enabled_);
1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  screen_magnifier_enabled_ = delegate->IsMagnifierEnabled();
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  screen_magnifier_view_ = AddScrollListItem(
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bundle.GetLocalizedString(
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SCREEN_MAGNIFIER),
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      screen_magnifier_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      screen_magnifier_enabled_);
1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Don't show autoclick option at login screen.
1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (login_ != user::LOGGED_IN_NONE) {
1931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    autoclick_enabled_ = delegate->IsAutoclickEnabled();
1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    autoclick_view_ = AddScrollListItem(
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        bundle.GetLocalizedString(
1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            IDS_ASH_STATUS_TRAY_ACCESSIBILITY_AUTOCLICK),
1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        autoclick_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
1981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        autoclick_enabled_);
1991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual_keyboard_enabled_ = delegate->IsVirtualKeyboardEnabled();
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual_keyboard_view_ =  AddScrollListItem(
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bundle.GetLocalizedString(
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_VIRTUAL_KEYBOARD),
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      virtual_keyboard_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      virtual_keyboard_enabled_);
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::AppendHelpEntries() {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Currently the help page requires a browser window.
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(yoshiki): show this even on login/lock screen. crbug.com/158286
2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool userAddingRunning = ash::Shell::GetInstance()
2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               ->session_state_delegate()
2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               ->IsInSecondaryLoginScreen();
2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ == user::LOGGED_IN_NONE ||
2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      login_ == user::LOGGED_IN_LOCKED || userAddingRunning)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* bottom_row = new View();
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::BoxLayout* layout = new
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::BoxLayout(views::BoxLayout::kHorizontal,
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       kTrayMenuBottomRowPadding,
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       kTrayMenuBottomRowPadding,
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       kTrayMenuBottomRowPaddingBetweenItems);
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  layout->SetDefaultFlex(1);
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bottom_row->SetLayoutManager(layout);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TrayPopupLabelButton* help = new TrayPopupLabelButton(
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this,
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bundle.GetLocalizedString(
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_LEARN_MORE));
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bottom_row->AddChildView(help);
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  help_view_ = help;
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  TrayPopupLabelButton* settings = new TrayPopupLabelButton(
239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      this,
240b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      bundle.GetLocalizedString(
241b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SETTINGS));
242b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bottom_row->AddChildView(settings);
243b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  settings_view_ = settings;
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(bottom_row);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)HoverHighlightView* AccessibilityDetailedView::AddScrollListItem(
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16& text,
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Font::FontStyle style,
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool checked) {
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HoverHighlightView* container = new HoverHighlightView(this);
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container->AddCheckableLabel(text, style, checked);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_content()->AddChildView(container);
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return container;
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::OnViewClicked(views::View* sender) {
2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AccessibilityDelegate* delegate =
2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      Shell::GetInstance()->accessibility_delegate();
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == footer()->content()) {
262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TransitionToDefaultView();
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == spoken_feedback_view_) {
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        delegate->IsSpokenFeedbackEnabled() ?
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ash::UMA_STATUS_AREA_DISABLE_SPOKEN_FEEDBACK :
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ash::UMA_STATUS_AREA_ENABLE_SPOKEN_FEEDBACK);
2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    delegate->ToggleSpokenFeedback(ash::A11Y_NOTIFICATION_NONE);
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == high_contrast_view_) {
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        delegate->IsHighContrastEnabled() ?
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ash::UMA_STATUS_AREA_DISABLE_HIGH_CONTRAST :
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ash::UMA_STATUS_AREA_ENABLE_HIGH_CONTRAST);
2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    delegate->ToggleHighContrast();
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == screen_magnifier_view_) {
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        delegate->IsMagnifierEnabled() ?
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ash::UMA_STATUS_AREA_DISABLE_MAGNIFIER :
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ash::UMA_STATUS_AREA_ENABLE_MAGNIFIER);
2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    delegate->SetMagnifierEnabled(!delegate->IsMagnifierEnabled());
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else if (large_cursor_view_ && sender == large_cursor_view_) {
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        delegate->IsLargeCursorEnabled() ?
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ash::UMA_STATUS_AREA_DISABLE_LARGE_CURSOR :
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ash::UMA_STATUS_AREA_ENABLE_LARGE_CURSOR);
2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    delegate->SetLargeCursorEnabled(!delegate->IsLargeCursorEnabled());
2871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } else if (autoclick_view_ && sender == autoclick_view_) {
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        delegate->IsAutoclickEnabled() ?
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ash::UMA_STATUS_AREA_DISABLE_AUTO_CLICK :
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ash::UMA_STATUS_AREA_ENABLE_AUTO_CLICK);
2921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    delegate->SetAutoclickEnabled(!delegate->IsAutoclickEnabled());
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else if (virtual_keyboard_view_ && sender == virtual_keyboard_view_) {
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        delegate->IsVirtualKeyboardEnabled() ?
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ash::UMA_STATUS_AREA_DISABLE_VIRTUAL_KEYBOARD :
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ash::UMA_STATUS_AREA_ENABLE_VIRTUAL_KEYBOARD);
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delegate->SetVirtualKeyboardEnabled(!delegate->IsVirtualKeyboardEnabled());
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::ButtonPressed(views::Button* sender,
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              const ui::Event& event) {
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SystemTrayDelegate* tray_delegate =
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->system_tray_delegate();
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == help_view_)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tray_delegate->ShowAccessibilityHelp();
308b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  else if (sender == settings_view_)
309b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    tray_delegate->ShowAccessibilitySettings();
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace tray
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
315c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// ash::TrayAccessibility
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayAccessibility::TrayAccessibility(SystemTray* system_tray)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_ACCESSIBILITY),
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_(NULL),
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_popup_(NULL),
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_menu_(NULL),
322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      request_popup_view_state_(A11Y_NONE),
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tray_icon_visible_(false),
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      login_(GetCurrentLoginStatus()),
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      previous_accessibility_state_(GetAccessibilityState()),
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_a11y_menu_on_lock_screen_(true) {
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(Shell::GetInstance()->delegate());
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(system_tray);
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->AddAccessibilityObserver(this);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayAccessibility::~TrayAccessibility() {
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RemoveAccessibilityObserver(this);
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayAccessibility::SetTrayIconVisible(bool visible) {
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (tray_view())
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tray_view()->SetVisible(visible);
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tray_icon_visible_ = visible;
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)tray::AccessibilityDetailedView* TrayAccessibility::CreateDetailedMenu() {
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new tray::AccessibilityDetailedView(this, login_);
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TrayAccessibility::GetInitialVisibility() {
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shows accessibility icon if any accessibility feature is enabled.
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Otherwise, doen't show it.
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetAccessibilityState() != A11Y_NONE;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayAccessibility::CreateDefaultView(user::LoginStatus status) {
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(default_ == NULL);
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shows accessibility menu if:
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // - on login screen (not logged in);
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // - "Enable accessibility menu" on chrome://settings is checked;
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // - or any of accessibility features is enabled
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Otherwise, not shows it.
3611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AccessibilityDelegate* delegate =
3621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      Shell::GetInstance()->accessibility_delegate();
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ != user::LOGGED_IN_NONE &&
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      !delegate->ShouldShowAccessibilityMenu() &&
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // On login screen, keeps the initial visibility of the menu.
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      (status != user::LOGGED_IN_LOCKED || !show_a11y_menu_on_lock_screen_))
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(default_ == NULL);
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  default_ = new tray::DefaultAccessibilityView(this);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayAccessibility::CreateDetailedView(user::LoginStatus status) {
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(detailed_popup_ == NULL);
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(detailed_menu_ == NULL);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
379effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (request_popup_view_state_) {
380effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    detailed_popup_ =
381effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        new tray::AccessibilityPopupView(this, request_popup_view_state_);
382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    request_popup_view_state_ = A11Y_NONE;
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return detailed_popup_;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Shell::GetInstance()->metrics()->RecordUserMetricsAction(
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ash::UMA_STATUS_AREA_DETAILED_ACCESSABILITY);
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detailed_menu_ = CreateDetailedMenu();
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return detailed_menu_;
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayAccessibility::DestroyDefaultView() {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = NULL;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayAccessibility::DestroyDetailedView() {
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  detailed_popup_ = NULL;
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  detailed_menu_ = NULL;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayAccessibility::UpdateAfterLoginStatusChange(user::LoginStatus status) {
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Stores the a11y feature status on just entering the lock screen.
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ != user::LOGGED_IN_LOCKED && status == user::LOGGED_IN_LOCKED)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_a11y_menu_on_lock_screen_ = (GetAccessibilityState() != A11Y_NONE);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  login_ = status;
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetTrayIconVisible(GetInitialVisibility());
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayAccessibility::OnAccessibilityModeChanged(
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AccessibilityNotificationVisibility notify) {
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetTrayIconVisible(GetInitialVisibility());
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 accessibility_state = GetAccessibilityState();
415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // We'll get an extra notification if a braille display is connected when
416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // spoken feedback wasn't already enabled.  This is because the braille
417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // connection state is already updated when spoken feedback is enabled so
418effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // that the notifications can be consolidated into one.  Therefore, we
419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // return early if there's no change in the state that we keep track of.
420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (accessibility_state == previous_accessibility_state_)
421effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
422effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Contains bits for spoken feedback and braille display connected currently
423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // being enabled.
424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  uint32 being_enabled =
425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      (accessibility_state & ~previous_accessibility_state_) &
426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      (A11Y_SPOKEN_FEEDBACK | A11Y_BRAILLE_DISPLAY_CONNECTED);
427effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if ((notify == ash::A11Y_NOTIFICATION_SHOW) && being_enabled != A11Y_NONE) {
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Shows popup if |notify| is true and the spoken feedback is being enabled.
429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    request_popup_view_state_ = being_enabled;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PopupDetailedView(kTrayPopupAutoCloseDelayForTextInSeconds, false);
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (detailed_popup_)
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_popup_->GetWidget()->Close();
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (detailed_menu_)
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_menu_->GetWidget()->Close();
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  previous_accessibility_state_ = accessibility_state;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
442