tray_accessibility.cc revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
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"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ash/shell_delegate.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "ash/system/tray/hover_highlight_view.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h"
1158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "ash/system/tray/system_tray_delegate.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_details_view.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_more.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/system/tray/tray_notification_view.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (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"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (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 {
29b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)namespace internal {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kPaddingAroundBottomRow = 5;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum AccessibilityState {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  A11Y_NONE             = 0,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  A11Y_SPOKEN_FEEDBACK  = 1 << 0,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  A11Y_HIGH_CONTRAST    = 1 << 1,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  A11Y_SCREEN_MAGNIFIER = 1 << 2,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 GetAccessibilityState() {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellDelegate* shell_delegate = Shell::GetInstance()->delegate();
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 state = A11Y_NONE;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (shell_delegate->IsSpokenFeedbackEnabled())
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state |= A11Y_SPOKEN_FEEDBACK;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (shell_delegate->IsHighContrastEnabled())
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state |= A11Y_HIGH_CONTRAST;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (shell_delegate->IsMagnifierEnabled())
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state |= A11Y_SCREEN_MAGNIFIER;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return state;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)user::LoginStatus GetCurrentLoginStatus() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tray {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DefaultAccessibilityView : public TrayItemMore {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DefaultAccessibilityView(SystemTrayItem* owner)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TrayItemMore(owner, true) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK).
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ToImageSkia());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::string16 label = bundle.GetLocalizedString(
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_ASH_STATUS_TRAY_ACCESSIBILITY);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetLabel(label);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetAccessibleName(label);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DefaultAccessibilityView() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DefaultAccessibilityView);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AccessibilityPopupView : public TrayNotificationView {
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AccessibilityPopupView(SystemTrayItem* owner)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TrayNotificationView(owner, IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitView(GetLabel());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Label* GetLabel() {
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    views::Label* label = new views::Label(
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        l10n_util::GetStringUTF16(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_BUBBLE));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    label->SetMultiLine(true);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return label;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AccessibilityPopupView);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ash::internal::tray::AccessibilityDetailedView
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AccessibilityDetailedView::AccessibilityDetailedView(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SystemTrayItem* owner, user::LoginStatus login) :
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TrayDetailsView(owner),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        spoken_feedback_view_(NULL),
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        high_contrast_view_(NULL),
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        screen_magnifier_view_(NULL),
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        help_view_(NULL),
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings_view_(NULL),
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        spoken_feedback_enabled_(false),
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        high_contrast_enabled_(false),
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        screen_magnifier_enabled_(false),
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        login_(login) {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reset();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendAccessibilityList();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendHelpEntries();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateSpecialRow(IDS_ASH_STATUS_TRAY_ACCESSIBILITY_TITLE, this);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layout();
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccessibilityDetailedView::AppendAccessibilityList() {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateScrollableList();
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ShellDelegate* shell_delegate = Shell::GetInstance()->delegate();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  spoken_feedback_enabled_ = shell_delegate->IsSpokenFeedbackEnabled();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  spoken_feedback_view_ = AddScrollListItem(
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bundle.GetLocalizedString(
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SPOKEN_FEEDBACK),
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      spoken_feedback_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      spoken_feedback_enabled_);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  high_contrast_enabled_ = shell_delegate->IsHighContrastEnabled();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  high_contrast_view_ = AddScrollListItem(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bundle.GetLocalizedString(
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_HIGH_CONTRAST_MODE),
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      high_contrast_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      high_contrast_enabled_);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  screen_magnifier_enabled_ = shell_delegate->IsMagnifierEnabled();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  screen_magnifier_view_ = AddScrollListItem(
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bundle.GetLocalizedString(
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SCREEN_MAGNIFIER),
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      screen_magnifier_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      screen_magnifier_enabled_);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccessibilityDetailedView::AppendHelpEntries() {
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Currently the help page requires a browser window.
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(yoshiki): show this even on login/lock screen. crbug.com/158286
1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (login_ == user::LOGGED_IN_NONE ||
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      login_ == user::LOGGED_IN_LOCKED)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* bottom_row = new View();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::BoxLayout* layout = new
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      views::BoxLayout(views::BoxLayout::kHorizontal,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       kTrayMenuBottomRowPadding,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       kTrayMenuBottomRowPadding,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       kTrayMenuBottomRowPaddingBetweenItems);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->set_spread_blank_space(true);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bottom_row->SetLayoutManager(layout);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrayPopupLabelButton* help = new TrayPopupLabelButton(
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bundle.GetLocalizedString(
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_LEARN_MORE));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bottom_row->AddChildView(help);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  help_view_ = help;
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TrayPopupLabelButton* settings = new TrayPopupLabelButton(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bundle.GetLocalizedString(
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SETTINGS));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bottom_row->AddChildView(settings);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings_view_ = settings;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(bottom_row);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HoverHighlightView* AccessibilityDetailedView::AddScrollListItem(
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::string16& text,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Font::FontStyle style,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool checked) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HoverHighlightView* container = new HoverHighlightView(this);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container->AddCheckableLabel(text, style, checked);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scroll_content()->AddChildView(container);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return container;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccessibilityDetailedView::OnViewClicked(views::View* sender) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellDelegate* shell_delegate = Shell::GetInstance()->delegate();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sender == footer()->content()) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    owner()->system_tray()->ShowDefaultView(BUBBLE_USE_EXISTING);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (sender == spoken_feedback_view_) {
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    shell_delegate->ToggleSpokenFeedback(ash::A11Y_NOTIFICATION_NONE);
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else if (sender == high_contrast_view_) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shell_delegate->ToggleHighContrast();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (sender == screen_magnifier_view_) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shell_delegate->SetMagnifierEnabled(!shell_delegate->IsMagnifierEnabled());
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccessibilityDetailedView::ButtonPressed(views::Button* sender,
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              const ui::Event& event) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SystemTrayDelegate* tray_delegate =
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetInstance()->system_tray_delegate();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sender == help_view_)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tray_delegate->ShowAccessibilityHelp();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (sender == settings_view_)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tray_delegate->ShowAccessibilitySettings();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tray
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ash::internal::TrayAccessibility
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTrayAccessibility::TrayAccessibility(SystemTray* system_tray)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_ACCESSIBILITY),
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_(NULL),
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      detailed_popup_(NULL),
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      detailed_menu_(NULL),
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_popup_view_(false),
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tray_icon_visible_(false),
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      login_(GetCurrentLoginStatus()),
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      previous_accessibility_state_(GetAccessibilityState()),
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      show_a11y_menu_on_lock_screen_(true) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(Shell::GetInstance()->delegate());
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(system_tray);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->AddAccessibilityObserver(this);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayAccessibility::~TrayAccessibility() {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RemoveAccessibilityObserver(this);
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayAccessibility::SetTrayIconVisible(bool visible) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tray_view())
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tray_view()->SetVisible(visible);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray_icon_visible_ = visible;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)tray::AccessibilityDetailedView* TrayAccessibility::CreateDetailedMenu() {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new tray::AccessibilityDetailedView(this, login_);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TrayAccessibility::GetInitialVisibility() {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shows accessibility icon if any accessibility feature is enabled.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, doen't show it.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetAccessibilityState() != A11Y_NONE;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayAccessibility::CreateDefaultView(user::LoginStatus status) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(default_ == NULL);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  login_ = status;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shows accessibility menu if:
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - on login screen (not logged in);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - "Enable accessibility menu" on chrome://settings is checked;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - or any of accessibility features is enabled
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, not shows it.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellDelegate* delegate = Shell::GetInstance()->delegate();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (login_ != user::LOGGED_IN_NONE &&
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !delegate->ShouldAlwaysShowAccessibilityMenu() &&
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // On login screen, keeps the initial visivility of the menu.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (status != user::LOGGED_IN_LOCKED || !show_a11y_menu_on_lock_screen_) &&
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetAccessibilityState() == A11Y_NONE)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(default_ == NULL);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = new tray::DefaultAccessibilityView(this);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayAccessibility::CreateDetailedView(user::LoginStatus status) {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(detailed_popup_ == NULL);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(detailed_menu_ == NULL);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  login_ = status;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (request_popup_view_) {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    detailed_popup_ = new tray::AccessibilityPopupView(this);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request_popup_view_ = false;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return detailed_popup_;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    detailed_menu_ = CreateDetailedMenu();
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return detailed_menu_;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayAccessibility::DestroyDefaultView() {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = NULL;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayAccessibility::DestroyDetailedView() {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_popup_ = NULL;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_menu_ = NULL;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayAccessibility::UpdateAfterLoginStatusChange(user::LoginStatus status) {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stores the a11y feature status on just entering the lock screen.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (login_ != user::LOGGED_IN_LOCKED && status == user::LOGGED_IN_LOCKED)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show_a11y_menu_on_lock_screen_ = (GetAccessibilityState() != A11Y_NONE);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  login_ = status;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTrayIconVisible(GetInitialVisibility());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayAccessibility::OnAccessibilityModeChanged(
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AccessibilityNotificationVisibility notify) {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTrayIconVisible(GetInitialVisibility());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 accessibility_state = GetAccessibilityState();
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((notify == ash::A11Y_NOTIFICATION_SHOW)&&
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !(previous_accessibility_state_ & A11Y_SPOKEN_FEEDBACK) &&
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (accessibility_state & A11Y_SPOKEN_FEEDBACK)) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Shows popup if |notify| is true and the spoken feedback is being enabled.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request_popup_view_ = true;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PopupDetailedView(kTrayPopupAutoCloseDelayForTextInSeconds, false);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (detailed_popup_)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      detailed_popup_->GetWidget()->Close();
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (detailed_menu_)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      detailed_menu_->GetWidget()->Close();
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  previous_accessibility_state_ = accessibility_state;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)