summaryrefslogtreecommitdiffstats
path: root/mobile/android/components/PresentationDevicePrompt.js
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/components/PresentationDevicePrompt.js')
-rw-r--r--mobile/android/components/PresentationDevicePrompt.js134
1 files changed, 134 insertions, 0 deletions
diff --git a/mobile/android/components/PresentationDevicePrompt.js b/mobile/android/components/PresentationDevicePrompt.js
new file mode 100644
index 000000000..e3e063373
--- /dev/null
+++ b/mobile/android/components/PresentationDevicePrompt.js
@@ -0,0 +1,134 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
+
+Cu.import('resource://gre/modules/XPCOMUtils.jsm');
+Cu.import('resource://gre/modules/Services.jsm');
+
+XPCOMUtils.defineLazyModuleGetter(this, "Prompt",
+ "resource://gre/modules/Prompt.jsm");
+
+XPCOMUtils.defineLazyModuleGetter(this, "UITelemetry",
+ "resource://gre/modules/UITelemetry.jsm");
+
+const kPRESENTATIONDEVICEPROMPT_CONTRACTID = "@mozilla.org/presentation-device/prompt;1";
+const kPRESENTATIONDEVICEPROMPT_CID = Components.ID("{388bd149-c919-4a43-b646-d7ec57877689}");
+
+function debug(aMsg) {
+ // dump("-*- PresentationDevicePrompt: " + aMsg + "\n");
+}
+
+// nsIPresentationDevicePrompt
+function PresentationDevicePrompt() {
+ debug("PresentationDevicePrompt init");
+}
+
+PresentationDevicePrompt.prototype = {
+ classID: kPRESENTATIONDEVICEPROMPT_CID,
+ contractID: kPRESENTATIONDEVICEPROMPT_CONTRACTID,
+ classDescription: "Fennec Presentation Device Prompt",
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIPresentationDevicePrompt]),
+
+ _devices: [], // Store all available presentation devices
+ _request: null, // Store the request from presentation api
+
+ _getString: function(aName) {
+ debug("_getString");
+
+ if (!this.bundle) {
+ this.bundle = Services.strings.createBundle("chrome://browser/locale/devicePrompt.properties");
+ }
+ return this.bundle.GetStringFromName(aName);
+ },
+
+ _loadDevices: function(requestURLs) {
+ debug("_loadDevices");
+
+ let deviceManager = Cc["@mozilla.org/presentation-device/manager;1"]
+ .getService(Ci.nsIPresentationDeviceManager);
+ let devices = deviceManager.getAvailableDevices(requestURLs).QueryInterface(Ci.nsIArray);
+
+ // Re-load the available devices
+ this._devices = [];
+ for (let i = 0; i < devices.length; i++) {
+ let device = devices.queryElementAt(i, Ci.nsIPresentationDevice);
+ this._devices.push(device);
+ }
+ },
+
+ _getPromptMenu: function(aDevices) {
+ debug("_getPromptMenu");
+
+ return aDevices.map(function(device) {
+ return { label: device.name };
+ });
+ },
+
+ _getPrompt: function(aTitle, aMenu) {
+ debug("_getPrompt");
+
+ let p = new Prompt({
+ title: aTitle,
+ });
+
+ p.setSingleChoiceItems(aMenu);
+
+ return p;
+ },
+
+ _showPrompt: function(aPrompt, aCallback) {
+ debug("_showPrompt");
+
+ aPrompt.show(function(data) {
+ let buttonIndex = data.button;
+ aCallback(buttonIndex);
+ });
+ },
+
+ _selectDevice: function(aIndex) {
+ debug("_selectDevice");
+
+ if (!this._request) {
+ return;
+ }
+
+ if (aIndex < 0) { // Cancel request if no selected device,
+ this._request.cancel(Cr.NS_ERROR_DOM_NOT_ALLOWED_ERR);
+ return;
+ } else if (!this._devices.length) { // or there is no available devices
+ this._request.cancel(Cr.NS_ERROR_DOM_NOT_FOUND_ERR);
+ return;
+ }
+
+ this._request.select(this._devices[aIndex]);
+ },
+
+ // This will be fired when window.PresentationRequest(URL).start() is called
+ promptDeviceSelection: function(aRequest) {
+ debug("promptDeviceSelection");
+
+ // Load available presentation devices into this._devices
+ this._loadDevices(aRequest.requestURLs);
+
+ if (!this._devices.length) { // Cancel request if no available device
+ aRequest.cancel(Cr.NS_ERROR_DOM_NOT_FOUND_ERR);
+ return;
+ }
+
+ this._request = aRequest;
+
+ let prompt = this._getPrompt(this._getString("deviceMenu.title"),
+ this._getPromptMenu(this._devices));
+
+ this._showPrompt(prompt, this._selectDevice.bind(this));
+
+ UITelemetry.addEvent("show.1", "dialog", null, "prompt_device_selection");
+ },
+};
+
+this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PresentationDevicePrompt]);