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

/// Settings related to display.
///
/// Supported SettingsEpitaph enums:
/// REQUEST_NOT_SUPPORTED, INTERNAL_SERVICE_ERROR, PERSISTENT_STORAGE_ERROR
[Discoverable]
protocol Display {
    /// DEPRECATED: new watches should use Watch2.
    [Transitional = "Deprecated in favor of Watch2"]
    Watch() -> (DisplaySettings settings) error Error;

    /// Gets the current [DisplaySettings]. Returns immediately on first call;
    /// subsequent calls return when the value changes.
    ///
    /// If this call fails, it is considered a fatal error and the channel
    /// will be closed.
    [Transitional = "Replacement for Watch"]
    Watch2() -> (DisplaySettings settings);

    /// DEPRECATED: new watches should use WatchLightSensor2.
    [Transitional = "Deprecated in favor of WatchLightSensor2"]
    WatchLightSensor(float32 delta) -> (LightSensorData light_sensor_data) error Error;

    /// Obtains the current data from the light sensor. Returns immediately on
    /// first call; subsequent calls return when the light sensor value changes
    ///  by a certain amount measured in lux.
    ///
    /// If this call fails, it is considered a fatal error and the channel
    /// will be closed.
    [Transitional = "Replacement for WatchLightSensor"]
    WatchLightSensor2(float32 delta) -> (LightSensorData light_sensor_data);

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

/// DisplaySettings are used to determine the output state of the display.
/// The display can be toggled between two modes, auto-brightness on and
/// auto-brightness off. When auto-brightness is on a manual offset to the
/// total output brightness can be applied by setting `user_brightness_offset`.
/// When auto-brightness is off the display brightness is set manually by
/// setting brightness_value. All values can be set at any time to persist
/// settings for either mode.
table DisplaySettings {
    /// Auto brightness enabled
    1: bool auto_brightness;
    /// Manually set brightness value [0.0 - 1.0]
    2: float32 brightness_value;
    /// User defined offset to the total auto brightness output [-1.0 - 1.0]
    3: float32 user_brightness_offset;
};

table LightSensorData {
    /// Brightness from the light sensor measured in lux.
    1: float32 illuminance_lux;

    /// Color measured by light sensor in rgb.
    2: fuchsia.ui.types.ColorRgb color;
};
