Add stop action to receiver selectors

This commit is contained in:
hensm
2020-01-16 00:47:38 +00:00
parent 4858642caa
commit 9295d8ee83
15 changed files with 219 additions and 30 deletions

View File

@@ -64,6 +64,17 @@ export default new class StatusManager
}
}
public async stopReceiverApp (receiver: Receiver) {
if (!this.bridgePort) {
return;
}
this.bridgePort.postMessage({
subject: "bridge:/stopReceiverApp"
, data: { receiver }
});
}
private async createBridgePort () {
const bridgePort = await bridge.connect();
bridgePort.onMessage.addListener(this.onBridgePortMessage);

View File

@@ -65,6 +65,12 @@ export default class NativeReceiverSelector
this.onBridgePortMessageClose();
break;
}
case "main:/receiverSelector/stop": {
this.dispatchEvent(new CustomEvent("stop", {
detail: message.data
}));
break;
}
}
});
@@ -96,6 +102,7 @@ export default class NativeReceiverSelector
, i18n_extensionName: _("extensionName")
, i18n_castButtonTitle: _("popupCastButtonTitle")
, i18n_stopButtonTitle: _("popupStopButtonTitle")
, i18n_mediaTypeApp:
knownApps[requestedAppId] ?? _("popupMediaTypeApp")
, i18n_mediaTypeTab: _("popupMediaTypeTab")

View File

@@ -154,6 +154,14 @@ export default class PopupReceiverSelector
break;
}
case "receiverSelector:/stop": {
this.dispatchEvent(new CustomEvent("stop", {
detail: message.data
}));
break;
}
}
}

View File

@@ -22,6 +22,7 @@ export interface ReceiverSelectorEvents {
"selected": ReceiverSelection;
"error": string;
"cancelled": void;
"stop": { receiver: Receiver };
}
export default interface ReceiverSelector

View File

@@ -17,6 +17,8 @@ import { ReceiverSelection
import NativeReceiverSelector from "./NativeReceiverSelector";
import PopupReceiverSelector from "./PopupReceiverSelector";
import { Receiver } from "../../types";
async function createSelector () {
const type = await options.get("receiverSelectorType");
@@ -60,9 +62,18 @@ async function getSelection (
: Promise<ReceiverSelection> {
return new Promise(async (resolve, reject) => {
const currentShim = ShimManager.getShim(
let currentShim = ShimManager.getShim(
contextTabId, contextFrameId);
/**
* If the current context is running the mirroring app, pretend
* it doesn't exist because it shouldn't be launched like this.
*/
if (currentShim?.requestedAppId ===
await options.get("mirroringAppId")) {
currentShim = null;
}
let defaultMediaType = ReceiverSelectorMediaType.Tab;
let availableMediaTypes;
@@ -107,20 +118,43 @@ async function getSelection (
// Get a new selector for each selection
sharedSelector = await createSelector();
sharedSelector.addEventListener("selected", ev => {
sharedSelector.addEventListener("selected", onSelected);
sharedSelector.addEventListener("cancelled", onCancelled);
sharedSelector.addEventListener("error", onError);
sharedSelector.addEventListener("stop", onStop);
function removeListeners () {
sharedSelector.removeEventListener("selected", onSelected);
sharedSelector.removeEventListener("cancelled", onCancelled);
sharedSelector.removeEventListener("error", onError);
sharedSelector.removeEventListener("stop", onStop);
}
function onSelected (ev: any) {
console.info("fx_cast (Debug): Selected receiver", ev.detail);
resolve(ev.detail);
});
removeListeners();
}
sharedSelector.addEventListener("cancelled", () => {
function onCancelled () {
console.info("fx_cast (Debug): Cancelled receiver selection");
resolve(null);
});
removeListeners();
}
sharedSelector.addEventListener("error", () => {
function onError () {
console.error("fx_cast (Debug): Failed to select receiver");
reject();
});
removeListeners();
}
function onStop (ev: any) {
console.info("fx_cast (Debug): Stopped receiver app", ev.detail);
StatusManager.init().then(() => {
StatusManager.stopReceiverApp(ev.detail.receiver);
});
}
// Ensure status manager is initialized