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)#ifndef ASH_SYSTEM_TRAY_ACCESSIBILITY_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ASH_SYSTEM_TRAY_ACCESSIBILITY_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/accessibility_delegate.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_observer.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/tray_details_view.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_image_item.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ash/system/tray/tray_notification_view.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/view_click_listener.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/gtest_prod_util.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/font.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/button.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TrayAccessibilityTest;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Button;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImageView;
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass Label;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class View;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass HoverHighlightView;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SystemTrayItem;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ASH_EXPORT AccessibilityObserver {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AccessibilityObserver() {}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifies when accessibilty mode changes.
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnAccessibilityModeChanged(
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AccessibilityNotificationVisibility notify) = 0;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace tray {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass AccessibilityPopupView : public TrayNotificationView {
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AccessibilityPopupView(SystemTrayItem* owner, uint32 enabled_state_bits);
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const views::Label* label_for_test() const { return label_; }
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  views::Label* CreateLabel(uint32 enabled_state_bits);
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  views::Label* label_;
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DISALLOW_COPY_AND_ASSIGN(AccessibilityPopupView);
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AccessibilityDetailedView : public TrayDetailsView,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  public ViewClickListener,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  public views::ButtonListener,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  public ShellObserver {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit AccessibilityDetailedView(SystemTrayItem* owner,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     user::LoginStatus login);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~AccessibilityDetailedView() {}
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add the accessibility feature list.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AppendAccessibilityList();
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add help entries.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AppendHelpEntries();
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HoverHighlightView* AddScrollListItem(const base::string16& text,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        gfx::Font::FontStyle style,
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        bool checked);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from ViewClickListener.
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnViewClicked(views::View* sender) OVERRIDE;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from ButtonListener.
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ButtonPressed(views::Button* sender,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const ui::Event& event) OVERRIDE;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* spoken_feedback_view_;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* high_contrast_view_;
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  views::View* screen_magnifier_view_;
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  views::View* large_cursor_view_;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::View* help_view_;
89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  views::View* settings_view_;
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  views::View* autoclick_view_;
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  views::View* virtual_keyboard_view_;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool spoken_feedback_enabled_;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool high_contrast_enabled_;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool screen_magnifier_enabled_;
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool large_cursor_enabled_;
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool autoclick_enabled_;
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool virtual_keyboard_enabled_;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  user::LoginStatus login_;
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class chromeos::TrayAccessibilityTest;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AccessibilityDetailedView);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace tray
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TrayAccessibility : public TrayImageItem,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          public AccessibilityObserver {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit TrayAccessibility(SystemTray* system_tray);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TrayAccessibility();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetTrayIconVisible(bool visible);
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tray::AccessibilityDetailedView* CreateDetailedMenu();
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from TrayImageItem.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetInitialVisibility() OVERRIDE;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual views::View* CreateDetailedView(user::LoginStatus status) OVERRIDE;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DestroyDefaultView() OVERRIDE;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DestroyDetailedView() OVERRIDE;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void UpdateAfterLoginStatusChange(user::LoginStatus status) OVERRIDE;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from AccessibilityObserver.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnAccessibilityModeChanged(
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AccessibilityNotificationVisibility notify) OVERRIDE;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* default_;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tray::AccessibilityPopupView* detailed_popup_;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tray::AccessibilityDetailedView* detailed_menu_;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Bitmap of fvalues from AccessibilityState.  Can contain any or
134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // both of A11Y_SPOKEN_FEEDBACK A11Y_BRAILLE_DISPLAY_CONNECTED.
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  uint32 request_popup_view_state_;
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool tray_icon_visible_;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  user::LoginStatus login_;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Bitmap of values from AccessibilityState enum.
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 previous_accessibility_state_;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A11y feature status on just entering the lock screen.
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool show_a11y_menu_on_lock_screen_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class chromeos::TrayAccessibilityTest;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TrayAccessibility);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // ASH_SYSTEM_TRAY_ACCESSIBILITY_H_
153