fix SpeakerPhone switch for mobile. (#312)

* fix SpeakerPhone switch for mobile.

* update.
This commit is contained in:
CloudWebRTC
2023-06-30 14:47:49 +08:00
committed by GitHub
parent 3c964a6553
commit 7b72721560
6 changed files with 125 additions and 51 deletions
+59 -39
View File
@@ -4,6 +4,7 @@ import 'dart:io';
import 'package:collection/collection.dart';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_background/flutter_background.dart';
import 'package:livekit_client/livekit_client.dart';
@@ -36,6 +37,8 @@ class _ControlsWidgetState extends State<ControlsWidget> {
StreamSubscription? _subscription;
bool _speakerphoneOn = false;
@override
void initState() {
super.initState();
@@ -106,6 +109,12 @@ class _ControlsWidgetState extends State<ControlsWidget> {
setState(() {});
}
void _setSpeakerphoneOn() {
_speakerphoneOn = !_speakerphoneOn;
Hardware.instance.setSpeakerphoneOn(_speakerphoneOn);
setState(() {});
}
void _toggleCamera() async {
//
final track = participant.videoTracks.firstOrNull?.track;
@@ -124,7 +133,7 @@ class _ControlsWidgetState extends State<ControlsWidget> {
}
void _enableScreenShare() async {
if (WebRTC.platformIsDesktop) {
if (lkPlatformIsDesktop()) {
try {
final source = await showDialog<DesktopCapturerSource>(
context: context,
@@ -147,7 +156,7 @@ class _ControlsWidgetState extends State<ControlsWidget> {
}
return;
}
if (WebRTC.platformIsAndroid) {
if (lkPlatformIs(PlatformType.android)) {
// Android specific
requestBackgroundPermission([bool isRetry = false]) async {
// Required for android screenshare.
@@ -179,7 +188,7 @@ class _ControlsWidgetState extends State<ControlsWidget> {
await requestBackgroundPermission();
}
if (WebRTC.platformIsIOS) {
if (lkPlatformIs(PlatformType.iOS)) {
var track = await LocalVideoTrack.createScreenShareTrack(
const ScreenShareCaptureOptions(
useiOSBroadcastExtension: true,
@@ -314,43 +323,54 @@ class _ControlsWidgetState extends State<ControlsWidget> {
icon: const Icon(EvaIcons.micOff),
tooltip: 'un-mute audio',
),
PopupMenuButton<MediaDevice>(
icon: const Icon(Icons.volume_up),
itemBuilder: (BuildContext context) {
return [
const PopupMenuItem<MediaDevice>(
value: null,
child: ListTile(
leading: Icon(
EvaIcons.speaker,
color: Colors.white,
),
title: Text('Select Audio Output'),
),
),
if (_audioOutputs != null)
..._audioOutputs!.map((device) {
return PopupMenuItem<MediaDevice>(
value: device,
child: ListTile(
leading: (device.deviceId ==
widget.room.selectedAudioOutputDeviceId)
? const Icon(
EvaIcons.checkmarkSquare,
color: Colors.white,
)
: const Icon(
EvaIcons.square,
color: Colors.white,
),
title: Text(device.label),
if (!lkPlatformIsMobile())
PopupMenuButton<MediaDevice>(
icon: const Icon(Icons.volume_up),
itemBuilder: (BuildContext context) {
return [
const PopupMenuItem<MediaDevice>(
value: null,
child: ListTile(
leading: Icon(
EvaIcons.speaker,
color: Colors.white,
),
onTap: () => _selectAudioOutput(device),
);
}).toList()
];
},
),
title: Text('Select Audio Output'),
),
),
if (_audioOutputs != null)
..._audioOutputs!.map((device) {
return PopupMenuItem<MediaDevice>(
value: device,
child: ListTile(
leading: (device.deviceId ==
widget.room.selectedAudioOutputDeviceId)
? const Icon(
EvaIcons.checkmarkSquare,
color: Colors.white,
)
: const Icon(
EvaIcons.square,
color: Colors.white,
),
title: Text(device.label),
),
onTap: () => _selectAudioOutput(device),
);
}).toList()
];
},
),
if (!kIsWeb && lkPlatformIsMobile())
IconButton(
disabledColor: Colors.grey,
onPressed: Hardware.instance.canSwitchSpeakerphone
? _setSpeakerphoneOn
: null,
icon: Icon(
_speakerphoneOn ? Icons.speaker_phone : Icons.phone_android),
tooltip: 'Switch SpeakerPhone',
),
if (participant.isCameraEnabled())
PopupMenuButton<MediaDevice>(
icon: const Icon(EvaIcons.video),