// 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(string url, bool allow_focus, vector<string>? args) -> (uint32 key);

    /// 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(string url, fuchsia.ui.app.ViewProvider provider) -> (uint32 key);

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

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

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