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

/// Settings related to input to the device.
///
/// Supported SettingsEpitaph enums:
/// REQUEST_NOT_SUPPORTED, INTERNAL_SERVICE_ERROR, PERSISTENT_STORAGE_ERROR
[Discoverable]
protocol Input {
    /// Gets the current |InputDeviceSettings|. 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 = "Will be deprecated in favor of Watch2"]
    Watch() -> (InputDeviceSettings settings);

    /// Sets |InputDeviceSettings|. Any field not explicitly set in the table
    /// performs a no-op, and will not make any changes.
    [Transitional = "Will be deprecated in favor of SetStates"]
    Set(InputDeviceSettings settings) -> () error Error;

    /// Gets the current |InputSettings|. 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 = "Future replacement for Watch"]
    Watch2() -> (InputSettings settings);

    /// Requests software input devices to set their software state. May
    /// not necessarily change the overall state of the device, depending on the
    /// hardware state. Will modify the software state of the existing device if a
    /// known id is passed. Otherwise it will add a new input device.
    [Transitional = "Future replacement for Set"]
    SetStates(vector<InputState>:MAX input_states) -> () error Error;
};

/// A series of flags determining the state of an input device mute toggle.
bits ToggleStateFlags : uint64 {
    /// The input device exists and is neither muted nor disabled.
    AVAILABLE = 0x01;
    /// The input device is being used.
    ACTIVE = 0x02;
    /// The input device could be available if it was enabled, but it is muted.
    MUTED = 0x04;
    /// The input device is permanently disabled, e.g. by policy.
    DISABLED = 0x08;
    /// The state cannot be determined.
    ERROR = 0x10;
};

enum DeviceType {
    MICROPHONE = 1;
    CAMERA = 2;
};

enum DeviceStateSource {
    HARDWARE = 1;
    SOFTWARE = 2;
};

/// Settings related to device input. New format for InputDeviceSettings.
table InputSettings {
    1: vector<InputDevice>:MAX devices;
};

table InputDevice {
    /// Uniquely identifies a device within a device type.
    1: string:MAX device_name;
    /// The type of input device (e.g. camera, microphone).
    2: DeviceType device_type;
    /// The state for each source (e.g. hardware, software).
    3: vector<SourceState>:MAX source_states;
    /// The software toggle states which are allowed to be changed for a device.
    4: ToggleStateFlags mutable_toggle_state;
    /// The overall state of the device considering the source states.
    5: DeviceState state;
};

/// Holds the state for an |InputDevice|.
table DeviceState {
    /// Controls the on/off state of the input device.
    1: ToggleStateFlags toggle_flags;
};

/// Describes what the |source|'s |state| is.
table SourceState {
    1: DeviceStateSource source;
    2: DeviceState state;
};

/// A subset of |DeviceState|'s properties that clients may pass to change the
/// software state of an InputDevice.
table InputState {
    1: string:MAX name;
    2: DeviceType device_type;
    3: DeviceState state;
};

///////////////////////////////////
// Soon-to-be-deprecated API below
///////////////////////////////////

/// Settings related to audio input. Replacement for fuchsia.settings.AudioSettings.input.
table InputDeviceSettings {
    1: Microphone microphone;
};

/// Settings related to the microphone.
table Microphone {
    /// Whether the microphone is muted.
    ///
    /// This is only tracking the software mute state. The service will pick up the hardware state
    /// and combine the two states to find the overall state. If either software or hardware is
    /// muted, the overall state is muted. The two may be different if the device should not
    /// listen regardless of hardware state, or if the software state is unmuted and the user
    /// turns the microphone off.
    1: bool muted;
};
