diff --git a/src/models/Call.ts b/src/models/Call.ts index 60ff2b2ffa..70c7e4779f 100644 --- a/src/models/Call.ts +++ b/src/models/Call.ts @@ -85,15 +85,9 @@ export enum ConnectionState { export const isConnected = (state: ConnectionState): boolean => state === ConnectionState.Connected || state === ConnectionState.Disconnecting; -export enum Layout { - Tile = "tile", - Spotlight = "spotlight", -} - export enum CallEvent { ConnectionState = "connection_state", Participants = "participants", - Layout = "layout", Close = "close", Destroy = "destroy", } @@ -104,7 +98,6 @@ interface CallEventHandlerMap { participants: Map>, prevParticipants: Map>, ) => void; - [CallEvent.Layout]: (layout: Layout) => void; [CallEvent.Close]: () => void; [CallEvent.Destroy]: () => void; } @@ -658,14 +651,6 @@ export class ElementCall extends Call { private settingsStoreCallEncryptionWatcher?: string; private terminationTimer?: number; - private _layout = Layout.Tile; - public get layout(): Layout { - return this._layout; - } - protected set layout(value: Layout) { - this._layout = value; - this.emit(CallEvent.Layout, value); - } public get presented(): boolean { return super.presented; @@ -686,7 +671,6 @@ export class ElementCall extends Call { const params = new URLSearchParams({ embed: "true", // We're embedding EC within another application // Template variables are used, so that this can be configured using the widget data. - preload: "$preload", // We want it to load in the background. skipLobby: "$skipLobby", // Skip the lobby in case we show a lobby component of our own. returnToLobby: "$returnToLobby", // Returns to the lobby (instead of blank screen) when the call ends. (For video rooms) perParticipantE2EE: "$perParticipantE2EE", @@ -756,17 +740,13 @@ export class ElementCall extends Call { } // Creates a new widget if there isn't any widget of typ Call in this room. - // Defaults for creating a new widget are: skipLobby = false, preload = false + // Defaults for creating a new widget are: skipLobby = false // When there is already a widget the current widget configuration will be used or can be overwritten - // by passing the according parameters (skipLobby, preload). - // - // `preload` is deprecated. We used it for optimizing EC by using a custom EW call lobby and preloading the iframe. - // now it should always be false. + // by passing the according parameters (skipLobby). private static createOrGetCallWidget( roomId: string, client: MatrixClient, skipLobby: boolean | undefined, - preload: boolean | undefined, returnToLobby: boolean | undefined, ): IApp { const ecWidget = WidgetStore.instance.getApps(roomId).find((app) => WidgetType.CALL.matches(app.type)); @@ -777,9 +757,6 @@ export class ElementCall extends Call { if (skipLobby !== undefined) { overwrites.skipLobby = skipLobby; } - if (preload !== undefined) { - overwrites.preload = preload; - } if (returnToLobby !== undefined) { overwrites.returnToLobby = returnToLobby; } @@ -804,7 +781,6 @@ export class ElementCall extends Call { {}, { skipLobby: skipLobby ?? false, - preload: preload ?? false, returnToLobby: returnToLobby ?? false, }, ), @@ -870,7 +846,6 @@ export class ElementCall extends Call { room.roomId, room.client, undefined, - undefined, isVideoRoom(room), ); return new ElementCall(session, availableOrCreatedWidget, room.client); @@ -880,7 +855,7 @@ export class ElementCall extends Call { } public static create(room: Room, skipLobby = false): void { - ElementCall.createOrGetCallWidget(room.roomId, room.client, skipLobby, false, isVideoRoom(room)); + ElementCall.createOrGetCallWidget(room.roomId, room.client, skipLobby, isVideoRoom(room)); } protected async sendCallNotify(): Promise { @@ -912,19 +887,6 @@ export class ElementCall extends Call { audioInput: MediaDeviceInfo | null, videoInput: MediaDeviceInfo | null, ): Promise { - // The JoinCall action is only send if the widget is waiting for it. - if (this.widget.data?.preload) { - try { - await this.messaging!.transport.send(ElementWidgetActions.JoinCall, { - audioInput: audioInput?.label ?? null, - videoInput: videoInput?.label ?? null, - }); - } catch (e) { - throw new Error(`Failed to join call in room ${this.roomId}: ${e}`); - } - } - this.messaging!.on(`action:${ElementWidgetActions.TileLayout}`, this.onTileLayout); - this.messaging!.on(`action:${ElementWidgetActions.SpotlightLayout}`, this.onSpotlightLayout); this.messaging!.on(`action:${ElementWidgetActions.HangupCall}`, this.onHangup); this.messaging!.once(`action:${ElementWidgetActions.Close}`, this.onClose); this.messaging!.on(`action:${ElementWidgetActions.DeviceMute}`, this.onDeviceMute); @@ -968,8 +930,6 @@ export class ElementCall extends Call { } public setDisconnected(): void { - this.messaging!.off(`action:${ElementWidgetActions.TileLayout}`, this.onTileLayout); - this.messaging!.off(`action:${ElementWidgetActions.SpotlightLayout}`, this.onSpotlightLayout); this.messaging!.off(`action:${ElementWidgetActions.HangupCall}`, this.onHangup); this.messaging!.off(`action:${ElementWidgetActions.DeviceMute}`, this.onDeviceMute); super.setDisconnected(); @@ -994,15 +954,6 @@ export class ElementCall extends Call { if (this.session.memberships.length === 0 && !this.presented && !this.room.isCallRoom()) this.destroy(); }; - /** - * Sets the call's layout. - * @param layout The layout to switch to. - */ - public async setLayout(layout: Layout): Promise { - const action = layout === Layout.Tile ? ElementWidgetActions.TileLayout : ElementWidgetActions.SpotlightLayout; - await this.messaging!.transport.send(action, {}); - } - private readonly onMembershipChanged = (): void => this.updateParticipants(); private updateParticipants(): void { @@ -1046,18 +997,6 @@ export class ElementCall extends Call { this.close(); }; - private readonly onTileLayout = async (ev: CustomEvent): Promise => { - ev.preventDefault(); - this.layout = Layout.Tile; - this.messaging!.transport.reply(ev.detail, {}); // ack - }; - - private readonly onSpotlightLayout = async (ev: CustomEvent): Promise => { - ev.preventDefault(); - this.layout = Layout.Spotlight; - this.messaging!.transport.reply(ev.detail, {}); // ack - }; - public clean(): Promise { return Promise.resolve(); } diff --git a/test/unit-tests/models/Call-test.ts b/test/unit-tests/models/Call-test.ts index c8f9d50334..de5c42fc9c 100644 --- a/test/unit-tests/models/Call-test.ts +++ b/test/unit-tests/models/Call-test.ts @@ -34,7 +34,6 @@ import type { Mocked } from "jest-mock"; import type { ClientWidgetApi } from "matrix-widget-api"; import { type JitsiCallMemberContent, - Layout, Call, CallEvent, ConnectionState, @@ -895,13 +894,6 @@ describe("ElementCall", () => { expect(call.connectionState).toBe(ConnectionState.Connected); }); - it("fails to connect if the widget returns an error", async () => { - // we only send a JoinCall action if the widget is preloading - call.widget.data = { ...call.widget, preload: true }; - mocked(messaging.transport).send.mockRejectedValue(new Error("never!!1! >:(")); - await expect(call.start()).rejects.toBeDefined(); - }); - it("fails to disconnect if the widget returns an error", async () => { await callConnectProcedure(call); mocked(messaging.transport).send.mockRejectedValue(new Error("never!!1! >:(")); @@ -948,33 +940,6 @@ describe("ElementCall", () => { expect(call.connectionState).toBe(ConnectionState.Disconnected); }); - it("tracks layout", async () => { - await callConnectProcedure(call); - expect(call.layout).toBe(Layout.Tile); - - messaging.emit( - `action:${ElementWidgetActions.SpotlightLayout}`, - new CustomEvent("widgetapirequest", { detail: {} }), - ); - expect(call.layout).toBe(Layout.Spotlight); - - messaging.emit( - `action:${ElementWidgetActions.TileLayout}`, - new CustomEvent("widgetapirequest", { detail: {} }), - ); - expect(call.layout).toBe(Layout.Tile); - }); - - it("sets layout", async () => { - await callConnectProcedure(call); - - await call.setLayout(Layout.Spotlight); - expect(messaging.transport.send).toHaveBeenCalledWith(ElementWidgetActions.SpotlightLayout, {}); - - await call.setLayout(Layout.Tile); - expect(messaging.transport.send).toHaveBeenCalledWith(ElementWidgetActions.TileLayout, {}); - }); - it("acknowledges mute_device widget action", async () => { await callConnectProcedure(call); const preventDefault = jest.fn(); @@ -1014,24 +979,6 @@ describe("ElementCall", () => { call.off(CallEvent.Participants, onParticipants); }); - it("emits events when layout changes", async () => { - await callConnectProcedure(call); - const onLayout = jest.fn(); - call.on(CallEvent.Layout, onLayout); - - messaging.emit( - `action:${ElementWidgetActions.SpotlightLayout}`, - new CustomEvent("widgetapirequest", { detail: {} }), - ); - messaging.emit( - `action:${ElementWidgetActions.TileLayout}`, - new CustomEvent("widgetapirequest", { detail: {} }), - ); - expect(onLayout.mock.calls).toEqual([[Layout.Spotlight], [Layout.Tile]]); - - call.off(CallEvent.Layout, onLayout); - }); - it("ends the call immediately if the session ended", async () => { await callConnectProcedure(call); const onDestroy = jest.fn();