import Exchange from '../Exchange/Exchange';
import { CloseEvent } from './events';
import IOpenLinkOptions, { IDeprecatedOpenLinkOptions } from './IOpenLinkOptions';
import { IBrowserMessage } from './messages';
import IBrowser from './IBrowser';
/**
 * There are several use cases when you need to open a web browser on a touch-enabled device (also known as a tablet). For these cases, you can use a custom web browser we built. Default URL can be opened and even the whitelisting/blacklisting of certain domains is supported.
 *
 * :::info
 *
 * **This API is currently available on:**
 * - Android devices with Android 5+ (Philips, Benq, Sharp, generic Android device)
 *
 * **With some limitations, you can also use this API on**
 * - Samsung Tizen (SSSP 4 and above); where the website is just in fullscreen without an address bar or theme options (headless mode)
 * - LG webOS (webOS 3.0 and above); where the website is just in fullscreen without an address bar or theme options (headless mode)
 * - Linux (Fedora, Ubuntu), Raspberry Pi, NEC Compute Module; where the website is just in fullscreen without an address bar or theme options (headless mode)
 * - BrightSign; where the website is just in fullscreen without an address bar or theme options (headless mode)
 * :::
 *
 * <details>
 *     <summary>Device Browser Capabilities</summary>
 * 		| Capability | Description |
 * 		|:------------|:-------------|
 * 		| `BROWSER` | If device can open browser with custom URL |
 *
 * 		If you want to check if the device supports this capability, use [`sos.display.supports()`](https://developers.signageos.io/sdk/sos/display#supports).
 * </details>
 */
export default class Browser implements IBrowser {
    private readonly exchange;
    private readonly events;
    /** @internal */
    constructor(exchange: Exchange<void>);
    /**
     * The `open()` method opens the specified url in a browser window.
     *
     * @param uri The URL to open in the browser.
     * @param options Optional parameters to configure the browser window.
     * @param options.aclDomains List of domains to be interpreted according to `aclMode`. Example: `signageos.io`, `www.example.com`
     * @param options.aclMode `blacklist` – Allow access to all domains except those in aclDomains and their subdomains, `whitelist` – Allow access only to domains in aclDomains and their subdomains.
     * @param options.readOnlyAddressBar If `true`, the address bar is read-only, if `false` the user can navigate away by entering a URL in the address bar.
     * @param options.idleTimeout The browser will automatically close after a specified period of inactivity (in milliseconds).
     * @param options.coordinates Size and position of the browser window. Defaults to fullscreen.
     * @param options.theme Specify custom UI theme. (Android only)
     * @param options.headlessMode Headless mode hides the entire address bar. (Android only)
     * @param options.canUserClose Whether the user can manually close the browser. (default if headless false, else true)
     * @param options.clearData Clear cache after the browser closes. (default if headless false, else true)
     * @param options.method Can only be native (which opens a new, fully sandboxed fullscreen window) or iframe (which opens a configurable-sized window). (only Linux)
     * @returns {Promise<void>} A promise that resolves when the browser is opened.
     * @throws {Error} If the `uri` is not a valid URL or string.
     * @throws {Error} If the `options` are not valid.
     * @throws {Error} If unexpected error occurred when opening link.
     * @since 4.0.0
     *
     * @example // {@link https://github.com/signageos/applet-examples/tree/master/examples/content-js-api/browser | Example of Applet for using browser on Android }
     *
     * @example
     * await sos.browser.open('https://www.signageos.io', {
     * 	aclDomains: ['google.com', 'yahoo.com'],
     * 	aclMode: 'blacklist', // or 'whitelist'
     * 	readOnlyAddressBar: true,
     * 	coordinates: { // Supported only on Linux and Android
     * 		x: 0,
     * 		y: 0,
     * 		height: 500,
     * 		width: 500,
     * 	},
     * 	// theme: { ... }
     * 	headlessMode: false,
     * });
     */
    open(uri: string, options?: IOpenLinkOptions): Promise<void>;
    /**
     * The `close()` method closes the browser window opened by the `open()` method.
     *
     * @returns {Promise<void>} A promise that resolves when the browser is closed.
     * @since 4.0.0
     *
     * @example
     * await sos.browser.open('https://www.signageos.io', {
     * 	readOnlyAddressBar: true,
     * });
     * // some time later
     * await sos.browser.close();
     */
    close(): Promise<void>;
    /**
     * The `onClose()` method sets up a listener, which is called whenever a browser window is closed. This can happen by an API call, by a
     * user request or after a timeout. This doesn't fire between `open` calls or on subsequent `close` calls.
     *
     * @param listener The listener to be called when the browser is closed.
     * @returns {void} A callback which removes the listener.
     */
    onClose(listener: (event: CloseEvent) => void): () => void;
    /** @internal */
    handleMessageData(data: IBrowserMessage): void;
    /**
     * @deprecated use `sos.browser.open()` instead
     */
    openLink(uri: string, options?: IDeprecatedOpenLinkOptions): Promise<void>;
}
