// 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.developer.tiles;

using fuchsia.ui.app;
using fuchsia.ui.gfx;

@discoverable
protocol Controller {
    /// Instantiates a component by its URL and adds a tile backed by that component's ViewProvider.
    /// Returns a key for the tile that can be used for resizing or removing the tile, or 0 on failure.
    AddTileFromURL(struct {
        url string;
        allow_focus bool;
        args vector<string>:optional;
    }) -> (struct {
        key uint32;
    });

    /// Adds a tile backed by a view from the view provider.
    /// Returns a key for the tile that can be used for resizing or removing the tile, or 0 on failure.
    AddTileFromViewProvider(resource struct {
        url string;
        provider client_end:fuchsia.ui.app.ViewProvider;
    }) -> (struct {
        key uint32;
    });

    /// Removes the tile with the given key.
    RemoveTile(struct {
        key uint32;
    });

    /// Returns a list of tiles.
    ListTiles() -> (struct {
        keys vector<uint32>;
        urls vector<string>;
        sizes vector<fuchsia.ui.gfx.vec3>;
        focusabilities vector<bool>;
    });

    /// Asks the tiles component to quit.
    Quit();
};
