diff --git a/ios/sdk/src/AudioMode.m b/ios/sdk/src/AudioMode.m
index 3034e6b67..f2804d544 100644
--- a/ios/sdk/src/AudioMode.m
+++ b/ios/sdk/src/AudioMode.m
@@ -35,9 +35,10 @@ typedef enum {
static NSString * const kDevicesChanged = @"org.jitsi.meet:features/audio-mode#devices-update";
// Device types (must match JS and Java)
-static NSString * const kDeviceTypeHeadphones = @"HEADPHONES";
static NSString * const kDeviceTypeBluetooth = @"BLUETOOTH";
+static NSString * const kDeviceTypeCar = @"CAR";
static NSString * const kDeviceTypeEarpiece = @"EARPIECE";
+static NSString * const kDeviceTypeHeadphones = @"HEADPHONES";
static NSString * const kDeviceTypeSpeaker = @"SPEAKER";
static NSString * const kDeviceTypeUnknown = @"UNKNOWN";
@@ -320,6 +321,8 @@ RCT_EXPORT_METHOD(updateDeviceList) {
|| [portType isEqualToString:AVAudioSessionPortBluetoothLE]
|| [portType isEqualToString:AVAudioSessionPortBluetoothA2DP]) {
return kDeviceTypeBluetooth;
+ } else if ([portType isEqualToString:AVAudioSessionPortCarAudio]) {
+ return kDeviceTypeCar;
} else {
return kDeviceTypeUnknown;
}
diff --git a/lang/main.json b/lang/main.json
index b96bf1be2..eaa142e90 100644
--- a/lang/main.json
+++ b/lang/main.json
@@ -31,6 +31,7 @@
},
"audioDevices": {
"bluetooth": "Bluetooth",
+ "car": "Car Audio",
"headphones": "Headphones",
"none": "No audio devices available",
"phone": "Phone",
diff --git a/react/features/base/icons/svg/car.svg b/react/features/base/icons/svg/car.svg
new file mode 100644
index 000000000..f43424e9d
--- /dev/null
+++ b/react/features/base/icons/svg/car.svg
@@ -0,0 +1,3 @@
+
diff --git a/react/features/base/icons/svg/index.js b/react/features/base/icons/svg/index.js
index 0cd16ee8e..9bf6feae0 100644
--- a/react/features/base/icons/svg/index.js
+++ b/react/features/base/icons/svg/index.js
@@ -22,6 +22,7 @@ export { default as IconCameraEmpty } from './camera-empty.svg';
export { default as IconCameraEmptyDisabled } from './camera-empty-disabled.svg';
export { default as IconCameraRefresh } from './camera-refresh.svg';
export { default as IconCancelSelection } from './cancel.svg';
+export { default as IconCar } from './car.svg';
export { default as IconChat } from './chat.svg';
export { default as IconChatSend } from './send.svg';
export { default as IconChatUnread } from './chat-unread.svg';
diff --git a/react/features/mobile/audio-mode/components/AudioRoutePickerDialog.js b/react/features/mobile/audio-mode/components/AudioRoutePickerDialog.js
index a247fdc51..45c46f2b0 100644
--- a/react/features/mobile/audio-mode/components/AudioRoutePickerDialog.js
+++ b/react/features/mobile/audio-mode/components/AudioRoutePickerDialog.js
@@ -9,6 +9,7 @@ import { hideDialog, BottomSheet } from '../../../base/dialog';
import { translate } from '../../../base/i18n';
import {
Icon,
+ IconCar,
IconDeviceBluetooth,
IconDeviceEarpiece,
IconDeviceHeadphone,
@@ -125,6 +126,11 @@ const deviceInfoMap = {
text: 'audioDevices.bluetooth',
type: 'BLUETOOTH'
},
+ CAR: {
+ icon: IconCar,
+ text: 'audioDevices.car',
+ type: 'CAR'
+ },
EARPIECE: {
icon: IconDeviceEarpiece,
text: 'audioDevices.phone',
@@ -166,7 +172,7 @@ class AudioRoutePickerDialog extends Component {
* @inheritdoc
*/
static getDerivedStateFromProps(props: Props) {
- const { _devices: devices } = props;
+ const { _devices: devices, t } = props;
if (!devices) {
return null;
@@ -183,13 +189,18 @@ class AudioRoutePickerDialog extends Component {
continue;
}
- const text = device.type === 'BLUETOOTH' && device.name ? device.name : infoMap.text;
+ let text = t(infoMap.text);
+
+ // iOS provides descriptive names for these, use it.
+ if ((device.type === 'BLUETOOTH' || device.type === 'CAR') && device.name) {
+ text = device.name;
+ }
if (infoMap) {
const info = {
...infoMap,
selected: Boolean(device.selected),
- text: props.t(text),
+ text,
uid: device.uid
};