// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
if ((typeof mojo === 'undefined') || !mojo.bindingsLibraryInitialized) {
loadScript('mojo_bindings_lite');
}
loadScript('url/mojom/url.mojom-lite');
loadScript('chromeos.remote_apps.mojom-lite');
class RemoteAppsAdapter {
constructor() {
const factory = chromeos.remoteApps.mojom.RemoteAppsFactory.getRemote();
this.remoteApps_ = new chromeos.remoteApps.mojom.RemoteAppsRemote();
this.callbackRouter_ =
new chromeos.remoteApps.mojom.RemoteAppLaunchObserverCallbackRouter();
factory.bindRemoteAppsAndAppLaunchObserver(
chrome.runtime.id, this.remoteApps_.$.bindNewPipeAndPassReceiver(),
this.callbackRouter_.$.bindNewPipeAndPassRemote());
}
/**
* Adds a folder to the launcher. Note that empty folders are not shown in
* the launcher.
* @param {string} name name of the added folder
* @param {boolean} [add_to_front=false] true if the folder should be added
* to the front of the app list. Defaults to false.
* @return {!Promise<!{folderId?: string, error?: string}>} ID for the added
* folder
*/
async addFolder(name, add_to_front = false) {
const addFolderResult =
await this.remoteApps_.addFolder(name, add_to_front);
return addFolderResult.result;
}
/**
* Adds an app to the launcher.
* @param {string} name name of the added app
* @param {string} folderId ID of the parent folder. An empty string
* indicates the app does not have a parent folder.
* @param {string} iconUrl URL to an image representing the app's icon
* @param {boolean} [add_to_front=false] true if the app should be added to
* the front of the app list. Defaults to false. Has no effect if the app
* has a parent folder.
* @return {!Promise<!{appId?: string, error?: string}>} ID for the
* added app.
*/
async addApp(name, folderId, iconUrl, add_to_front = false) {
const addAppResult = await this.remoteApps_.addApp(
chrome.runtime.id, name, folderId, {url: iconUrl}, add_to_front);
return addAppResult.result;
}
/**
* Deletes an app that was previously added by |addApp()|. If the app was in
* a folder and the folder would become empty, the folder is hidden.
* @param {string} appId ID of the app to delete.
* @return {!Promise<!{error: string}>} error if any.
*/
deleteApp(appId) {
return this.remoteApps_.deleteApp(appId);
}
/**
* Adds a callback for remote app launch events.
* @param {function(string)} callback called when a remote app is launched
* with the app ID as argument.
* @return {!Promise<void>}
*/
addRemoteAppLaunchObserver(callback) {
// The second parameter from the |OnRemoteAppLaunched| Mojo method,
// |source_id|, is dropped.
return this.callbackRouter_.onRemoteAppLaunched.addListener(
(app_id) => callback(app_id));
}
}
exports.$set('returnValue', new RemoteAppsAdapter());