tray_accessibility.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.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)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum AccessibilityState {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  A11Y_NONE             = 0,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  A11Y_SPOKEN_FEEDBACK  = 1 << 0,
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  A11Y_HIGH_CONTRAST    = 1 << 1,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  A11Y_SCREEN_MAGNIFIER = 1 << 2,
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  A11Y_LARGE_CURSOR     = 1 << 3,
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  A11Y_AUTOCLICK        = 1 << 4,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32 GetAccessibilityState() {
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AccessibilityDelegate* delegate =
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      Shell::GetInstance()->accessibility_delegate();
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 state = A11Y_NONE;
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (delegate->IsSpokenFeedbackEnabled())
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state |= A11Y_SPOKEN_FEEDBACK;
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (delegate->IsHighContrastEnabled())
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state |= A11Y_HIGH_CONTRAST;
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (delegate->IsMagnifierEnabled())
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state |= A11Y_SCREEN_MAGNIFIER;
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (delegate->IsLargeCursorEnabled())
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    state |= A11Y_LARGE_CURSOR;
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (delegate->IsAutoclickEnabled())
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    state |= A11Y_AUTOCLICK;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return state;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)user::LoginStatus GetCurrentLoginStatus() {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus();
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace tray {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DefaultAccessibilityView : public TrayItemMore {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit DefaultAccessibilityView(SystemTrayItem* owner)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : TrayItemMore(owner, true) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK).
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ToImageSkia());
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 label = bundle.GetLocalizedString(
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_ACCESSIBILITY);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetLabel(label);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetAccessibleName(label);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DefaultAccessibilityView() {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DefaultAccessibilityView);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AccessibilityPopupView : public TrayNotificationView {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AccessibilityPopupView(SystemTrayItem* owner)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : TrayNotificationView(owner, IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK) {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InitView(GetLabel());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Label* GetLabel() {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Label* label = new views::Label(
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_BUBBLE));
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    label->SetMultiLine(true);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return label;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AccessibilityPopupView);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ash::internal::tray::AccessibilityDetailedView
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AccessibilityDetailedView::AccessibilityDetailedView(
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SystemTrayItem* owner, user::LoginStatus login) :
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TrayDetailsView(owner),
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        spoken_feedback_view_(NULL),
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        high_contrast_view_(NULL),
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        screen_magnifier_view_(NULL),
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        large_cursor_view_(NULL),
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        help_view_(NULL),
118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        settings_view_(NULL),
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        autoclick_view_(NULL),
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        spoken_feedback_enabled_(false),
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        high_contrast_enabled_(false),
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        screen_magnifier_enabled_(false),
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        large_cursor_enabled_(false),
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        autoclick_enabled_(false),
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        login_(login) {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Reset();
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendAccessibilityList();
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendHelpEntries();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSpecialRow(IDS_ASH_STATUS_TRAY_ACCESSIBILITY_TITLE, this);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::AppendAccessibilityList() {
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateScrollableList();
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AccessibilityDelegate* delegate =
1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      Shell::GetInstance()->accessibility_delegate();
1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  spoken_feedback_enabled_ = delegate->IsSpokenFeedbackEnabled();
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  spoken_feedback_view_ = AddScrollListItem(
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bundle.GetLocalizedString(
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SPOKEN_FEEDBACK),
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      spoken_feedback_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      spoken_feedback_enabled_);
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Large Cursor item is shown only in Login screen.
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (login_ == user::LOGGED_IN_NONE) {
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    large_cursor_enabled_ = delegate->IsLargeCursorEnabled();
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    large_cursor_view_ = AddScrollListItem(
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        bundle.GetLocalizedString(
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            IDS_ASH_STATUS_TRAY_ACCESSIBILITY_LARGE_CURSOR),
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        large_cursor_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        large_cursor_enabled_);
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  high_contrast_enabled_ = delegate->IsHighContrastEnabled();
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  high_contrast_view_ = AddScrollListItem(
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bundle.GetLocalizedString(
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_HIGH_CONTRAST_MODE),
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      high_contrast_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      high_contrast_enabled_);
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  screen_magnifier_enabled_ = delegate->IsMagnifierEnabled();
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  screen_magnifier_view_ = AddScrollListItem(
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bundle.GetLocalizedString(
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SCREEN_MAGNIFIER),
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      screen_magnifier_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      screen_magnifier_enabled_);
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Don't show autoclick option at login screen.
1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (login_ != user::LOGGED_IN_NONE) {
1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    autoclick_enabled_ = delegate->IsAutoclickEnabled();
1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    autoclick_view_ = AddScrollListItem(
1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        bundle.GetLocalizedString(
1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            IDS_ASH_STATUS_TRAY_ACCESSIBILITY_AUTOCLICK),
1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        autoclick_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        autoclick_enabled_);
1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::AppendHelpEntries() {
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Currently the help page requires a browser window.
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(yoshiki): show this even on login/lock screen. crbug.com/158286
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ == user::LOGGED_IN_NONE ||
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      login_ == user::LOGGED_IN_LOCKED)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* bottom_row = new View();
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::BoxLayout* layout = new
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::BoxLayout(views::BoxLayout::kHorizontal,
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       kTrayMenuBottomRowPadding,
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       kTrayMenuBottomRowPadding,
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       kTrayMenuBottomRowPaddingBetweenItems);
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->set_spread_blank_space(true);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bottom_row->SetLayoutManager(layout);
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TrayPopupLabelButton* help = new TrayPopupLabelButton(
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this,
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bundle.GetLocalizedString(
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_LEARN_MORE));
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bottom_row->AddChildView(help);
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  help_view_ = help;
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
208b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  TrayPopupLabelButton* settings = new TrayPopupLabelButton(
209b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      this,
210b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      bundle.GetLocalizedString(
211b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SETTINGS));
212b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bottom_row->AddChildView(settings);
213b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  settings_view_ = settings;
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(bottom_row);
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)HoverHighlightView* AccessibilityDetailedView::AddScrollListItem(
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::string16& text,
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Font::FontStyle style,
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool checked) {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HoverHighlightView* container = new HoverHighlightView(this);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container->AddCheckableLabel(text, style, checked);
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_content()->AddChildView(container);
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return container;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::OnViewClicked(views::View* sender) {
2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AccessibilityDelegate* delegate =
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      Shell::GetInstance()->accessibility_delegate();
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == footer()->content()) {
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TransitionToDefaultView();
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == spoken_feedback_view_) {
2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    delegate->ToggleSpokenFeedback(ash::A11Y_NOTIFICATION_NONE);
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == high_contrast_view_) {
2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    delegate->ToggleHighContrast();
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (sender == screen_magnifier_view_) {
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    delegate->SetMagnifierEnabled(!delegate->IsMagnifierEnabled());
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else if (large_cursor_view_ && sender == large_cursor_view_) {
2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    delegate->SetLargeCursorEnabled(!delegate->IsLargeCursorEnabled());
2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } else if (autoclick_view_ && sender == autoclick_view_) {
2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    delegate->SetAutoclickEnabled(!delegate->IsAutoclickEnabled());
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::ButtonPressed(views::Button* sender,
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              const ui::Event& event) {
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SystemTrayDelegate* tray_delegate =
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->system_tray_delegate();
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sender == help_view_)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tray_delegate->ShowAccessibilityHelp();
252b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  else if (sender == settings_view_)
253b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    tray_delegate->ShowAccessibilitySettings();
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace tray
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ash::internal::TrayAccessibility
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayAccessibility::TrayAccessibility(SystemTray* system_tray)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_ACCESSIBILITY),
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_(NULL),
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_popup_(NULL),
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_menu_(NULL),
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_popup_view_(false),
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tray_icon_visible_(false),
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      login_(GetCurrentLoginStatus()),
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      previous_accessibility_state_(GetAccessibilityState()),
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_a11y_menu_on_lock_screen_(true) {
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(Shell::GetInstance()->delegate());
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(system_tray);
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->AddAccessibilityObserver(this);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayAccessibility::~TrayAccessibility() {
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RemoveAccessibilityObserver(this);
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayAccessibility::SetTrayIconVisible(bool visible) {
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (tray_view())
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tray_view()->SetVisible(visible);
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tray_icon_visible_ = visible;
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)tray::AccessibilityDetailedView* TrayAccessibility::CreateDetailedMenu() {
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new tray::AccessibilityDetailedView(this, login_);
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TrayAccessibility::GetInitialVisibility() {
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shows accessibility icon if any accessibility feature is enabled.
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Otherwise, doen't show it.
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetAccessibilityState() != A11Y_NONE;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayAccessibility::CreateDefaultView(user::LoginStatus status) {
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(default_ == NULL);
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Shows accessibility menu if:
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // - on login screen (not logged in);
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // - "Enable accessibility menu" on chrome://settings is checked;
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // - or any of accessibility features is enabled
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Otherwise, not shows it.
3051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AccessibilityDelegate* delegate =
3061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      Shell::GetInstance()->accessibility_delegate();
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ != user::LOGGED_IN_NONE &&
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !delegate->ShouldAlwaysShowAccessibilityMenu() &&
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // On login screen, keeps the initial visivility of the menu.
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (status != user::LOGGED_IN_LOCKED || !show_a11y_menu_on_lock_screen_) &&
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetAccessibilityState() == A11Y_NONE)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(default_ == NULL);
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  default_ = new tray::DefaultAccessibilityView(this);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayAccessibility::CreateDetailedView(user::LoginStatus status) {
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(detailed_popup_ == NULL);
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(detailed_menu_ == NULL);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (request_popup_view_) {
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detailed_popup_ = new tray::AccessibilityPopupView(this);
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    request_popup_view_ = false;
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return detailed_popup_;
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detailed_menu_ = CreateDetailedMenu();
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return detailed_menu_;
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayAccessibility::DestroyDefaultView() {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = NULL;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayAccessibility::DestroyDetailedView() {
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  detailed_popup_ = NULL;
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  detailed_menu_ = NULL;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayAccessibility::UpdateAfterLoginStatusChange(user::LoginStatus status) {
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Stores the a11y feature status on just entering the lock screen.
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ != user::LOGGED_IN_LOCKED && status == user::LOGGED_IN_LOCKED)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_a11y_menu_on_lock_screen_ = (GetAccessibilityState() != A11Y_NONE);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  login_ = status;
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetTrayIconVisible(GetInitialVisibility());
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayAccessibility::OnAccessibilityModeChanged(
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AccessibilityNotificationVisibility notify) {
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetTrayIconVisible(GetInitialVisibility());
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 accessibility_state = GetAccessibilityState();
3571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if ((notify == ash::A11Y_NOTIFICATION_SHOW) &&
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !(previous_accessibility_state_ & A11Y_SPOKEN_FEEDBACK) &&
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (accessibility_state & A11Y_SPOKEN_FEEDBACK)) {
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Shows popup if |notify| is true and the spoken feedback is being enabled.
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    request_popup_view_ = true;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PopupDetailedView(kTrayPopupAutoCloseDelayForTextInSeconds, false);
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (detailed_popup_)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_popup_->GetWidget()->Close();
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (detailed_menu_)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      detailed_menu_->GetWidget()->Close();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  previous_accessibility_state_ = accessibility_state;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
375