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

Commit

Permalink
Only notify for first broadcast chunk (#9901)
Browse files Browse the repository at this point in the history
* Only notify for first broadcast chunk

* Trigger CI
  • Loading branch information
weeman1337 authored Jan 17, 2023
1 parent fe0d3a7 commit 22a2a93
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 7 deletions.
15 changes: 13 additions & 2 deletions src/Notifier.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ import { localNotificationsAreSilenced, createLocalNotificationSettingsIfNeeded
import { getIncomingCallToastKey, IncomingCallToast } from "./toasts/IncomingCallToast";
import ToastStore from "./stores/ToastStore";
import { ElementCall } from "./models/Call";
import { VoiceBroadcastChunkEventType } from "./voice-broadcast";
import { VoiceBroadcastChunkEventType, VoiceBroadcastInfoEventType } from "./voice-broadcast";
import { getSenderName } from "./utils/event/getSenderName";

/*
* Dispatches:
Expand Down Expand Up @@ -80,9 +81,16 @@ const msgTypeHandlers = {
},
[MsgType.Audio]: (event: MatrixEvent): string | null => {
if (event.getContent()?.[VoiceBroadcastChunkEventType]) {
// mute broadcast chunks
if (event.getContent()?.[VoiceBroadcastChunkEventType]?.sequence === 1) {
// Show a notification for the first broadcast chunk.
// At this point a user received something to listen to.
return _t("%(senderName)s started a voice broadcast", { senderName: getSenderName(event) });
}

// Mute other broadcast chunks
return null;
}

return TextForEvent.textForEvent(event);
},
};
Expand Down Expand Up @@ -448,6 +456,9 @@ export const Notifier = {
},

_evaluateEvent: function (ev: MatrixEvent) {
// Mute notifications for broadcast info events
if (ev.getType() === VoiceBroadcastInfoEventType) return;

let roomId = ev.getRoomId();
if (LegacyCallHandler.instance.getSupportsVirtualRooms()) {
// Attempt to translate a virtual room to a native one
Expand Down
1 change: 1 addition & 0 deletions src/i18n/strings/en_EN.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@
"Empty room (was %(oldName)s)": "Empty room (was %(oldName)s)",
"Default Device": "Default Device",
"%(name)s is requesting verification": "%(name)s is requesting verification",
"%(senderName)s started a voice broadcast": "%(senderName)s started a voice broadcast",
"%(brand)s does not have permission to send you notifications - please check your browser settings": "%(brand)s does not have permission to send you notifications - please check your browser settings",
"%(brand)s was not given permission to send notifications - please try again": "%(brand)s was not given permission to send notifications - please try again",
"Unable to enable Notifications": "Unable to enable Notifications",
Expand Down
41 changes: 36 additions & 5 deletions test/Notifier-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ import { mkThread } from "./test-utils/threads";
import dis from "../src/dispatcher/dispatcher";
import { ThreadPayload } from "../src/dispatcher/payloads/ThreadPayload";
import { Action } from "../src/dispatcher/actions";
import { VoiceBroadcastChunkEventType } from "../src/voice-broadcast";
import { VoiceBroadcastChunkEventType, VoiceBroadcastInfoState } from "../src/voice-broadcast";
import { mkVoiceBroadcastInfoStateEvent } from "./voice-broadcast/utils/test-utils";

jest.mock("../src/utils/notifications", () => ({
// @ts-ignore
Expand Down Expand Up @@ -75,8 +76,8 @@ describe("Notifier", () => {
});
};

const mkAudioEvent = (broadcastChunk = false): MatrixEvent => {
const chunkContent = broadcastChunk ? { [VoiceBroadcastChunkEventType]: {} } : {};
const mkAudioEvent = (broadcastChunkContent?: object): MatrixEvent => {
const chunkContent = broadcastChunkContent ? { [VoiceBroadcastChunkEventType]: broadcastChunkContent } : {};

return mkEvent({
event: true,
Expand Down Expand Up @@ -289,8 +290,20 @@ describe("Notifier", () => {
);
});

it("should not display a notification for a broadcast chunk", () => {
const audioEvent = mkAudioEvent(true);
it("should display the expected notification for a broadcast chunk with sequence = 1", () => {
const audioEvent = mkAudioEvent({ sequence: 1 });
Notifier._displayPopupNotification(audioEvent, testRoom);
expect(MockPlatform.displayNotification).toHaveBeenCalledWith(
"@user:example.com (!room1:server)",
"@user:example.com started a voice broadcast",
"data:image/png;base64,00",
testRoom,
audioEvent,
);
});

it("should display the expected notification for a broadcast chunk with sequence = 1", () => {
const audioEvent = mkAudioEvent({ sequence: 2 });
Notifier._displayPopupNotification(audioEvent, testRoom);
expect(MockPlatform.displayNotification).not.toHaveBeenCalled();
});
Expand Down Expand Up @@ -499,6 +512,24 @@ describe("Notifier", () => {
Notifier._evaluateEvent(mkAudioEvent());
expect(Notifier._displayPopupNotification).toHaveBeenCalledTimes(1);
});

it("should not show a notification for broadcast info events in any case", () => {
// Let client decide to show a notification
mockClient.getPushActionsForEvent.mockReturnValue({
notify: true,
tweaks: {},
});

const broadcastStartedEvent = mkVoiceBroadcastInfoStateEvent(
"!other:example.org",
VoiceBroadcastInfoState.Started,
"@user:example.com",
"ABC123",
);

Notifier._evaluateEvent(broadcastStartedEvent);
expect(Notifier._displayPopupNotification).not.toHaveBeenCalled();
});
});

describe("setPromptHidden", () => {
Expand Down

0 comments on commit 22a2a93

Please sign in to comment.