// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.accessibility;

enum SettingsManagerStatus {
    OK = 0;
    ERROR = 1;
};

/// Specifies color correction mode.
enum ColorCorrection {
    // No color correction enabled.
    DISABLED = 0;

    // Color correction enabled for protoanomaly (red-green -- reduced sensitivity to red light).
    CORRECT_PROTANOMALY = 1;

    // Color correction enabled for deuteranomaly (red-green -- reduced sensitivy to green light).
    CORRECT_DEUTERANOMALY = 2;

    // Color correction enabled for tritanomaly (blue-yellow -- reduced sensitivity to blude light).
    CORRECT_TRITANOMALY = 3;
};

/// Settings is used to represent all the Accessibility Settings along with Matrix
/// needed to apply Color Correction and Color Inversion.
/// This table will be used to transfer Settings information between different services to
/// either modify or get notified about Accessibility Settings.
table Settings {
    /// When magnification_enabled == true, user can specify an area of the screen to be magnified.
    /// Note that actually magnifying the region requires an addition input (gesture, button, etc.).
    // TODO(FIDL-609): Default to false.
    1: bool magnification_enabled;

    /// Degree of magnification for magnified area.
    // TODO(FIDL-609): Default to 1.0.
    2: float32 magnification_zoom_factor;

    /// When screen_reader_enabled == true, user can specify elements of the UI to be described
    /// audibly.
    /// Note that reading a particular element requires an additional input.
    // TODO(FIDL-609): Default to false.
    3: bool screen_reader_enabled;

    /// When color_inversion_enabled == true, certain colors are inverted across the entire screen.
    /// No additional user input is required for the inversion to take place once enabled.
    /// Colors will continue to be inverted until color_inversion_enabled is set to false.
    // TODO(FIDL-609): Default to false.
    4: bool color_inversion_enabled;

    /// When color_correction is set to DISABLED, colors are displayed normally.
    /// When color_correction has a different value, colors are modified to correct for the specified
    /// type of color-blindness.
    /// No additional user input is required for correction to take place once enabled.
    /// Correction will continue to occur until color_correction is set to DISABLED.
    // TODO(FIDL-609), TODO(FIDL-486): Default to ColorCorrection.DISABLED.
    5: ColorCorrection color_correction;

    /// 3x3 Matrix in row-major form which will be used by the SettingsManager
    /// client for applying Color Correction and Color Inversion. Display
    /// adapter expects a 3x3 row major matrix and A11y manager stores the
    /// matrix in the same format.
    /// Color Adjustment matrix is used to modify onscreen colors for either
    /// of Deuteranomaly, Protanomaly and Tritanomaly or it can be used for
    /// performing Color Inversion.
    6: array<float32>:9 color_adjustment_matrix;
};

/// SettingsManager will be implemented by Accessibility Manager.
/// The accessibility settings manager is an interface that allows other services to:
///   1. register as a settings provider. In return, SettingsManager will provide an interface
///      to modify individual settings.
///   2. register themselves to get notified whenever there is a change in Settings.
/// Ideally there should be just 1 Settings Provider and there can be multiple watchers.
/// "Settings Service" will be settings Provider for Accessibility. There could be multiple
/// settings watchers like Root Presenter, Flutter, Chrome, etc.
[Discoverable]
protocol SettingsManager {
    // Register Accessibility settings provider to make modification to accessibility settings.
    RegisterSettingProvider(request<SettingsProvider> settings_provider_request);

    // Registers a watcher to observe changes in accessibility settings.
    // When a watcher is registered by calling Watch(), SettingsManager will send all the
    // Settings as part of registration.
    Watch(SettingsWatcher watcher);
};

/// Interface to update Accessibility Settings. Various Accessibility Settings can be
/// modified individually.
protocol SettingsProvider {
    // Enables or disables magnification depending on |magnification_enabled|.
    // When |magnification_enabled| is different from the existing setting,
    // the zoom factor is reset to 1.0.
    SetMagnificationEnabled(bool magnification_enabled)
        -> (SettingsManagerStatus status);

    // Sets value of zoom factor, provided that magnification is enabled.
    // Zoom factor must be > 1.0.
    // Returns ERROR if zoom is disabled or if magnification_zoom_factor < 1.0.
    SetMagnificationZoomFactor(float32 magnification_zoom_factor)
        -> (SettingsManagerStatus status);

    // Sets value of screen_reader_enabled, and returns OK.
    SetScreenReaderEnabled(bool screen_reader_enabled)
        -> (SettingsManagerStatus status);

    // Sets value of color_inversion_enabled, and returns OK.
    SetColorInversionEnabled(bool color_inversion_enabled)
        -> (SettingsManagerStatus status);

    // Sets value of color_correction, and returns OK.
    SetColorCorrection(ColorCorrection color_correction)
        -> (SettingsManagerStatus status);
};

/// SettingsWatcher is the client side interface that Settings Manager can
/// use to notify clients whenever Accessibility Settings change.
protocol SettingsWatcher {
    // Called when accessibility settings elections change.
    OnSettingsChange(Settings accessibility_settings);
};
