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