// 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.settings;

using fuchsia.ui.types;

/// Modify or watch accessibility settings that are persisted.
///
/// Supported SettingsEpitaph enums:
/// REQUEST_NOT_SUPPORTED, INTERNAL_SERVICE_ERROR, PERSISTENT_STORAGE_ERROR
[Discoverable]
protocol Accessibility {
    /// This call may fail if AccessibilitySettings are not accessible, possibly because of file
    /// system errors, not being supported on this product, or general service failures.
    ///
    /// TO BE DEPRECATED: new watches will use Watch2 in the future.
    [Transitional = "To be deprecated in favor of Watch2"]
    Watch() -> (AccessibilitySettings settings) error Error;

    /// Gets the current value of all accessibility settings. Returns
    /// immediately on first call; subsequent calls return when any of the
    /// values change.
    ///
    /// - `settings` all current values of the accessibility settings.
    /// * see [`AccessibilitySettings`] for their meaning.
    ///
    /// If this call fails, it is considered a fatal error and the channel
    /// will be closed.
    [Transitional = "Future Replacement for Watch"]
    Watch2() -> (AccessibilitySettings settings);

    /// Sets [AccessibilitySettings] settings. Any field not explicitly set in the table performs a
    /// no-op, and will not make any changes.
    Set(AccessibilitySettings settings) -> () error Error;
};

/// Supported accessibility settings.
table AccessibilitySettings {
    /// For videos, use an alternative audio track (akin to changing languages)
    /// that explains what is happening visually while there is no dialogue.
    1: bool audio_description;

    /// Read aloud elements of the screen selected by the user.
    2: bool screen_reader;

    /// Invert colors on the screen.
    3: bool color_inversion;

    /// Interpret triple-tap on the touchscreen as a command to zoom in.
    4: bool enable_magnification;

    /// What type of color-blindness, if any, to correct for.
    5: ColorBlindnessType color_correction;

    /// What kind of sources get closed captions, and how they look.
    6: CaptionsSettings captions_settings;
};

enum ColorBlindnessType {
    /// No color blindness.
    NONE = 0;

    /// Red-green color blindness due to reduced sensitivity to red light.
    PROTANOMALY = 1;

    /// Red-green color blindness due to reduced sensitivity to green light.
    DEUTERANOMALY = 2;

    /// Blue-yellow color blindness. It is due to reduced sensitivity to blue
    /// light.
    TRITANOMALY = 3;
};

/// What kind of sources get closed captions, and how they look.
table CaptionsSettings {
    /// Closed captions enabled for media sources of audio.
    1: bool for_media;

    /// Closed captions enabled for Text-To-Speech sources of audio.
    2: bool for_tts;

    /// Font style and color used for the closed captions text.
    3: CaptionFontStyle font_style;

    /// Border color used around the closed captions window.
    4: fuchsia.ui.types.ColorRgba window_color;

    /// Background color of the closed captions window.
    5: fuchsia.ui.types.ColorRgba background_color;
};

/// Font, size, and color of closed captions text.
table CaptionFontStyle {
    1: CaptionFontFamily family;
    /// 47 CFR §79.103(c)(2) requires at least 3-bit RGB for user override of
    /// closed-captions color.
    2: fuchsia.ui.types.ColorRgba color;
    /// Size of closed captions text relative to the default captions size. A
    /// range of [0.5, 2] is guaranteed to be supported (as 47 CFR §79.103(c)(4)
    /// establishes).
    3: float32 relative_size;
    4: EdgeStyle char_edge_style;
};

/// Font family groups for closed captions, specified by 47 CFR §79.102(k).
enum CaptionFontFamily {
    UNKNOWN = 0;
    MONOSPACED_SERIF = 1;
    PROPORTIONAL_SERIF = 2;
    MONOSPACED_SANS_SERIF = 3;
    PROPORTIONAL_SANS_SERIF = 4;
    CASUAL = 5;
    CURSIVE = 6;
    SMALL_CAPITALS = 7;
};

/// Edge style for fonts as specified in 47 CFR §79.103(c)(7)
enum EdgeStyle {
    /// No border around fonts.
    NONE = 0;

    /// A shadow "behind" and slightly offset from each edge.
    DROP_SHADOW = 1;

    /// A bevel that mimics a 3D raised effect.
    RAISED = 2;

    /// A bevel that mimics a 3D depressed effect.
    DEPRESSED = 3;

    /// A plain border around each shapes.
    OUTLINE = 4;
};
