// 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() -> (struct {
        settings DoNotDisturbSettings;
    });

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

/// Settings related to do-not-disturb (DND) mode.
type DoNotDisturbSettings = table {
    /// 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: user_initiated_do_not_disturb bool;

    /// 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: night_mode_initiated_do_not_disturb bool;
};
