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

/// Modify or watch do-not-disturb (DND) mode. While DND is active, distractions
/// created by the device are reduced or eliminated. E.g. bootup is silent,
/// incoming calls could be rejected or silent, and notifications could be
/// paused, silent, or hidden. High-priority disruptions like alarms can be
/// allowed.
///
/// Supported SettingsEpitaph enums:
/// REQUEST_NOT_SUPPORTED, INTERNAL_SERVICE_ERROR, PERSISTENT_STORAGE_ERROR
[Discoverable]
protocol DoNotDisturb {
    /// Gets the current [`DoNotDisturbSettings`]. Returns immediately on first
    /// call; subsequent calls return when the values change.
    ///
    /// If this call fails, it is considered a fatal error and the channel
    /// will be closed.
    Watch() -> (DoNotDisturbSettings settings);

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

/// Settings related to do-not-disturb (DND) mode.
table DoNotDisturbSettings {
    /// If true, the device is in do-not-disturb (DND) mode. Change this value
    /// if you're directly responding to a user-initiated event.
    ///
    /// Note that the device could still be in DND mode even if this is set to
    /// `false`, as [`night_mode_initiated_do_not_disturb`] might be `true`. To
    /// actually disable DND mode, set both fields to `false`.
    ///
    /// To know whether DND is enabled, you need to do a boolean OR of both
    /// fields.
    1: bool user_initiated_do_not_disturb;

    /// If true, the device is in do-not-disturb (DND) mode. Change this value
    /// if you're trying to enable or disable DND based on a nightly schedule.
    ///
    /// Note that the device could still be in DND mode even if this is set to
    /// `false`, as [`user_initiated_do_not_disturb`] might be `true`. Do not
    /// set that field to `false` unless you're directly responding to a
    /// user-initiated event.
    ///
    /// To know whether DND is enabled, you need to do a boolean OR of both
    /// fields.
    2: bool night_mode_initiated_do_not_disturb;
};
