mirror of
https://github.com/krille-chan/fluffychat
synced 2024-09-10 03:45:12 +00:00
chore: Better call UX sounds and timeline design
This commit is contained in:
parent
87c534faf2
commit
c0244c66ab
9 changed files with 50 additions and 45 deletions
BIN
assets/sounds/phone.ogg
Normal file
BIN
assets/sounds/phone.ogg
Normal file
Binary file not shown.
|
@ -990,9 +990,7 @@ class ChatController extends State<Chat> {
|
||||||
final voipPlugin = Matrix.of(context).voipPlugin;
|
final voipPlugin = Matrix.of(context).voipPlugin;
|
||||||
await voipPlugin!.voip.inviteToCall(room!.id, callType).catchError((e) {
|
await voipPlugin!.voip.inviteToCall(room!.id, callType).catchError((e) {
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
SnackBar(content: Text(e.toString())
|
SnackBar(content: Text((e as Object).toLocalizedString(context))),
|
||||||
// Text(LocalizedExceptionExtension(context, e)),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -45,8 +45,15 @@ class Message extends StatelessWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (![EventTypes.Message, EventTypes.Sticker, EventTypes.Encrypted]
|
if (!{
|
||||||
.contains(event.type)) {
|
EventTypes.Message,
|
||||||
|
EventTypes.Sticker,
|
||||||
|
EventTypes.Encrypted,
|
||||||
|
EventTypes.CallInvite
|
||||||
|
}.contains(event.type)) {
|
||||||
|
if (event.type.startsWith('m.call.')) {
|
||||||
|
return Container();
|
||||||
|
}
|
||||||
return StateMessage(event, unfold: unfold);
|
return StateMessage(event, unfold: unfold);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -199,6 +199,13 @@ class MessageContent extends StatelessWidget {
|
||||||
onLinkTap: (url) => UrlLauncher(context, url).launchUrl(),
|
onLinkTap: (url) => UrlLauncher(context, url).launchUrl(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
case EventTypes.CallInvite:
|
||||||
|
return _ButtonContent(
|
||||||
|
label: L10n.of(context)!.startedACall(event.sender.calcDisplayname()),
|
||||||
|
icon: const Icon(Icons.phone_outlined),
|
||||||
|
textColor: buttonTextColor,
|
||||||
|
onPressed: () => onInfoTab!(event),
|
||||||
|
);
|
||||||
default:
|
default:
|
||||||
return _ButtonContent(
|
return _ButtonContent(
|
||||||
label: L10n.of(context)!
|
label: L10n.of(context)!
|
||||||
|
@ -227,11 +234,14 @@ class _ButtonContent extends StatelessWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return TextButton.icon(
|
return OutlinedButton.icon(
|
||||||
onPressed: onPressed,
|
onPressed: onPressed,
|
||||||
icon: icon,
|
icon: icon,
|
||||||
label: Text(label, overflow: TextOverflow.ellipsis),
|
label: Text(label, overflow: TextOverflow.ellipsis),
|
||||||
style: TextButton.styleFrom(primary: textColor),
|
style: OutlinedButton.styleFrom(
|
||||||
|
primary: textColor,
|
||||||
|
backgroundColor: Colors.white.withAlpha(64),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,6 @@ import 'package:assets_audio_player/assets_audio_player.dart';
|
||||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
|
import 'package:flutter_webrtc/flutter_webrtc.dart';
|
||||||
import 'package:matrix/matrix.dart';
|
import 'package:matrix/matrix.dart';
|
||||||
import 'package:pedantic/pedantic.dart';
|
import 'package:pedantic/pedantic.dart';
|
||||||
import 'package:universal_html/html.dart' as darthtml;
|
|
||||||
import 'package:wakelock/wakelock.dart';
|
import 'package:wakelock/wakelock.dart';
|
||||||
|
|
||||||
import 'package:fluffychat/utils/platform_infos.dart';
|
import 'package:fluffychat/utils/platform_infos.dart';
|
||||||
|
@ -174,12 +173,7 @@ class _MyCallingPage extends State<Calling> {
|
||||||
|
|
||||||
void _playCallSound() async {
|
void _playCallSound() async {
|
||||||
const path = 'assets/sounds/call.ogg';
|
const path = 'assets/sounds/call.ogg';
|
||||||
if (kIsWeb) {
|
if (kIsWeb || PlatformInfos.isMobile || PlatformInfos.isMacOS) {
|
||||||
darthtml.AudioElement()
|
|
||||||
..src = 'assets/$path'
|
|
||||||
..autoplay = true
|
|
||||||
..load();
|
|
||||||
} else if (PlatformInfos.isMobile) {
|
|
||||||
await AssetsAudioPlayer.newPlayer().open(Audio(path));
|
await AssetsAudioPlayer.newPlayer().open(Audio(path));
|
||||||
} else {
|
} else {
|
||||||
Logs().w('Playing sound not implemented for this platform!');
|
Logs().w('Playing sound not implemented for this platform!');
|
||||||
|
@ -269,7 +263,6 @@ class _MyCallingPage extends State<Calling> {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _hangUp() {
|
void _hangUp() {
|
||||||
_playCallSound();
|
|
||||||
setState(() {
|
setState(() {
|
||||||
if (call != null && (call?.isRinging ?? false)) {
|
if (call != null && (call?.isRinging ?? false)) {
|
||||||
call?.reject();
|
call?.reject();
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
|
||||||
|
import 'package:assets_audio_player/assets_audio_player.dart';
|
||||||
import 'package:flutter_ringtone_player/flutter_ringtone_player.dart';
|
import 'package:flutter_ringtone_player/flutter_ringtone_player.dart';
|
||||||
|
|
||||||
|
import 'package:fluffychat/utils/platform_infos.dart';
|
||||||
|
|
||||||
class UserMediaManager {
|
class UserMediaManager {
|
||||||
factory UserMediaManager() {
|
factory UserMediaManager() {
|
||||||
return _instance;
|
return _instance;
|
||||||
|
@ -11,17 +14,27 @@ class UserMediaManager {
|
||||||
|
|
||||||
static final UserMediaManager _instance = UserMediaManager._internal();
|
static final UserMediaManager _instance = UserMediaManager._internal();
|
||||||
|
|
||||||
Future<void> startRingingTone() {
|
AssetsAudioPlayer? _assetsAudioPlayer;
|
||||||
if (kIsWeb) {
|
|
||||||
throw 'Platform [web] not supported';
|
Future<void> startRingingTone() async {
|
||||||
|
if (PlatformInfos.isMobile) {
|
||||||
|
await FlutterRingtonePlayer.playRingtone(volume: 80);
|
||||||
|
} else if ((kIsWeb || PlatformInfos.isMacOS) &&
|
||||||
|
_assetsAudioPlayer != null) {
|
||||||
|
const path = 'assets/sounds/phone.ogg';
|
||||||
|
final player = _assetsAudioPlayer = AssetsAudioPlayer.newPlayer();
|
||||||
|
await player.open(Audio(path),
|
||||||
|
autoStart: true, loopMode: LoopMode.playlist);
|
||||||
}
|
}
|
||||||
return FlutterRingtonePlayer.playRingtone(volume: 80);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> stopRingingTone() {
|
Future<void> stopRingingTone() async {
|
||||||
if (kIsWeb) {
|
if (PlatformInfos.isMobile) {
|
||||||
throw 'Platform [web] not supported';
|
await FlutterRingtonePlayer.stop();
|
||||||
}
|
}
|
||||||
return FlutterRingtonePlayer.stop();
|
await _assetsAudioPlayer?.stop();
|
||||||
|
_assetsAudioPlayer = null;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,9 +10,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
url_launcher_linux
|
url_launcher_linux
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
|
||||||
)
|
|
||||||
|
|
||||||
set(PLUGIN_BUNDLED_LIBRARIES)
|
set(PLUGIN_BUNDLED_LIBRARIES)
|
||||||
|
|
||||||
foreach(plugin ${FLUTTER_PLUGIN_LIST})
|
foreach(plugin ${FLUTTER_PLUGIN_LIST})
|
||||||
|
@ -21,8 +18,3 @@ foreach(plugin ${FLUTTER_PLUGIN_LIST})
|
||||||
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
|
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
|
||||||
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
|
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
|
||||||
endforeach(plugin)
|
endforeach(plugin)
|
||||||
|
|
||||||
foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
|
|
||||||
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})
|
|
||||||
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
|
|
||||||
endforeach(ffi_plugin)
|
|
||||||
|
|
12
pubspec.lock
12
pubspec.lock
|
@ -890,7 +890,7 @@ packages:
|
||||||
name: js
|
name: js
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.4"
|
version: "0.6.3"
|
||||||
latlong2:
|
latlong2:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1107,7 +1107,7 @@ packages:
|
||||||
name: path
|
name: path
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.8.1"
|
version: "1.8.0"
|
||||||
path_drawing:
|
path_drawing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1560,21 +1560,21 @@ packages:
|
||||||
name: test
|
name: test
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.20.1"
|
version: "1.19.5"
|
||||||
test_api:
|
test_api:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.4.9"
|
version: "0.4.8"
|
||||||
test_core:
|
test_core:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_core
|
name: test_core
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.4.11"
|
version: "0.4.9"
|
||||||
timezone:
|
timezone:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1898,5 +1898,5 @@ packages:
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.0"
|
version: "3.1.0"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=2.16.0-100.0.dev <3.0.0"
|
dart: ">=2.15.1 <3.0.0"
|
||||||
flutter: ">=2.8.0"
|
flutter: ">=2.8.0"
|
||||||
|
|
|
@ -12,9 +12,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
url_launcher_windows
|
url_launcher_windows
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
|
||||||
)
|
|
||||||
|
|
||||||
set(PLUGIN_BUNDLED_LIBRARIES)
|
set(PLUGIN_BUNDLED_LIBRARIES)
|
||||||
|
|
||||||
foreach(plugin ${FLUTTER_PLUGIN_LIST})
|
foreach(plugin ${FLUTTER_PLUGIN_LIST})
|
||||||
|
@ -23,8 +20,3 @@ foreach(plugin ${FLUTTER_PLUGIN_LIST})
|
||||||
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
|
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
|
||||||
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
|
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
|
||||||
endforeach(plugin)
|
endforeach(plugin)
|
||||||
|
|
||||||
foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
|
|
||||||
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})
|
|
||||||
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
|
|
||||||
endforeach(ffi_plugin)
|
|
||||||
|
|
Loading…
Reference in a new issue