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