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)