1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef ASH_SYSTEM_TRAY_ACCESSIBILITY_H_
6#define ASH_SYSTEM_TRAY_ACCESSIBILITY_H_
7
8#include "ash/shell_delegate.h"
9#include "ash/shell_observer.h"
10#include "ash/system/tray/tray_details_view.h"
11#include "ash/system/tray/tray_image_item.h"
12#include "ash/system/tray/view_click_listener.h"
13#include "base/gtest_prod_util.h"
14#include "ui/gfx/font.h"
15#include "ui/views/controls/button/button.h"
16
17namespace chromeos {
18class TrayAccessibilityTest;
19}
20
21namespace views {
22class Button;
23class ImageView;
24class View;
25}
26
27namespace ash {
28
29class SystemTrayItem;
30
31class ASH_EXPORT AccessibilityObserver {
32 public:
33  virtual ~AccessibilityObserver() {}
34
35  // Notifies when accessibilty mode changes.
36  virtual void OnAccessibilityModeChanged(
37      AccessibilityNotificationVisibility notify) = 0;
38};
39
40namespace internal {
41
42class HoverHighlightView;
43
44namespace tray {
45
46class AccessibilityPopupView;
47
48class AccessibilityDetailedView : public TrayDetailsView,
49                                  public ViewClickListener,
50                                  public views::ButtonListener,
51                                  public ShellObserver {
52 public:
53  explicit AccessibilityDetailedView(SystemTrayItem* owner,
54                                     user::LoginStatus login);
55  virtual ~AccessibilityDetailedView() {}
56
57 private:
58  // Add the accessibility feature list.
59  void AppendAccessibilityList();
60
61  // Add help entries.
62  void AppendHelpEntries();
63
64  HoverHighlightView* AddScrollListItem(const base::string16& text,
65                                        gfx::Font::FontStyle style,
66                                        bool checked);
67  // Overridden from ViewClickListener.
68  virtual void OnViewClicked(views::View* sender) OVERRIDE;
69  // Overridden from ButtonListener.
70  virtual void ButtonPressed(views::Button* sender,
71                             const ui::Event& event) OVERRIDE;
72
73  views::View* spoken_feedback_view_;
74  views::View* high_contrast_view_;
75  views::View* screen_magnifier_view_;;
76  views::View* large_cursor_view_;;
77  views::View* help_view_;
78  views::View* settings_view_;
79
80  bool spoken_feedback_enabled_;
81  bool high_contrast_enabled_;
82  bool screen_magnifier_enabled_;
83  bool large_cursor_enabled_;
84  user::LoginStatus login_;
85
86  friend class chromeos::TrayAccessibilityTest;
87  DISALLOW_COPY_AND_ASSIGN(AccessibilityDetailedView);
88};
89
90}  // namespace tray
91
92class TrayAccessibility : public TrayImageItem,
93                          public AccessibilityObserver {
94 public:
95  explicit TrayAccessibility(SystemTray* system_tray);
96  virtual ~TrayAccessibility();
97
98 private:
99  void SetTrayIconVisible(bool visible);
100  tray::AccessibilityDetailedView* CreateDetailedMenu();
101
102  // Overridden from TrayImageItem.
103  virtual bool GetInitialVisibility() OVERRIDE;
104  virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE;
105  virtual views::View* CreateDetailedView(user::LoginStatus status) OVERRIDE;
106  virtual void DestroyDefaultView() OVERRIDE;
107  virtual void DestroyDetailedView() OVERRIDE;
108  virtual void UpdateAfterLoginStatusChange(user::LoginStatus status) OVERRIDE;
109
110  // Overridden from AccessibilityObserver.
111  virtual void OnAccessibilityModeChanged(
112      AccessibilityNotificationVisibility notify) OVERRIDE;
113
114  views::View* default_;
115  tray::AccessibilityPopupView* detailed_popup_;
116  tray::AccessibilityDetailedView* detailed_menu_;
117
118  bool request_popup_view_;
119  bool tray_icon_visible_;
120  user::LoginStatus login_;
121
122  // Bitmap of values from AccessibilityState enum.
123  uint32 previous_accessibility_state_;
124
125  // A11y feature status on just entering the lock screen.
126  bool show_a11y_menu_on_lock_screen_;
127
128  friend class chromeos::TrayAccessibilityTest;
129  DISALLOW_COPY_AND_ASSIGN(TrayAccessibility);
130};
131
132}  // namespace internal
133}  // namespace ash
134
135#endif  // ASH_SYSTEM_TRAY_ACCESSIBILITY_H_
136