910e62b5创建于 1月15日历史提交
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_ACCESSIBILITY_ANDROID_ACCESSIBILITY_STATE_H_
#define UI_ACCESSIBILITY_ANDROID_ACCESSIBILITY_STATE_H_

#include <string>
#include <vector>

#include "base/component_export.h"
#include "base/no_destructor.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "base/time/time.h"

namespace ui {

// Provides methods for measuring accessibility state on Android via
// org.chromium.ui.accessibility.AccessibilityState.
class COMPONENT_EXPORT(AX_BASE_ANDROID) AccessibilityState {
 public:
  class AccessibilityStateObserver : public base::CheckedObserver {
   public:
    // Called when the animator duration scale changes.
    virtual void OnAnimatorDurationScaleChanged() {}

    // Called when the display inversion state changes.
    virtual void OnDisplayInversionEnabledChanged(bool enabled) {}

    // Called when the contrast level changes.
    virtual void OnContrastLevelChanged(bool high_contrast_enabled) {}

    // Called when the text cursor blink interval changes.
    virtual void OnTextCursorBlinkIntervalChanged(
        base::TimeDelta text_cursor_blink_interval) {}

    // Called during browser startup and any time enabled services change.
    virtual void RecordAccessibilityServiceInfoHistograms() {}
  };

  static AccessibilityState* Get();

  void AddObserver(AccessibilityStateObserver* observer);
  void RemoveObserver(AccessibilityStateObserver* observer);

  // Notifies all delegates of an animator duration scale change.
  void NotifyAnimatorDurationScaleObservers();

  // Notifies all delegates of a display inversion state change.
  void NotifyDisplayInversionEnabledObservers(bool enabled);

  // Notifies all delegates of a contrast level change.
  void NotifyContrastLevelObservers(bool high_contrast_enabled);

  // Notifies all delegates of a cursor blink interval change.
  void NotifyTextCursorBlinkIntervalObservers(base::TimeDelta new_interval);

  // Notifies all delegates to record service info histograms.
  void NotifyRecordAccessibilityServiceInfoHistogram();

  // --------------------------------------------------------------------------
  // Methods that call into AccessibilityState.java via JNI
  // --------------------------------------------------------------------------

  // Returns the event mask of all running accessibility services.
  static int GetAccessibilityServiceEventTypeMask();

  // Returns the feedback type mask of all running accessibility services.
  static int GetAccessibilityServiceFeedbackTypeMask();

  // Returns the flags mask of all running accessibility services.
  static int GetAccessibilityServiceFlagsMask();

  // Returns the capabilities mask of all running accessibility services.
  static int GetAccessibilityServiceCapabilitiesMask();

  // Returns a vector containing the IDs of all running accessibility services.
  static std::vector<std::string> GetAccessibilityServiceIds();

  // Returns the OS-level setting for the text cursor blink interval.
  static base::TimeDelta GetTextCursorBlinkInterval();

  // Returns true when the user has set the OS-level setting to reduce motion.
  static bool PrefersReducedMotion();

  // --------------------------------------------------------------------------
  // Methods that call into AccessibilityAutofillHelper.java via JNI
  // --------------------------------------------------------------------------

  // Returns true if this instance should respect the displayed password text
  // (available in the shadow DOM), false if it should return bullets. Default
  // false.
  static bool ShouldRespectDisplayedPasswordText();
  static void ForceRespectDisplayedPasswordTextForTesting();

  // Returns true if this instance should expose password text to AT (e.g. as a
  // user is typing in a field), false if it should return bullets. Default
  // true.
  static bool ShouldExposePasswordText();

 private:
  friend class base::NoDestructor<AccessibilityState>;  // For constructor.

  AccessibilityState();
  ~AccessibilityState();

  base::ObserverList<AccessibilityStateObserver> observers_;
};

}  // namespace ui

#endif  // UI_ACCESSIBILITY_ANDROID_ACCESSIBILITY_STATE_H_