Home | History | Annotate | Download | only in accessibility
      1 // Copyright (c) 2013 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 CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_ACCESSIBILITY_MANAGER_H_
      6 #define CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_ACCESSIBILITY_MANAGER_H_
      7 
      8 #include "ash/shell_delegate.h"
      9 #include "base/prefs/pref_change_registrar.h"
     10 #include "chrome/browser/chromeos/accessibility/accessibility_util.h"
     11 #include "content/public/browser/notification_observer.h"
     12 #include "content/public/browser/notification_registrar.h"
     13 
     14 class Profile;
     15 
     16 namespace chromeos {
     17 
     18 struct AccessibilityStatusEventDetails {
     19   AccessibilityStatusEventDetails(
     20       bool enabled,
     21       ash::AccessibilityNotificationVisibility notify);
     22 
     23   AccessibilityStatusEventDetails(
     24       bool enabled,
     25       ash::MagnifierType magnifier_type,
     26       ash::AccessibilityNotificationVisibility notify);
     27 
     28   bool enabled;
     29   ash::MagnifierType magnifier_type;
     30   ash::AccessibilityNotificationVisibility notify;
     31 };
     32 
     33 // AccessibilityManager changes the statuses of accessibility features
     34 // watching profile notifications and pref-changes.
     35 // TODO(yoshiki): merge MagnificationManager with AccessibilityManager.
     36 class AccessibilityManager : public content::NotificationObserver {
     37  public:
     38   // Creates an instance of AccessibilityManager, this should be called once,
     39   // because only one instance should exist at the same time.
     40   static void Initialize();
     41   // Deletes the existing instance of AccessibilityManager.
     42   static void Shutdown();
     43   // Returns the existing instance. If there is no instance, returns NULL.
     44   static AccessibilityManager* Get();
     45 
     46   // On a user's first login into a device, any a11y features enabled/disabled
     47   // by the user on the login screen are enabled/disabled in the user's profile.
     48   // This class watches for profile changes and copies settings into the user's
     49   // profile when it detects a login with a newly created profile.
     50   class PrefHandler {
     51    public:
     52     explicit PrefHandler(const char* pref_path);
     53     virtual ~PrefHandler();
     54 
     55     // Should be called from AccessibilityManager::SetProfile().
     56     void HandleProfileChanged(Profile* previous_profile,
     57                               Profile* current_profile);
     58 
     59    private:
     60     const char* pref_path_;
     61   };
     62 
     63   // Enables or disables the large cursor.
     64   void EnableLargeCursor(bool enabled);
     65   // Returns true if the large cursor is enabled, or false if not.
     66   bool IsLargeCursorEnabled();
     67 
     68   // Enables or disable Sticky Keys.
     69   void EnableStickyKeys(bool enabled);
     70 
     71   // Returns true if the Sticky Keys is enabled, or false if not.
     72   bool IsStickyKeysEnabled();
     73 
     74   // Enables or disables spoken feedback. Enabling spoken feedback installs the
     75   // ChromeVox component extension.
     76   void EnableSpokenFeedback(bool enabled,
     77                             ash::AccessibilityNotificationVisibility notify);
     78 
     79   // Returns true if spoken feedback is enabled, or false if not.
     80   bool IsSpokenFeedbackEnabled();
     81 
     82   // Toggles whether Chrome OS spoken feedback is on or off.
     83   void ToggleSpokenFeedback(ash::AccessibilityNotificationVisibility notify);
     84 
     85   // Speaks the specified string.
     86   void Speak(const std::string& text);
     87 
     88   // Speaks the given text if the accessibility pref is already set.
     89   void MaybeSpeak(const std::string& text);
     90 
     91   // Enables or disables the high contrast mode for Chrome.
     92   void EnableHighContrast(bool enabled);
     93 
     94   // Returns true if High Contrast is enabled, or false if not.
     95   bool IsHighContrastEnabled();
     96 
     97   void SetProfileForTest(Profile* profile);
     98 
     99  protected:
    100   AccessibilityManager();
    101   virtual ~AccessibilityManager();
    102 
    103  private:
    104   void LoadChromeVox();
    105   void LoadChromeVoxToUserScreen();
    106   void LoadChromeVoxToLockScreen();
    107   void UnloadChromeVox();
    108   void UnloadChromeVoxFromLockScreen();
    109 
    110   void UpdateLargeCursorFromPref();
    111   void UpdateStickyKeysFromPref();
    112   void UpdateSpokenFeedbackFromPref();
    113   void UpdateHighContrastFromPref();
    114   void LocalePrefChanged();
    115 
    116   void SetProfile(Profile* profile);
    117 
    118   void UpdateChromeOSAccessibilityHistograms();
    119 
    120   // content::NotificationObserver implementation:
    121   virtual void Observe(int type,
    122                        const content::NotificationSource& source,
    123                        const content::NotificationDetails& details) OVERRIDE;
    124 
    125   // Profile which has the current a11y context.
    126   Profile* profile_;
    127 
    128   // Profile which ChromeVox is currently loaded to. If NULL, ChromeVox is not
    129   // loaded to any profile.
    130   bool chrome_vox_loaded_on_lock_screen_;
    131   bool chrome_vox_loaded_on_user_screen_;
    132 
    133   content::NotificationRegistrar notification_registrar_;
    134   scoped_ptr<PrefChangeRegistrar> pref_change_registrar_;
    135   scoped_ptr<PrefChangeRegistrar> local_state_pref_change_registrar_;
    136 
    137   PrefHandler large_cursor_pref_handler_;
    138   PrefHandler spoken_feedback_pref_handler_;
    139   PrefHandler high_contrast_pref_handler_;
    140 
    141   bool large_cursor_enabled_;
    142   bool sticky_keys_enabled_;
    143   bool spoken_feedback_enabled_;
    144   bool high_contrast_enabled_;
    145 
    146   ash::AccessibilityNotificationVisibility spoken_feedback_notification_;
    147 
    148   DISALLOW_COPY_AND_ASSIGN(AccessibilityManager);
    149 };
    150 
    151 }  // namespace chromeos
    152 
    153 #endif  // CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_ACCESSIBILITY_MANAGER_H_
    154