Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Fix unwanted ringing of other devices even though the user is already connected to the call. #12742

Merged
merged 2 commits into from
Jul 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion src/Notifier.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
toger5 marked this conversation as resolved.
Show resolved Hide resolved

import { MatrixClientPeg } from "./MatrixClientPeg";
import { PosthogAnalytics } from "./PosthogAnalytics";
Expand Down Expand Up @@ -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();
Expand Down
38 changes: 38 additions & 0 deletions test/Notifier-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Comment on lines +29 to +32
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ditto. Seems like matrixrtc should have an index with all its public exports and we should allowlist that and consume that

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for making me finally take care of this...
matrix-org/matrix-js-sdk#4314
and
#12780

I dont think this fits into this PR and I would like to not block this PR on the js-sdk fix (its rather annoying to not have the ringing stop)

So my proposal would be to merge this without the lint rules and I keep the other PR's ontop of this so we can review and merge them independently?


import BasePlatform from "../src/BasePlatform";
import Notifier from "../src/Notifier";
Expand Down Expand Up @@ -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 = {
Expand Down Expand Up @@ -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);

Expand Down
Loading