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" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/metrics/user_metrics_recorder.h" 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ash/session/session_state_delegate.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/hover_highlight_view.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_details_view.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_item_more.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/system/tray/tray_popup_label_button.h" 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/strings/utf_string_conversions.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum AccessibilityState { 34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch A11Y_NONE = 0, 35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch A11Y_SPOKEN_FEEDBACK = 1 << 0, 36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch A11Y_HIGH_CONTRAST = 1 << 1, 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) A11Y_SCREEN_MAGNIFIER = 1 << 2, 38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch A11Y_LARGE_CURSOR = 1 << 3, 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch A11Y_AUTOCLICK = 1 << 4, 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) A11Y_VIRTUAL_KEYBOARD = 1 << 5, 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch A11Y_BRAILLE_DISPLAY_CONNECTED = 1 << 6, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32 GetAccessibilityState() { 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccessibilityDelegate* delegate = 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetInstance()->accessibility_delegate(); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 state = A11Y_NONE; 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (delegate->IsSpokenFeedbackEnabled()) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state |= A11Y_SPOKEN_FEEDBACK; 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (delegate->IsHighContrastEnabled()) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state |= A11Y_HIGH_CONTRAST; 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (delegate->IsMagnifierEnabled()) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state |= A11Y_SCREEN_MAGNIFIER; 541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (delegate->IsLargeCursorEnabled()) 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) state |= A11Y_LARGE_CURSOR; 561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (delegate->IsAutoclickEnabled()) 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) state |= A11Y_AUTOCLICK; 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate->IsVirtualKeyboardEnabled()) 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) state |= A11Y_VIRTUAL_KEYBOARD; 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (delegate->IsBrailleDisplayConnected()) 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch state |= A11Y_BRAILLE_DISPLAY_CONNECTED; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return state; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)user::LoginStatus GetCurrentLoginStatus() { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus(); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace tray { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DefaultAccessibilityView : public TrayItemMore { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit DefaultAccessibilityView(SystemTrayItem* owner) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : TrayItemMore(owner, true) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK). 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ToImageSkia()); 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 label = bundle.GetLocalizedString( 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_ACCESSIBILITY); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetLabel(label); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAccessibleName(label); 84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch set_id(test::kAccessibilityTrayItemViewId); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~DefaultAccessibilityView() { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DefaultAccessibilityView); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//////////////////////////////////////////////////////////////////////////////// 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// ash::tray::AccessibilityPopupView 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochAccessibilityPopupView::AccessibilityPopupView(SystemTrayItem* owner, 98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch uint32 enabled_state_bits) 99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : TrayNotificationView(owner, IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK), 100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch label_(CreateLabel(enabled_state_bits)) { 101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch InitView(label_); 102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochviews::Label* AccessibilityPopupView::CreateLabel(uint32 enabled_state_bits) { 105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK((enabled_state_bits & 106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch (A11Y_SPOKEN_FEEDBACK | A11Y_BRAILLE_DISPLAY_CONNECTED)) != 0); 107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::string16 text; 108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (enabled_state_bits & A11Y_BRAILLE_DISPLAY_CONNECTED) { 109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text.append(l10n_util::GetStringUTF16( 110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_ASH_STATUS_TRAY_BRAILLE_DISPLAY_CONNECTED_BUBBLE)); 111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (enabled_state_bits & A11Y_SPOKEN_FEEDBACK) { 113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!text.empty()) 114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text.append(base::ASCIIToUTF16(" ")); 115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text.append(l10n_util::GetStringUTF16( 116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_BUBBLE)); 117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch views::Label* label = new views::Label(text); 119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch label->SetMultiLine(true); 120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return label; 122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// ash::tray::AccessibilityDetailedView 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AccessibilityDetailedView::AccessibilityDetailedView( 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SystemTrayItem* owner, user::LoginStatus login) : 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrayDetailsView(owner), 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spoken_feedback_view_(NULL), 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high_contrast_view_(NULL), 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen_magnifier_view_(NULL), 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) large_cursor_view_(NULL), 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) help_view_(NULL), 135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) settings_view_(NULL), 1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) autoclick_view_(NULL), 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual_keyboard_view_(NULL), 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spoken_feedback_enabled_(false), 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high_contrast_enabled_(false), 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen_magnifier_enabled_(false), 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) large_cursor_enabled_(false), 1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) autoclick_enabled_(false), 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual_keyboard_enabled_(false), 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) login_(login) { 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Reset(); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendAccessibilityList(); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendHelpEntries(); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateSpecialRow(IDS_ASH_STATUS_TRAY_ACCESSIBILITY_TITLE, this); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layout(); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::AppendAccessibilityList() { 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateScrollableList(); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccessibilityDelegate* delegate = 1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetInstance()->accessibility_delegate(); 1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) spoken_feedback_enabled_ = delegate->IsSpokenFeedbackEnabled(); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spoken_feedback_view_ = AddScrollListItem( 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bundle.GetLocalizedString( 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SPOKEN_FEEDBACK), 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spoken_feedback_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spoken_feedback_enabled_); 167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Large Cursor item is shown only in Login screen. 169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (login_ == user::LOGGED_IN_NONE) { 1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) large_cursor_enabled_ = delegate->IsLargeCursorEnabled(); 171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) large_cursor_view_ = AddScrollListItem( 172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bundle.GetLocalizedString( 173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IDS_ASH_STATUS_TRAY_ACCESSIBILITY_LARGE_CURSOR), 174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) large_cursor_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL, 175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) large_cursor_enabled_); 176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) high_contrast_enabled_ = delegate->IsHighContrastEnabled(); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high_contrast_view_ = AddScrollListItem( 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bundle.GetLocalizedString( 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_ACCESSIBILITY_HIGH_CONTRAST_MODE), 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high_contrast_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) high_contrast_enabled_); 1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) screen_magnifier_enabled_ = delegate->IsMagnifierEnabled(); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen_magnifier_view_ = AddScrollListItem( 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bundle.GetLocalizedString( 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SCREEN_MAGNIFIER), 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen_magnifier_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL, 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen_magnifier_enabled_); 1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Don't show autoclick option at login screen. 1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (login_ != user::LOGGED_IN_NONE) { 1931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) autoclick_enabled_ = delegate->IsAutoclickEnabled(); 1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) autoclick_view_ = AddScrollListItem( 1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bundle.GetLocalizedString( 1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IDS_ASH_STATUS_TRAY_ACCESSIBILITY_AUTOCLICK), 1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) autoclick_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL, 1981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) autoclick_enabled_); 1991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual_keyboard_enabled_ = delegate->IsVirtualKeyboardEnabled(); 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual_keyboard_view_ = AddScrollListItem( 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bundle.GetLocalizedString( 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_ASH_STATUS_TRAY_ACCESSIBILITY_VIRTUAL_KEYBOARD), 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual_keyboard_enabled_ ? gfx::Font::BOLD : gfx::Font::NORMAL, 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual_keyboard_enabled_); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::AppendHelpEntries() { 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Currently the help page requires a browser window. 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(yoshiki): show this even on login/lock screen. crbug.com/158286 2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool userAddingRunning = ash::Shell::GetInstance() 2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ->session_state_delegate() 2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ->IsInSecondaryLoginScreen(); 2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (login_ == user::LOGGED_IN_NONE || 2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) login_ == user::LOGGED_IN_LOCKED || userAddingRunning) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::View* bottom_row = new View(); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::BoxLayout* layout = new 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::BoxLayout(views::BoxLayout::kHorizontal, 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTrayMenuBottomRowPadding, 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTrayMenuBottomRowPadding, 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTrayMenuBottomRowPaddingBetweenItems); 2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layout->SetDefaultFlex(1); 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bottom_row->SetLayoutManager(layout); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrayPopupLabelButton* help = new TrayPopupLabelButton( 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bundle.GetLocalizedString( 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_ASH_STATUS_TRAY_ACCESSIBILITY_LEARN_MORE)); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bottom_row->AddChildView(help); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) help_view_ = help; 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) TrayPopupLabelButton* settings = new TrayPopupLabelButton( 239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) this, 240b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bundle.GetLocalizedString( 241b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) IDS_ASH_STATUS_TRAY_ACCESSIBILITY_SETTINGS)); 242b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bottom_row->AddChildView(settings); 243b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) settings_view_ = settings; 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChildView(bottom_row); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)HoverHighlightView* AccessibilityDetailedView::AddScrollListItem( 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& text, 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Font::FontStyle style, 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool checked) { 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HoverHighlightView* container = new HoverHighlightView(this); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container->AddCheckableLabel(text, style, checked); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_content()->AddChildView(container); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return container; 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::OnViewClicked(views::View* sender) { 2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccessibilityDelegate* delegate = 2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetInstance()->accessibility_delegate(); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (sender == footer()->content()) { 262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TransitionToDefaultView(); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (sender == spoken_feedback_view_) { 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate->IsSpokenFeedbackEnabled() ? 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_DISABLE_SPOKEN_FEEDBACK : 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_ENABLE_SPOKEN_FEEDBACK); 2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delegate->ToggleSpokenFeedback(ash::A11Y_NOTIFICATION_NONE); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (sender == high_contrast_view_) { 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate->IsHighContrastEnabled() ? 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_DISABLE_HIGH_CONTRAST : 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_ENABLE_HIGH_CONTRAST); 2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delegate->ToggleHighContrast(); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (sender == screen_magnifier_view_) { 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate->IsMagnifierEnabled() ? 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_DISABLE_MAGNIFIER : 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_ENABLE_MAGNIFIER); 2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delegate->SetMagnifierEnabled(!delegate->IsMagnifierEnabled()); 281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (large_cursor_view_ && sender == large_cursor_view_) { 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate->IsLargeCursorEnabled() ? 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_DISABLE_LARGE_CURSOR : 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_ENABLE_LARGE_CURSOR); 2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delegate->SetLargeCursorEnabled(!delegate->IsLargeCursorEnabled()); 2871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } else if (autoclick_view_ && sender == autoclick_view_) { 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate->IsAutoclickEnabled() ? 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_DISABLE_AUTO_CLICK : 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_ENABLE_AUTO_CLICK); 2921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delegate->SetAutoclickEnabled(!delegate->IsAutoclickEnabled()); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (virtual_keyboard_view_ && sender == virtual_keyboard_view_) { 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate->IsVirtualKeyboardEnabled() ? 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_DISABLE_VIRTUAL_KEYBOARD : 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_ENABLE_VIRTUAL_KEYBOARD); 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate->SetVirtualKeyboardEnabled(!delegate->IsVirtualKeyboardEnabled()); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccessibilityDetailedView::ButtonPressed(views::Button* sender, 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::Event& event) { 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SystemTrayDelegate* tray_delegate = 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->system_tray_delegate(); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (sender == help_view_) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tray_delegate->ShowAccessibilityHelp(); 308b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) else if (sender == settings_view_) 309b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) tray_delegate->ShowAccessibilitySettings(); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace tray 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 315c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// ash::TrayAccessibility 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayAccessibility::TrayAccessibility(SystemTray* system_tray) 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_ACCESSIBILITY), 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_(NULL), 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_popup_(NULL), 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_menu_(NULL), 322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch request_popup_view_state_(A11Y_NONE), 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tray_icon_visible_(false), 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) login_(GetCurrentLoginStatus()), 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_accessibility_state_(GetAccessibilityState()), 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) show_a11y_menu_on_lock_screen_(true) { 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(Shell::GetInstance()->delegate()); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(system_tray); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->system_tray_notifier()->AddAccessibilityObserver(this); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayAccessibility::~TrayAccessibility() { 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->system_tray_notifier()-> 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveAccessibilityObserver(this); 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayAccessibility::SetTrayIconVisible(bool visible) { 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tray_view()) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tray_view()->SetVisible(visible); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tray_icon_visible_ = visible; 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)tray::AccessibilityDetailedView* TrayAccessibility::CreateDetailedMenu() { 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new tray::AccessibilityDetailedView(this, login_); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TrayAccessibility::GetInitialVisibility() { 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shows accessibility icon if any accessibility feature is enabled. 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Otherwise, doen't show it. 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetAccessibilityState() != A11Y_NONE; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayAccessibility::CreateDefaultView(user::LoginStatus status) { 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(default_ == NULL); 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shows accessibility menu if: 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - on login screen (not logged in); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - "Enable accessibility menu" on chrome://settings is checked; 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - or any of accessibility features is enabled 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Otherwise, not shows it. 3611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccessibilityDelegate* delegate = 3621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetInstance()->accessibility_delegate(); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (login_ != user::LOGGED_IN_NONE && 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !delegate->ShouldShowAccessibilityMenu() && 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // On login screen, keeps the initial visibility of the menu. 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (status != user::LOGGED_IN_LOCKED || !show_a11y_menu_on_lock_screen_)) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(default_ == NULL); 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_ = new tray::DefaultAccessibilityView(this); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayAccessibility::CreateDetailedView(user::LoginStatus status) { 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(detailed_popup_ == NULL); 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(detailed_menu_ == NULL); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 379effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (request_popup_view_state_) { 380effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch detailed_popup_ = 381effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new tray::AccessibilityPopupView(this, request_popup_view_state_); 382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch request_popup_view_state_ = A11Y_NONE; 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return detailed_popup_; 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_DETAILED_ACCESSABILITY); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_menu_ = CreateDetailedMenu(); 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return detailed_menu_; 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayAccessibility::DestroyDefaultView() { 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_ = NULL; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayAccessibility::DestroyDetailedView() { 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_popup_ = NULL; 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_menu_ = NULL; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayAccessibility::UpdateAfterLoginStatusChange(user::LoginStatus status) { 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Stores the a11y feature status on just entering the lock screen. 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (login_ != user::LOGGED_IN_LOCKED && status == user::LOGGED_IN_LOCKED) 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) show_a11y_menu_on_lock_screen_ = (GetAccessibilityState() != A11Y_NONE); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) login_ = status; 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetTrayIconVisible(GetInitialVisibility()); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayAccessibility::OnAccessibilityModeChanged( 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AccessibilityNotificationVisibility notify) { 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetTrayIconVisible(GetInitialVisibility()); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 accessibility_state = GetAccessibilityState(); 415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // We'll get an extra notification if a braille display is connected when 416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // spoken feedback wasn't already enabled. This is because the braille 417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // connection state is already updated when spoken feedback is enabled so 418effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // that the notifications can be consolidated into one. Therefore, we 419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // return early if there's no change in the state that we keep track of. 420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (accessibility_state == previous_accessibility_state_) 421effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 422effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Contains bits for spoken feedback and braille display connected currently 423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // being enabled. 424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch uint32 being_enabled = 425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch (accessibility_state & ~previous_accessibility_state_) & 426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch (A11Y_SPOKEN_FEEDBACK | A11Y_BRAILLE_DISPLAY_CONNECTED); 427effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if ((notify == ash::A11Y_NOTIFICATION_SHOW) && being_enabled != A11Y_NONE) { 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shows popup if |notify| is true and the spoken feedback is being enabled. 429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch request_popup_view_state_ = being_enabled; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PopupDetailedView(kTrayPopupAutoCloseDelayForTextInSeconds, false); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (detailed_popup_) 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_popup_->GetWidget()->Close(); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (detailed_menu_) 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) detailed_menu_->GetWidget()->Close(); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_accessibility_state_ = accessibility_state; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 442