// 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(server="platform")
closed 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.
    strict 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.
    strict Set(struct {
        settings DoNotDisturbSettings;
    }) -> () 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;
};
