Implement initial NativeMacReceiverSelector

This commit is contained in:
hensm
2019-05-01 19:19:33 +01:00
committed by Matt Hensman
parent 3f8dd90938
commit 85c4d11ebf
10 changed files with 554 additions and 64 deletions

View File

@@ -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"

View File

@@ -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
}

View File

@@ -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;
}
}