// Copyright 2018 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.setui;

enum ReturnCode {
    OK = 0;
    FAILED = 1;
    UNSUPPORTED = 2;
};

struct SettingsObject {
    SettingType setting_type;
    SettingData data;
};

struct UpdateResponse {
    ReturnCode return_code;
};

struct MutationResponse {
    ReturnCode return_code;
};

// The main interface for UIs to change system settings. Currently, the
// settings are scoped to the device, but will eventually be scoped to the user
// as is applicable.
[Discoverable]
protocol SetUiService {
    // Begins listening to changes to a given settings object. This may cause the
    // SetUiService to connect to any applicable device services until all listeners
    // for a given type are closed.
    // The service will call the listener with the current state immediately on
    // initialization.
    // DEPRECATED: To be removed in favor of Watch
    Listen(SettingType settingType, SettingListener listener);

    // Returns immediately on first call. Subsequent calls will be delayed until
    // there is an updated value available.
    [Transitional]
    Watch(SettingType settingType) -> (SettingsObject setting);

    // Sets the value of a given settings object. Returns once operation
    // has completed.
    Update(SettingsObject value) -> (UpdateResponse response);

    Mutate(SettingType settingType, Mutation mutation) -> (MutationResponse response);

    InteractiveMutate(SettingType settingType, Mutation mutation, MutationHandles mutation_handles) -> (MutationResponse response);
};


// DEPRECATED: To be removed in favor of Watch
protocol SettingListener {
    Notify(SettingsObject object);
};
