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