{_t("Homeserver is")}
{MatrixClientPeg.get().getHomeserverUrl()}
{_t("Identity Server is")}
{MatrixClientPeg.get().getIdentityServerUrl()}
- {_t("Access Token:") + ' '}
-
- <{ _t("click to reveal") }>
-
+
+
+ {_t("Access Token")}
+ {_t("Your access token gives full access to your account."
+ + " Do not share it with anyone." )}
+
+
{MatrixClientPeg.get().getAccessToken()}
+
+
+
{_t("Clear cache and reload")}
diff --git a/src/components/views/voice_messages/LiveRecordingWaveform.tsx b/src/components/views/voice_messages/LiveRecordingWaveform.tsx
index e7c34c9177..aab89f6ab1 100644
--- a/src/components/views/voice_messages/LiveRecordingWaveform.tsx
+++ b/src/components/views/voice_messages/LiveRecordingWaveform.tsx
@@ -15,12 +15,11 @@ limitations under the License.
*/
import React from "react";
-import {IRecordingUpdate, VoiceRecording} from "../../../voice/VoiceRecording";
+import {IRecordingUpdate, RECORDING_PLAYBACK_SAMPLES, VoiceRecording} from "../../../voice/VoiceRecording";
import {replaceableComponent} from "../../../utils/replaceableComponent";
import {arrayFastResample, arraySeed} from "../../../utils/arrays";
import {percentageOf} from "../../../utils/numbers";
import Waveform from "./Waveform";
-import {PLAYBACK_WAVEFORM_SAMPLES} from "../../../voice/Playback";
interface IProps {
recorder: VoiceRecording;
@@ -38,14 +37,14 @@ export default class LiveRecordingWaveform extends React.PureComponent {
// The waveform and the downsample target are pretty close, so we should be fine to
// do this, despite the docs on arrayFastResample.
- const bars = arrayFastResample(Array.from(update.waveform), PLAYBACK_WAVEFORM_SAMPLES);
+ const bars = arrayFastResample(Array.from(update.waveform), RECORDING_PLAYBACK_SAMPLES);
this.setState({
// The incoming data is between zero and one, but typically even screaming into a
// microphone won't send you over 0.6, so we artificially adjust the gain for the
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index 2e5431620d..95c6feb973 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -833,7 +833,7 @@
"Match system theme": "Match system theme",
"Use a system font": "Use a system font",
"System font name": "System font name",
- "Allow Peer-to-Peer for 1:1 calls": "Allow Peer-to-Peer for 1:1 calls",
+ "Allow Peer-to-Peer for 1:1 calls (if you enable this, the other party might be able to see your IP address)": "Allow Peer-to-Peer for 1:1 calls (if you enable this, the other party might be able to see your IP address)",
"Send analytics data": "Send analytics data",
"Never send encrypted messages to unverified sessions from this session": "Never send encrypted messages to unverified sessions from this session",
"Never send encrypted messages to unverified sessions in this room from this session": "Never send encrypted messages to unverified sessions in this room from this session",
@@ -1252,8 +1252,9 @@
"olm version:": "olm version:",
"Homeserver is": "Homeserver is",
"Identity Server is": "Identity Server is",
- "Access Token:": "Access Token:",
- "click to reveal": "click to reveal",
+ "Access Token": "Access Token",
+ "Your access token gives full access to your account. Do not share it with anyone.": "Your access token gives full access to your account. Do not share it with anyone.",
+ "Copy": "Copy",
"Clear cache and reload": "Clear cache and reload",
"Labs": "Labs",
"Customise your experience with experimental labs features. Learn more.": "Customise your experience with experimental labs features. Learn more.",
@@ -2033,10 +2034,11 @@
"Direct Messages": "Direct Messages",
"Space selection": "Space selection",
"Add existing rooms": "Add existing rooms",
- "Don't want to add an existing room?": "Don't want to add an existing room?",
+ "Not all selected were added": "Not all selected were added",
+ "Adding rooms... (%(progress)s out of %(count)s)|other": "Adding rooms... (%(progress)s out of %(count)s)",
+ "Adding rooms... (%(progress)s out of %(count)s)|one": "Adding room...",
+ "Want to add a new room instead?": "Want to add a new room instead?",
"Create a new room": "Create a new room",
- "Failed to add rooms to space": "Failed to add rooms to space",
- "Adding...": "Adding...",
"Matrix ID": "Matrix ID",
"Matrix Room ID": "Matrix Room ID",
"email address": "email address",
@@ -2347,7 +2349,6 @@
"Share Community": "Share Community",
"Share Room Message": "Share Room Message",
"Link to selected message": "Link to selected message",
- "Copy": "Copy",
"Command Help": "Command Help",
"Failed to save space settings.": "Failed to save space settings.",
"Space settings": "Space settings",
@@ -2675,6 +2676,8 @@
"Failed to create initial space rooms": "Failed to create initial space rooms",
"Skip for now": "Skip for now",
"Creating rooms...": "Creating rooms...",
+ "Failed to add rooms to space": "Failed to add rooms to space",
+ "Adding...": "Adding...",
"What do you want to organise?": "What do you want to organise?",
"Pick rooms or conversations to add. This is just a space for you, no one will be informed. You can add more later.": "Pick rooms or conversations to add. This is just a space for you, no one will be informed. You can add more later.",
"Share %(name)s": "Share %(name)s",
diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts
index 2a26eeac13..1497a2208d 100644
--- a/src/settings/Settings.ts
+++ b/src/settings/Settings.ts
@@ -438,7 +438,10 @@ export const SETTINGS: {[setting: string]: ISetting} = {
},
"webRtcAllowPeerToPeer": {
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
- displayName: _td('Allow Peer-to-Peer for 1:1 calls'),
+ displayName: _td(
+ "Allow Peer-to-Peer for 1:1 calls " +
+ "(if you enable this, the other party might be able to see your IP address)",
+ ),
default: true,
invertedSettingName: 'webRtcForceTURN',
},
diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx
index 43822007c9..dcf9f891af 100644
--- a/src/stores/SpaceStore.tsx
+++ b/src/stores/SpaceStore.tsx
@@ -413,7 +413,19 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
this.spaceFilteredRooms.forEach((roomIds, s) => {
// Update NotificationStates
- this.getNotificationState(s)?.setRooms(visibleRooms.filter(room => roomIds.has(room.roomId)));
+ this.getNotificationState(s)?.setRooms(visibleRooms.filter(room => {
+ if (roomIds.has(room.roomId)) {
+ // Don't aggregate notifications for DMs except in the Home Space
+ if (s !== HOME_SPACE) {
+ return !DMRoomMap.shared().getUserIdForRoomId(room.roomId)
+ || RoomListStore.instance.getTagsForRoom(room).includes(DefaultTagID.Favourite);
+ }
+
+ return true;
+ }
+
+ return false;
+ }));
});
}, 100, {trailing: true, leading: true});
diff --git a/src/voice/Playback.ts b/src/voice/Playback.ts
index ca48680ebd..caa5241e1a 100644
--- a/src/voice/Playback.ts
+++ b/src/voice/Playback.ts
@@ -29,7 +29,7 @@ export enum PlaybackState {
Playing = "playing", // active progress through timeline
}
-export const PLAYBACK_WAVEFORM_SAMPLES = 35;
+export const PLAYBACK_WAVEFORM_SAMPLES = 39;
const DEFAULT_WAVEFORM = arraySeed(0, PLAYBACK_WAVEFORM_SAMPLES);
export class Playback extends EventEmitter implements IDestroyable {
diff --git a/src/voice/VoiceRecording.ts b/src/voice/VoiceRecording.ts
index eb705200ca..c4a0a78ce5 100644
--- a/src/voice/VoiceRecording.ts
+++ b/src/voice/VoiceRecording.ts
@@ -33,6 +33,8 @@ const BITRATE = 24000; // 24kbps is pretty high quality for our use case in opus
const TARGET_MAX_LENGTH = 120; // 2 minutes in seconds. Somewhat arbitrary, though longer == larger files.
const TARGET_WARN_TIME_LEFT = 10; // 10 seconds, also somewhat arbitrary.
+export const RECORDING_PLAYBACK_SAMPLES = 44;
+
export interface IRecordingUpdate {
waveform: number[]; // floating points between 0 (low) and 1 (high).
timeSeconds: number; // float