diff --git a/src/Notifier.ts b/src/Notifier.ts index fbe3add75b..35362738ca 100644 --- a/src/Notifier.ts +++ b/src/Notifier.ts @@ -32,6 +32,8 @@ import { } from "matrix-js-sdk/src/matrix"; import { logger } from "matrix-js-sdk/src/logger"; import { PermissionChanged as PermissionChangedEvent } from "@matrix-org/analytics-events/types/typescript/PermissionChanged"; +// eslint-disable-next-line no-restricted-imports +import { MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc/MatrixRTCSession"; import { MatrixClientPeg } from "./MatrixClientPeg"; import { PosthogAnalytics } from "./PosthogAnalytics"; @@ -505,10 +507,16 @@ class NotifierClass { * Some events require special handling such as showing in-app toasts */ private performCustomEventHandling(ev: MatrixEvent): void { + const cli = MatrixClientPeg.safeGet(); + const room = cli.getRoom(ev.getRoomId()); + const thisUserHasConnectedDevice = + room && MatrixRTCSession.callMembershipsForRoom(room).some((m) => m.sender === cli.getUserId()); + if ( EventType.CallNotify === ev.getType() && SettingsStore.getValue("feature_group_calls") && - (ev.getAge() ?? 0) < 10000 + (ev.getAge() ?? 0) < 10000 && + !thisUserHasConnectedDevice ) { const content = ev.getContent(); const roomId = ev.getRoomId(); diff --git a/test/Notifier-test.ts b/test/Notifier-test.ts index a47b6cf5a4..224de7d8eb 100644 --- a/test/Notifier-test.ts +++ b/test/Notifier-test.ts @@ -26,6 +26,10 @@ import { SyncState, } from "matrix-js-sdk/src/matrix"; import { waitFor } from "@testing-library/react"; +// eslint-disable-next-line no-restricted-imports +import { MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc/MatrixRTCSession"; +// eslint-disable-next-line no-restricted-imports +import { CallMembership } from "matrix-js-sdk/src/matrixrtc/CallMembership"; import BasePlatform from "../src/BasePlatform"; import Notifier from "../src/Notifier"; @@ -139,6 +143,11 @@ describe("Notifier", () => { getRoom: jest.fn(), getPushActionsForEvent: jest.fn(), supportsThreads: jest.fn().mockReturnValue(false), + matrixRTC: { + on: jest.fn(), + off: jest.fn(), + getRoomSession: jest.fn(), + }, }); mockClient.pushRules = { @@ -455,6 +464,35 @@ describe("Notifier", () => { expect(ToastStore.sharedInstance().addOrReplaceToast).not.toHaveBeenCalled(); }); + it("should not show toast when group call is already connected", () => { + setGroupCallsEnabled(true); + const spyCallMemberships = jest.spyOn(MatrixRTCSession, "callMembershipsForRoom").mockReturnValue([ + new CallMembership( + mkEvent({ + event: true, + room: testRoom.roomId, + user: userId, + type: EventType.GroupCallMemberPrefix, + content: {}, + }), + { + call_id: "123", + application: "m.call", + focus_active: { type: "livekit" }, + foci_preferred: [], + device_id: "DEVICE", + }, + ), + ]); + + const roomSession = MatrixRTCSession.roomSessionForRoom(mockClient, testRoom); + + mockClient.matrixRTC.getRoomSession.mockReturnValue(roomSession); + emitCallNotifyEvent(); + expect(ToastStore.sharedInstance().addOrReplaceToast).not.toHaveBeenCalled(); + spyCallMemberships.mockRestore(); + }); + it("should not show toast when calling with non-group call event", () => { setGroupCallsEnabled(true);