mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-10 17:49:58 +00:00
Implement initial NativeMacReceiverSelector
This commit is contained in:
@@ -9,7 +9,8 @@ import { getWindowCenteredProps } from "./lib/utils";
|
||||
|
||||
import { ReceiverSelectorMediaType
|
||||
, ReceiverSelectorSelectedEvent
|
||||
, PopupReceiverSelectorManager } from "./receiverSelectorManager";
|
||||
, PopupReceiverSelectorManager
|
||||
, NativeMacReceiverSelectorManager } from "./receiverSelectorManager";
|
||||
|
||||
import { Message, Receiver } from "./types";
|
||||
|
||||
@@ -430,12 +431,11 @@ statusBridge.onMessage.addListener(async (message: Message) => {
|
||||
statusBridge.postMessage({
|
||||
subject: "bridge:/initialize"
|
||||
, data: {
|
||||
shouldWatchStatus: true
|
||||
mode: "status"
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
async function onConnectShim (port: browser.runtime.Port) {
|
||||
const bridgeInfo = await getBridgeInfo();
|
||||
if (bridgeInfo && !bridgeInfo.isVersionCompatible) {
|
||||
@@ -512,16 +512,16 @@ async function onConnectShim (port: browser.runtime.Port) {
|
||||
}
|
||||
|
||||
case "main:/sessionCreated": {
|
||||
PopupReceiverSelectorManager.close();
|
||||
NativeMacReceiverSelectorManager.close();
|
||||
break;
|
||||
}
|
||||
|
||||
case "main:/selectReceiverBegin": {
|
||||
PopupReceiverSelectorManager.open(
|
||||
NativeMacReceiverSelectorManager.open(
|
||||
Array.from(statusBridgeReceivers.values())
|
||||
, message.data.defaultMediaType);
|
||||
|
||||
PopupReceiverSelectorManager.addEventListener("selected"
|
||||
NativeMacReceiverSelectorManager.addEventListener("selected"
|
||||
, (ev: ReceiverSelectorSelectedEvent) => {
|
||||
|
||||
port.postMessage({
|
||||
@@ -532,13 +532,13 @@ async function onConnectShim (port: browser.runtime.Port) {
|
||||
});
|
||||
});
|
||||
|
||||
PopupReceiverSelectorManager.addEventListener("cancelled", () => {
|
||||
NativeMacReceiverSelectorManager.addEventListener("cancelled", () => {
|
||||
port.postMessage({
|
||||
subject: "shim:/selectReceiverCancelled"
|
||||
});
|
||||
});
|
||||
|
||||
PopupReceiverSelectorManager.addEventListener("error", () => {
|
||||
NativeMacReceiverSelectorManager.addEventListener("error", () => {
|
||||
// TODO: Report errors properly
|
||||
port.postMessage({
|
||||
subject: "shim:/selectReceiverCancelled"
|
||||
|
||||
@@ -23,3 +23,18 @@ export interface ServiceUpMessage extends Message {
|
||||
data: Receiver;
|
||||
}
|
||||
|
||||
|
||||
export interface NativeReceiverSelectorSelectedMessage extends Message {
|
||||
subject: "main:/receiverSelector/selected"
|
||||
, data: Receiver
|
||||
}
|
||||
|
||||
export interface NativeReceiverSelectorCloseMessage extends Message {
|
||||
subject: "main:/receiverSelector/error"
|
||||
, data: string
|
||||
}
|
||||
|
||||
export interface NativeReceiverSelectorErrorMessage extends Message {
|
||||
subject: "main:/receiverSelector/error"
|
||||
, data: string
|
||||
}
|
||||
|
||||
@@ -5,19 +5,102 @@ import ReceiverSelectorManager, {
|
||||
|
||||
import { Message, Receiver } from "../../types";
|
||||
|
||||
import { NativeReceiverSelectorSelectedMessage
|
||||
, NativeReceiverSelectorErrorMessage
|
||||
, NativeReceiverSelectorCloseMessage } from "../../messageTypes";
|
||||
|
||||
|
||||
const _ = browser.i18n.getMessage;
|
||||
|
||||
|
||||
class NativeMacReceiverSelectorManager
|
||||
extends EventTarget
|
||||
implements ReceiverSelectorManager {
|
||||
|
||||
private bridgePort: browser.runtime.Port;
|
||||
private bridgePortDisconnected: boolean = false;
|
||||
|
||||
private wasReceiverSelected: boolean = false;
|
||||
|
||||
|
||||
public async open (
|
||||
receivers: Receiver[]
|
||||
, defaultMediaType: ReceiverSelectorMediaType): Promise<void> {
|
||||
console.info("STUB :: NativeMacReceiverSelectorManager.open");
|
||||
|
||||
this.bridgePort = browser.runtime.connectNative(APPLICATION_NAME);
|
||||
|
||||
this.bridgePort.onMessage.addListener((message: Message) => {
|
||||
switch (message.subject) {
|
||||
case "main:/receiverSelector/selected": {
|
||||
this.onBridgePortMessageSelected(
|
||||
message as NativeReceiverSelectorSelectedMessage);
|
||||
break;
|
||||
}
|
||||
case "main:/receiverSelector/error": {
|
||||
this.onBridgePortMessageError(
|
||||
message as NativeReceiverSelectorErrorMessage);
|
||||
break;
|
||||
}
|
||||
case "main:/receiverSelector/close": {
|
||||
this.onBridgePortMessageClose(
|
||||
message as NativeReceiverSelectorCloseMessage);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
this.bridgePort.onDisconnect.addListener(() => {
|
||||
this.bridgePortDisconnected = true;
|
||||
});
|
||||
|
||||
this.bridgePort.postMessage({
|
||||
subject: "bridge:/receiverSelector/open"
|
||||
, data: JSON.stringify({
|
||||
receivers
|
||||
, defaultMediaType
|
||||
, i18n_mediaTypeApp: _("popupMediaTypeApp")
|
||||
, i18n_mediaTypeTab: _("popupMediaTypeTab")
|
||||
, i18n_mediaTypeScreen: _("popupMediaTypeScreen")
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
public close (): void {
|
||||
console.info("STUB :: NativeMacReceiverSelectorManager.close");
|
||||
if (this.bridgePort && !this.bridgePortDisconnected) {
|
||||
this.bridgePort.postMessage({
|
||||
subject: "bridge:/receiverSelector/close"
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private onBridgePortMessageSelected (
|
||||
message: NativeReceiverSelectorSelectedMessage) {
|
||||
this.wasReceiverSelected = true;
|
||||
this.dispatchEvent(new CustomEvent("selected", {
|
||||
detail: message.data
|
||||
}));
|
||||
}
|
||||
|
||||
private onBridgePortMessageError (
|
||||
message: NativeReceiverSelectorErrorMessage) {
|
||||
this.dispatchEvent(new CustomEvent("error"));
|
||||
}
|
||||
|
||||
private onBridgePortMessageClose (
|
||||
message: NativeReceiverSelectorCloseMessage) {
|
||||
|
||||
if (!this.wasReceiverSelected) {
|
||||
this.dispatchEvent(new CustomEvent("cancelled"));
|
||||
}
|
||||
|
||||
if (!this.bridgePortDisconnected) {
|
||||
this.bridgePort.disconnect();
|
||||
}
|
||||
|
||||
this.bridgePort = null;
|
||||
this.bridgePortDisconnected = false;
|
||||
this.wasReceiverSelected = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user