// 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.math;
using fuchsia.ui.app;

[Discoverable]
interface 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.math.SizeF> sizes, vector<bool> focusabilities);

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