mirror of
https://gitlab.com/famedly/fluffychat.git
synced 2024-11-23 20:49:26 +01:00
Merge branch 'krille/update-dependenciess' into 'main'
chore: Update dependencies See merge request famedly/fluffychat!985
This commit is contained in:
commit
87cf9eee60
@ -12,7 +12,7 @@ linter:
|
||||
analyzer:
|
||||
errors:
|
||||
todo: ignore
|
||||
import_of_legacy_library_into_null_safe: ignore
|
||||
use_build_context_synchronously: ignore
|
||||
exclude:
|
||||
- lib/generated_plugin_registrant.dart
|
||||
- lib/l10n/*.dart
|
||||
|
@ -80,10 +80,10 @@ class FluffyChatApp extends StatefulWidget {
|
||||
static bool gotInitialLink = false;
|
||||
|
||||
@override
|
||||
_FluffyChatAppState createState() => _FluffyChatAppState();
|
||||
FluffyChatAppState createState() => FluffyChatAppState();
|
||||
}
|
||||
|
||||
class _FluffyChatAppState extends State<FluffyChatApp> {
|
||||
class FluffyChatAppState extends State<FluffyChatApp> {
|
||||
GlobalKey<VRouterState>? _router;
|
||||
bool? columnMode;
|
||||
String? _initialUrl;
|
||||
|
@ -18,10 +18,10 @@ class InviteStoryPage extends StatefulWidget {
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_InviteStoryPageState createState() => _InviteStoryPageState();
|
||||
InviteStoryPageState createState() => InviteStoryPageState();
|
||||
}
|
||||
|
||||
class _InviteStoryPageState extends State<InviteStoryPage> {
|
||||
class InviteStoryPageState extends State<InviteStoryPage> {
|
||||
Set<String> _undecided = {};
|
||||
final Set<String> _invite = {};
|
||||
|
||||
|
@ -39,10 +39,10 @@ class BootstrapDialog extends StatefulWidget {
|
||||
);
|
||||
|
||||
@override
|
||||
_BootstrapDialogState createState() => _BootstrapDialogState();
|
||||
BootstrapDialogState createState() => BootstrapDialogState();
|
||||
}
|
||||
|
||||
class _BootstrapDialogState extends State<BootstrapDialog> {
|
||||
class BootstrapDialogState extends State<BootstrapDialog> {
|
||||
final TextEditingController _recoveryKeyTextEditingController =
|
||||
TextEditingController();
|
||||
|
||||
|
@ -75,6 +75,13 @@ class ChatInputRow extends StatelessWidget {
|
||||
]
|
||||
: <Widget>[
|
||||
KeyBoardShortcuts(
|
||||
keysToPress: {
|
||||
LogicalKeyboardKey.altLeft,
|
||||
LogicalKeyboardKey.keyA
|
||||
},
|
||||
onKeysPressed: () =>
|
||||
controller.onAddPopupMenuButtonSelected('file'),
|
||||
helpLabel: L10n.of(context)!.sendFile,
|
||||
child: AnimatedContainer(
|
||||
duration: const Duration(milliseconds: 200),
|
||||
height: 56,
|
||||
@ -168,18 +175,17 @@ class ChatInputRow extends StatelessWidget {
|
||||
],
|
||||
),
|
||||
),
|
||||
keysToPress: {
|
||||
LogicalKeyboardKey.altLeft,
|
||||
LogicalKeyboardKey.keyA
|
||||
},
|
||||
onKeysPressed: () =>
|
||||
controller.onAddPopupMenuButtonSelected('file'),
|
||||
helpLabel: L10n.of(context)!.sendFile,
|
||||
),
|
||||
Container(
|
||||
height: 56,
|
||||
alignment: Alignment.center,
|
||||
child: KeyBoardShortcuts(
|
||||
keysToPress: {
|
||||
LogicalKeyboardKey.altLeft,
|
||||
LogicalKeyboardKey.keyE
|
||||
},
|
||||
onKeysPressed: controller.emojiPickerAction,
|
||||
helpLabel: L10n.of(context)!.emojis,
|
||||
child: IconButton(
|
||||
tooltip: L10n.of(context)!.emojis,
|
||||
icon: PageTransitionSwitcher(
|
||||
@ -192,8 +198,8 @@ class ChatInputRow extends StatelessWidget {
|
||||
animation: primaryAnimation,
|
||||
secondaryAnimation: secondaryAnimation,
|
||||
transitionType: SharedAxisTransitionType.scaled,
|
||||
child: child,
|
||||
fillColor: Colors.transparent,
|
||||
child: child,
|
||||
);
|
||||
},
|
||||
child: Icon(
|
||||
@ -205,12 +211,6 @@ class ChatInputRow extends StatelessWidget {
|
||||
),
|
||||
onPressed: controller.emojiPickerAction,
|
||||
),
|
||||
keysToPress: {
|
||||
LogicalKeyboardKey.altLeft,
|
||||
LogicalKeyboardKey.keyE
|
||||
},
|
||||
onKeysPressed: controller.emojiPickerAction,
|
||||
helpLabel: L10n.of(context)!.emojis,
|
||||
),
|
||||
),
|
||||
if (controller.matrix!.isMultiAccount &&
|
||||
|
@ -21,8 +21,8 @@ class CupertinoWidgetsBottomSheet extends StatelessWidget {
|
||||
(widget) => Link(
|
||||
builder: (context, callback) {
|
||||
return CupertinoActionSheetAction(
|
||||
child: Text(widget.name ?? widget.url),
|
||||
onPressed: callback ?? () {},
|
||||
child: Text(widget.name ?? widget.url),
|
||||
);
|
||||
},
|
||||
target: LinkTarget.blank,
|
||||
@ -41,8 +41,8 @@ class CupertinoWidgetsBottomSheet extends StatelessWidget {
|
||||
},
|
||||
),
|
||||
CupertinoActionSheetAction(
|
||||
child: Text(L10n.of(context)!.cancel),
|
||||
onPressed: Navigator.of(context).pop,
|
||||
child: Text(L10n.of(context)!.cancel),
|
||||
),
|
||||
],
|
||||
);
|
||||
|
@ -14,10 +14,10 @@ class EncryptionButton extends StatefulWidget {
|
||||
final Room room;
|
||||
const EncryptionButton(this.room, {Key? key}) : super(key: key);
|
||||
@override
|
||||
_EncryptionButtonState createState() => _EncryptionButtonState();
|
||||
EncryptionButtonState createState() => EncryptionButtonState();
|
||||
}
|
||||
|
||||
class _EncryptionButtonState extends State<EncryptionButton> {
|
||||
class EncryptionButtonState extends State<EncryptionButton> {
|
||||
StreamSubscription? _onSyncSub;
|
||||
|
||||
void _enableEncryptionAction() async {
|
||||
|
@ -23,12 +23,12 @@ class AudioPlayerWidget extends StatefulWidget {
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
_AudioPlayerState createState() => _AudioPlayerState();
|
||||
AudioPlayerState createState() => AudioPlayerState();
|
||||
}
|
||||
|
||||
enum AudioPlayerStatus { notDownloaded, downloading, downloaded }
|
||||
|
||||
class _AudioPlayerState extends State<AudioPlayerWidget> {
|
||||
class AudioPlayerState extends State<AudioPlayerWidget> {
|
||||
AudioPlayerStatus status = AudioPlayerStatus.notDownloaded;
|
||||
final AudioPlayer audioPlayer = AudioPlayer();
|
||||
|
||||
|
@ -87,10 +87,7 @@ class ReplyContent extends StatelessWidget {
|
||||
future: displayEvent.fetchSenderUser(),
|
||||
builder: (context, snapshot) {
|
||||
return Text(
|
||||
(snapshot.data?.calcDisplayname() ??
|
||||
displayEvent.senderFromMemoryOrFallback
|
||||
.calcDisplayname()) +
|
||||
':',
|
||||
'${snapshot.data?.calcDisplayname() ?? displayEvent.senderFromMemoryOrFallback.calcDisplayname()}:',
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
|
@ -13,10 +13,10 @@ class Sticker extends StatefulWidget {
|
||||
const Sticker(this.event, {Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_StickerState createState() => _StickerState();
|
||||
StickerState createState() => StickerState();
|
||||
}
|
||||
|
||||
class _StickerState extends State<Sticker> {
|
||||
class StickerState extends State<Sticker> {
|
||||
bool? animated;
|
||||
|
||||
@override
|
||||
|
@ -20,10 +20,10 @@ class EventVideoPlayer extends StatefulWidget {
|
||||
const EventVideoPlayer(this.event, {Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_EventVideoPlayerState createState() => _EventVideoPlayerState();
|
||||
EventVideoPlayerState createState() => EventVideoPlayerState();
|
||||
}
|
||||
|
||||
class _EventVideoPlayerState extends State<EventVideoPlayer> {
|
||||
class EventVideoPlayerState extends State<EventVideoPlayer> {
|
||||
ChewieController? _chewieManager;
|
||||
bool _isDownloading = false;
|
||||
String? _networkUri;
|
||||
|
@ -226,7 +226,7 @@ class InputBar extends StatelessWidget {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text('/' + command,
|
||||
Text('/$command',
|
||||
style: const TextStyle(fontFamily: 'monospace')),
|
||||
Text(
|
||||
hint,
|
||||
@ -319,14 +319,14 @@ class InputBar extends StatelessWidget {
|
||||
: controller!.text.substring(controller!.selection.baseOffset + 1);
|
||||
var insertText = '';
|
||||
if (suggestion['type'] == 'command') {
|
||||
insertText = suggestion['name']! + ' ';
|
||||
insertText = '${suggestion['name']!} ';
|
||||
startText = replaceText.replaceAllMapped(
|
||||
RegExp(r'^(/\w*)$'),
|
||||
(Match m) => '/' + insertText,
|
||||
(Match m) => '/$insertText',
|
||||
);
|
||||
}
|
||||
if (suggestion['type'] == 'emoji') {
|
||||
insertText = suggestion['emoji']! + ' ';
|
||||
insertText = '${suggestion['emoji']!} ';
|
||||
startText = replaceText.replaceAllMapped(
|
||||
suggestion['current_word']!,
|
||||
(Match m) => insertText,
|
||||
@ -351,21 +351,21 @@ class InputBar extends StatelessWidget {
|
||||
break;
|
||||
}
|
||||
}
|
||||
insertText = ':${isUnique ? '' : insertPack! + '~'}$insertEmote: ';
|
||||
insertText = ':${isUnique ? '' : '${insertPack!}~'}$insertEmote: ';
|
||||
startText = replaceText.replaceAllMapped(
|
||||
RegExp(r'(\s|^)(:(?:[-\w]+~)?[-\w]+)$'),
|
||||
(Match m) => '${m[1]}$insertText',
|
||||
);
|
||||
}
|
||||
if (suggestion['type'] == 'user') {
|
||||
insertText = suggestion['mention']! + ' ';
|
||||
insertText = '${suggestion['mention']!} ';
|
||||
startText = replaceText.replaceAllMapped(
|
||||
RegExp(r'(\s|^)(@[-\w]+)$'),
|
||||
(Match m) => '${m[1]}$insertText',
|
||||
);
|
||||
}
|
||||
if (suggestion['type'] == 'room') {
|
||||
insertText = suggestion['mxid']! + ' ';
|
||||
insertText = '${suggestion['mxid']!} ';
|
||||
startText = replaceText.replaceAllMapped(
|
||||
RegExp(r'(\s|^)(#[-\w]+)$'),
|
||||
(Match m) => '${m[1]}$insertText',
|
||||
@ -401,9 +401,7 @@ class InputBar extends StatelessWidget {
|
||||
final val = controller!.value;
|
||||
final selection = val.selection.start;
|
||||
final messageWithoutNewLine =
|
||||
controller!.text.substring(0, val.selection.start) +
|
||||
'\n' +
|
||||
controller!.text.substring(val.selection.end);
|
||||
'${controller!.text.substring(0, val.selection.start)}\n${controller!.text.substring(val.selection.end)}';
|
||||
controller!.value = TextEditingValue(
|
||||
text: messageWithoutNewLine,
|
||||
selection: TextSelection.fromPosition(
|
||||
|
@ -19,10 +19,10 @@ class RecordingDialog extends StatefulWidget {
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_RecordingDialogState createState() => _RecordingDialogState();
|
||||
RecordingDialogState createState() => RecordingDialogState();
|
||||
}
|
||||
|
||||
class _RecordingDialogState extends State<RecordingDialog> {
|
||||
class RecordingDialogState extends State<RecordingDialog> {
|
||||
Timer? _recorderSubscription;
|
||||
Duration _duration = Duration.zero;
|
||||
|
||||
|
@ -18,10 +18,10 @@ class SendFileDialog extends StatefulWidget {
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_SendFileDialogState createState() => _SendFileDialogState();
|
||||
SendFileDialogState createState() => SendFileDialogState();
|
||||
}
|
||||
|
||||
class _SendFileDialogState extends State<SendFileDialog> {
|
||||
class SendFileDialogState extends State<SendFileDialog> {
|
||||
bool origImage = false;
|
||||
|
||||
/// Images smaller than 20kb don't need compression.
|
||||
@ -92,7 +92,7 @@ class _SendFileDialogState extends State<SendFileDialog> {
|
||||
),
|
||||
InkWell(
|
||||
onTap: () => setState(() => origImage = !origImage),
|
||||
child: Text(L10n.of(context)!.sendOriginal + ' ($sizeString)'),
|
||||
child: Text('${L10n.of(context)!.sendOriginal} ($sizeString)'),
|
||||
),
|
||||
],
|
||||
)
|
||||
|
@ -20,10 +20,10 @@ class SendLocationDialog extends StatefulWidget {
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_SendLocationDialogState createState() => _SendLocationDialogState();
|
||||
SendLocationDialogState createState() => SendLocationDialogState();
|
||||
}
|
||||
|
||||
class _SendLocationDialogState extends State<SendLocationDialog> {
|
||||
class SendLocationDialogState extends State<SendLocationDialog> {
|
||||
bool disabled = false;
|
||||
bool denied = false;
|
||||
bool isSending = false;
|
||||
@ -54,19 +54,19 @@ class _SendLocationDialogState extends State<SendLocationDialog> {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
Position _position;
|
||||
Position position;
|
||||
try {
|
||||
_position = await Geolocator.getCurrentPosition(
|
||||
position = await Geolocator.getCurrentPosition(
|
||||
desiredAccuracy: LocationAccuracy.best,
|
||||
timeLimit: const Duration(seconds: 30),
|
||||
);
|
||||
} on TimeoutException {
|
||||
_position = await Geolocator.getCurrentPosition(
|
||||
position = await Geolocator.getCurrentPosition(
|
||||
desiredAccuracy: LocationAccuracy.medium,
|
||||
timeLimit: const Duration(seconds: 30),
|
||||
);
|
||||
}
|
||||
setState(() => position = _position);
|
||||
setState(() => position = position);
|
||||
} catch (e) {
|
||||
setState(() => error = e);
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ class StickerPickerDialogState extends State<StickerPickerDialog> {
|
||||
final packSlugs = stickerPacks.keys.toList();
|
||||
|
||||
// ignore: prefer_function_declarations_over_variables
|
||||
final _packBuilder = (BuildContext context, int packIndex) {
|
||||
final packBuilder = (BuildContext context, int packIndex) {
|
||||
final pack = stickerPacks[packSlugs[packIndex]]!;
|
||||
final filteredImagePackImageEntried = pack.images.entries.toList();
|
||||
if (searchFilter?.isNotEmpty ?? false) {
|
||||
@ -128,7 +128,7 @@ class StickerPickerDialogState extends State<StickerPickerDialog> {
|
||||
),
|
||||
SliverList(
|
||||
delegate: SliverChildBuilderDelegate(
|
||||
_packBuilder,
|
||||
packBuilder,
|
||||
childCount: packSlugs.length,
|
||||
)),
|
||||
],
|
||||
|
@ -185,7 +185,7 @@ class ChatDetailsController extends State<ChatDetails> {
|
||||
await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () =>
|
||||
room.client.setRoomAlias('#' + input.single + ':' + domain!, room.id),
|
||||
room.client.setRoomAlias('#${input.single}:${domain!}', room.id),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -52,9 +52,8 @@ class ChatEncryptionSettingsView extends StatelessWidget {
|
||||
builder: (BuildContext context, snapshot) {
|
||||
if (snapshot.hasError) {
|
||||
return Center(
|
||||
child: Text(L10n.of(context)!.oopsSomethingWentWrong +
|
||||
': ' +
|
||||
snapshot.error.toString()),
|
||||
child: Text(
|
||||
'${L10n.of(context)!.oopsSomethingWentWrong}: ${snapshot.error}'),
|
||||
);
|
||||
}
|
||||
if (!snapshot.hasData) {
|
||||
|
@ -160,11 +160,11 @@ class _ChatListViewBodyState extends State<ChatListViewBody> {
|
||||
child: ListTile(
|
||||
leading: CircleAvatar(
|
||||
radius: Avatar.defaultSize / 2,
|
||||
child: const Icon(Icons.enhanced_encryption_outlined),
|
||||
backgroundColor:
|
||||
Theme.of(context).colorScheme.surfaceVariant,
|
||||
foregroundColor:
|
||||
Theme.of(context).colorScheme.onSurfaceVariant,
|
||||
child: const Icon(Icons.enhanced_encryption_outlined),
|
||||
),
|
||||
title: Text(
|
||||
(Matrix.of(context)
|
||||
@ -402,6 +402,7 @@ class _SpaceRoomListTopBarState extends State<SpaceRoomListTopBar> {
|
||||
child: Column(
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(8),
|
||||
child: LinkText(
|
||||
text: (widget.controller.activeSpacesEntry as SpaceSpacesEntry)
|
||||
.space
|
||||
@ -414,7 +415,6 @@ class _SpaceRoomListTopBarState extends State<SpaceRoomListTopBar> {
|
||||
),
|
||||
onLinkTap: (url) => UrlLauncher(context, url).launchUrl(),
|
||||
),
|
||||
padding: const EdgeInsets.all(8),
|
||||
),
|
||||
const Divider(),
|
||||
],
|
||||
|
@ -4,7 +4,6 @@ import 'package:adaptive_dialog/adaptive_dialog.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
import 'package:future_loading_dialog/future_loading_dialog.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:pedantic/pedantic.dart';
|
||||
import 'package:vrouter/vrouter.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
@ -108,7 +107,7 @@ class ChatListItem extends StatelessWidget {
|
||||
),
|
||||
);
|
||||
} else {
|
||||
unawaited(room.sendEvent(Matrix.of(context).shareContent!));
|
||||
room.sendEvent(Matrix.of(context).shareContent!);
|
||||
}
|
||||
Matrix.of(context).shareContent = null;
|
||||
}
|
||||
|
@ -37,8 +37,6 @@ class ChatListView extends StatelessWidget {
|
||||
bottomNavigationBar: const ConnectionStatusHeader(),
|
||||
floatingActionButton: selectMode == SelectMode.normal
|
||||
? KeyBoardShortcuts(
|
||||
child:
|
||||
StartChatFloatingActionButton(controller: controller),
|
||||
keysToPress: {
|
||||
LogicalKeyboardKey.controlLeft,
|
||||
LogicalKeyboardKey.keyN
|
||||
@ -46,6 +44,8 @@ class ChatListView extends StatelessWidget {
|
||||
onKeysPressed: () =>
|
||||
VRouter.of(context).to('/newprivatechat'),
|
||||
helpLabel: L10n.of(context)!.newChat,
|
||||
child:
|
||||
StartChatFloatingActionButton(controller: controller),
|
||||
)
|
||||
: null,
|
||||
),
|
||||
|
@ -107,23 +107,22 @@ class ClientChooserButton extends StatelessWidget {
|
||||
...List.generate(
|
||||
clientCount,
|
||||
(index) => KeyBoardShortcuts(
|
||||
child: Container(),
|
||||
keysToPress: _buildKeyboardShortcut(index + 1),
|
||||
helpLabel: L10n.of(context)!.switchToAccount(index + 1),
|
||||
onKeysPressed: () => _handleKeyboardShortcut(matrix, index),
|
||||
child: Container(),
|
||||
),
|
||||
),
|
||||
KeyBoardShortcuts(
|
||||
child: Container(),
|
||||
keysToPress: {
|
||||
LogicalKeyboardKey.controlLeft,
|
||||
LogicalKeyboardKey.tab
|
||||
},
|
||||
helpLabel: L10n.of(context)!.nextAccount,
|
||||
onKeysPressed: () => _nextAccount(matrix),
|
||||
child: Container(),
|
||||
),
|
||||
KeyBoardShortcuts(
|
||||
child: Container(),
|
||||
keysToPress: {
|
||||
LogicalKeyboardKey.controlLeft,
|
||||
LogicalKeyboardKey.shiftLeft,
|
||||
@ -131,8 +130,11 @@ class ClientChooserButton extends StatelessWidget {
|
||||
},
|
||||
helpLabel: L10n.of(context)!.previousAccount,
|
||||
onKeysPressed: () => _previousAccount(matrix),
|
||||
child: Container(),
|
||||
),
|
||||
PopupMenuButton<Object>(
|
||||
onSelected: _clientSelected,
|
||||
itemBuilder: _bundleMenuItems,
|
||||
child: Material(
|
||||
color: Colors.transparent,
|
||||
borderRadius: BorderRadius.circular(99),
|
||||
@ -144,8 +146,6 @@ class ClientChooserButton extends StatelessWidget {
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
onSelected: _clientSelected,
|
||||
itemBuilder: _bundleMenuItems,
|
||||
),
|
||||
],
|
||||
),
|
||||
|
@ -44,12 +44,12 @@ class RecommendedRoomListItem extends StatelessWidget {
|
||||
TextSpan(children: [
|
||||
WidgetSpan(
|
||||
child: Tooltip(
|
||||
message: L10n.of(context)!
|
||||
.numberRoomMembers(room.numJoinedMembers),
|
||||
child: const Icon(
|
||||
Icons.people_outlined,
|
||||
size: 20,
|
||||
),
|
||||
message: L10n.of(context)!
|
||||
.numberRoomMembers(room.numJoinedMembers),
|
||||
),
|
||||
alignment: PlaceholderAlignment.middle,
|
||||
baseline: TextBaseline.alphabetic),
|
||||
|
@ -23,10 +23,10 @@ class SpacesDrawerEntry extends StatelessWidget {
|
||||
final active = controller.activeSpacesEntry == entry.spacesEntry;
|
||||
final leading = room == null
|
||||
? CircleAvatar(
|
||||
child: space.getIcon(active),
|
||||
radius: Avatar.defaultSize / 2,
|
||||
backgroundColor: Theme.of(context).colorScheme.secondary,
|
||||
foregroundColor: Theme.of(context).colorScheme.onSecondary,
|
||||
child: space.getIcon(active),
|
||||
)
|
||||
: Avatar(
|
||||
mxContent: room.avatar,
|
||||
|
@ -133,8 +133,8 @@ class _SpacesHierarchyProposalsState extends State<SpacesHierarchyProposals> {
|
||||
animation: primaryAnimation,
|
||||
secondaryAnimation: secondaryAnimation,
|
||||
transitionType: SharedAxisTransitionType.scaled,
|
||||
child: child,
|
||||
fillColor: Colors.transparent,
|
||||
child: child,
|
||||
);
|
||||
},
|
||||
layoutBuilder: (children) => Stack(
|
||||
|
@ -26,8 +26,8 @@ class StartChatFloatingActionButton extends StatelessWidget {
|
||||
animation: primaryAnimation,
|
||||
secondaryAnimation: secondaryAnimation,
|
||||
transitionType: SharedAxisTransitionType.horizontal,
|
||||
child: child,
|
||||
fillColor: Colors.transparent,
|
||||
child: child,
|
||||
);
|
||||
},
|
||||
layoutBuilder: (children) => Stack(
|
||||
|
@ -131,8 +131,8 @@ class ConnectPageController extends State<ConnectPage> {
|
||||
|
||||
void ssoLoginAction(String id) async {
|
||||
final redirectUrl = kIsWeb
|
||||
? html.window.origin! + '/web/auth.html'
|
||||
: AppConfig.appOpenUrlScheme.toLowerCase() + '://login';
|
||||
? '${html.window.origin!}/web/auth.html'
|
||||
: '${AppConfig.appOpenUrlScheme.toLowerCase()}://login';
|
||||
final url =
|
||||
'${Matrix.of(context).getLoginClient().homeserver?.toString()}/_matrix/client/r0/login/sso/redirect/${Uri.encodeComponent(id)}?redirectUrl=${Uri.encodeQueryComponent(redirectUrl)}';
|
||||
final urlScheme = Uri.parse(redirectUrl).scheme;
|
||||
|
@ -25,7 +25,6 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
|
||||
import 'package:just_audio/just_audio.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:pedantic/pedantic.dart';
|
||||
import 'package:wakelock/wakelock.dart';
|
||||
|
||||
import 'package:fluffychat/utils/platform_infos.dart';
|
||||
@ -121,10 +120,10 @@ class Calling extends StatefulWidget {
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
_MyCallingPage createState() => _MyCallingPage();
|
||||
MyCallingPage createState() => MyCallingPage();
|
||||
}
|
||||
|
||||
class _MyCallingPage extends State<Calling> {
|
||||
class MyCallingPage extends State<Calling> {
|
||||
Room? get room => call?.room;
|
||||
|
||||
String get displayName => call?.displayName ?? '';
|
||||
|
@ -39,10 +39,10 @@ class KeyVerificationDialog extends StatefulWidget {
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_KeyVerificationPageState createState() => _KeyVerificationPageState();
|
||||
KeyVerificationPageState createState() => KeyVerificationPageState();
|
||||
}
|
||||
|
||||
class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
||||
class KeyVerificationPageState extends State<KeyVerificationDialog> {
|
||||
void Function()? originalOnUpdate;
|
||||
late final List<dynamic> sasEmoji;
|
||||
|
||||
|
@ -12,10 +12,10 @@ class QrScannerModal extends StatefulWidget {
|
||||
const QrScannerModal({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_QrScannerModalState createState() => _QrScannerModalState();
|
||||
QrScannerModalState createState() => QrScannerModalState();
|
||||
}
|
||||
|
||||
class _QrScannerModalState extends State<QrScannerModal> {
|
||||
class QrScannerModalState extends State<QrScannerModal> {
|
||||
final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
|
||||
QRViewController? controller;
|
||||
|
||||
|
@ -210,7 +210,7 @@ class StoryPageController extends State<StoryPage> {
|
||||
final tmpDirectory = await getTemporaryDirectory();
|
||||
final fileName =
|
||||
event.content.tryGet<String>('filename') ?? 'unknown_story_video.mp4';
|
||||
final file = File(tmpDirectory.path + '/' + fileName);
|
||||
final file = File('${tmpDirectory.path}/$fileName');
|
||||
await file.writeAsBytes(matrixFile.bytes);
|
||||
if (!mounted) return null;
|
||||
final videoPlayerController =
|
||||
|
@ -29,8 +29,7 @@ class UserBottomSheet extends StatefulWidget {
|
||||
class UserBottomSheetController extends State<UserBottomSheet> {
|
||||
void participantAction(String action) async {
|
||||
// ignore: prefer_function_declarations_over_variables
|
||||
final Function _askConfirmation =
|
||||
() async => (await showOkCancelAlertDialog(
|
||||
final Function askConfirmation = () async => (await showOkCancelAlertDialog(
|
||||
useRootNavigator: false,
|
||||
context: context,
|
||||
title: L10n.of(context)!.areYouSure,
|
||||
@ -88,7 +87,7 @@ class UserBottomSheetController extends State<UserBottomSheet> {
|
||||
widget.onMention!();
|
||||
break;
|
||||
case 'ban':
|
||||
if (await _askConfirmation()) {
|
||||
if (await askConfirmation()) {
|
||||
await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () => widget.user.ban(),
|
||||
@ -97,7 +96,7 @@ class UserBottomSheetController extends State<UserBottomSheet> {
|
||||
}
|
||||
break;
|
||||
case 'unban':
|
||||
if (await _askConfirmation()) {
|
||||
if (await askConfirmation()) {
|
||||
await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () => widget.user.unban(),
|
||||
@ -106,7 +105,7 @@ class UserBottomSheetController extends State<UserBottomSheet> {
|
||||
}
|
||||
break;
|
||||
case 'kick':
|
||||
if (await _askConfirmation()) {
|
||||
if (await askConfirmation()) {
|
||||
await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () => widget.user.kick(),
|
||||
@ -120,7 +119,7 @@ class UserBottomSheetController extends State<UserBottomSheet> {
|
||||
currentLevel: widget.user.powerLevel,
|
||||
);
|
||||
if (newPermission != null) {
|
||||
if (newPermission == 100 && await _askConfirmation() == false) break;
|
||||
if (newPermission == 100 && await askConfirmation() == false) break;
|
||||
await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () => widget.user.setPower(newPermission),
|
||||
@ -139,7 +138,7 @@ class UserBottomSheetController extends State<UserBottomSheet> {
|
||||
Navigator.of(context, rootNavigator: false).pop();
|
||||
break;
|
||||
case 'ignore':
|
||||
if (await _askConfirmation()) {
|
||||
if (await askConfirmation()) {
|
||||
await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () =>
|
||||
|
@ -104,10 +104,13 @@ class BackgroundPush {
|
||||
}
|
||||
|
||||
factory BackgroundPush(
|
||||
Client _client, BuildContext _context, GlobalKey<VRouterState>? router,
|
||||
{final void Function(String errorMsg, {Uri? link})? onFcmError}) {
|
||||
final instance = BackgroundPush.clientOnly(_client);
|
||||
instance.context = _context;
|
||||
Client client,
|
||||
BuildContext context,
|
||||
GlobalKey<VRouterState>? router, {
|
||||
final void Function(String errorMsg, {Uri? link})? onFcmError,
|
||||
}) {
|
||||
final instance = BackgroundPush.clientOnly(client);
|
||||
instance.context = context;
|
||||
// ignore: prefer_initializing_formals
|
||||
instance.router = router;
|
||||
// ignore: prefer_initializing_formals
|
||||
@ -341,9 +344,9 @@ class BackgroundPush {
|
||||
}
|
||||
} catch (e) {
|
||||
Logs().i(
|
||||
'[Push] No self-hosted unified push gateway present: ' + newEndpoint);
|
||||
'[Push] No self-hosted unified push gateway present: $newEndpoint');
|
||||
}
|
||||
Logs().i('[Push] UnifiedPush using endpoint ' + endpoint);
|
||||
Logs().i('[Push] UnifiedPush using endpoint $endpoint');
|
||||
final oldTokens = <String?>{};
|
||||
try {
|
||||
final fcmToken = await firebase?.getToken();
|
||||
|
@ -23,10 +23,10 @@ class FluffyEmojiPickerView extends EmojiPickerBuilder {
|
||||
: super(config, state);
|
||||
|
||||
@override
|
||||
_DefaultEmojiPickerViewState createState() => _DefaultEmojiPickerViewState();
|
||||
DefaultEmojiPickerViewState createState() => DefaultEmojiPickerViewState();
|
||||
}
|
||||
|
||||
class _DefaultEmojiPickerViewState extends State<FluffyEmojiPickerView>
|
||||
class DefaultEmojiPickerViewState extends State<FluffyEmojiPickerView>
|
||||
with SingleTickerProviderStateMixin {
|
||||
PageController? _pageController;
|
||||
TabController? _tabController;
|
||||
@ -267,12 +267,12 @@ class _DefaultEmojiPickerViewState extends State<FluffyEmojiPickerView>
|
||||
return TextButton(
|
||||
onPressed: onPressed,
|
||||
onLongPress: onLongPressed,
|
||||
child: child,
|
||||
style: ButtonStyle(
|
||||
padding: MaterialStateProperty.all(EdgeInsets.zero),
|
||||
minimumSize: MaterialStateProperty.all(Size.zero),
|
||||
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
||||
),
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
return GestureDetector(
|
||||
|
@ -1,3 +1,5 @@
|
||||
// ignore_for_file: depend_on_referenced_packages
|
||||
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'dart:typed_data';
|
||||
|
@ -33,15 +33,15 @@ Future<void> pushHelper(
|
||||
Logs().wtf('Push Helper has crashed!', e, s);
|
||||
|
||||
// Initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project
|
||||
final _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
|
||||
await _flutterLocalNotificationsPlugin.initialize(
|
||||
final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
|
||||
await flutterLocalNotificationsPlugin.initialize(
|
||||
const InitializationSettings(
|
||||
android: AndroidInitializationSettings('notifications_icon'),
|
||||
iOS: IOSInitializationSettings(),
|
||||
),
|
||||
onSelectNotification: onSelectNotification,
|
||||
);
|
||||
_flutterLocalNotificationsPlugin.show(
|
||||
flutterLocalNotificationsPlugin.show(
|
||||
0,
|
||||
l10n?.newMessageInFluffyChat,
|
||||
l10n?.openAppToReadMessages,
|
||||
@ -83,8 +83,8 @@ Future<void> _tryPushHelper(
|
||||
}
|
||||
|
||||
// Initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project
|
||||
final _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
|
||||
await _flutterLocalNotificationsPlugin.initialize(
|
||||
final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
|
||||
await flutterLocalNotificationsPlugin.initialize(
|
||||
const InitializationSettings(
|
||||
android: AndroidInitializationSettings('notifications_icon'),
|
||||
iOS: IOSInitializationSettings(),
|
||||
@ -102,7 +102,7 @@ Future<void> _tryPushHelper(
|
||||
Logs().v('Notification is a clearing indicator.');
|
||||
if (notification.counts?.unread == 0) {
|
||||
if (notification.counts == null || notification.counts?.unread == 0) {
|
||||
await _flutterLocalNotificationsPlugin.cancelAll();
|
||||
await flutterLocalNotificationsPlugin.cancelAll();
|
||||
final store = await SharedPreferences.getInstance();
|
||||
await store.setString(
|
||||
SettingKeys.notificationCurrentIds, json.encode({}));
|
||||
@ -185,7 +185,7 @@ Future<void> _tryPushHelper(
|
||||
iOS: iOSPlatformChannelSpecifics,
|
||||
);
|
||||
|
||||
await _flutterLocalNotificationsPlugin.show(
|
||||
await flutterLocalNotificationsPlugin.show(
|
||||
id,
|
||||
event.room.displayname,
|
||||
body,
|
||||
|
@ -15,7 +15,7 @@ extension ResizeImage on MatrixFile {
|
||||
|
||||
Future<MatrixVideoFile> resizeVideo() async {
|
||||
final tmpDir = await getTemporaryDirectory();
|
||||
final tmpFile = File(tmpDir.path + '/' + name);
|
||||
final tmpFile = File('${tmpDir.path}/$name');
|
||||
MediaInfo? mediaInfo;
|
||||
await tmpFile.writeAsBytes(bytes);
|
||||
try {
|
||||
@ -37,7 +37,7 @@ extension ResizeImage on MatrixFile {
|
||||
Future<MatrixImageFile?> getVideoThumbnail() async {
|
||||
if (!PlatformInfos.isMobile) return null;
|
||||
final tmpDir = await getTemporaryDirectory();
|
||||
final tmpFile = File(tmpDir.path + '/' + name);
|
||||
final tmpFile = File('${tmpDir.path}/$name');
|
||||
if (await tmpFile.exists() == false) {
|
||||
await tmpFile.writeAsBytes(bytes);
|
||||
}
|
||||
|
@ -1,13 +0,0 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:isolate/isolate.dart';
|
||||
|
||||
Future<T> runInBackground<T, U>(
|
||||
FutureOr<T> Function(U arg) function, U arg) async {
|
||||
final isolate = await IsolateRunner.spawn();
|
||||
try {
|
||||
return await isolate.run(function, arg);
|
||||
} finally {
|
||||
await isolate.close();
|
||||
}
|
||||
}
|
@ -9,9 +9,9 @@ extension StreamExtension on Stream {
|
||||
var gotMessage = false;
|
||||
// as we call our inline-defined function recursively we need to make sure that the
|
||||
// variable exists prior of creating the function. Silly dart.
|
||||
Function? _onMessage;
|
||||
Function? onMessage;
|
||||
// callback to determine if we should send out an update
|
||||
_onMessage = () {
|
||||
onMessage = () {
|
||||
// do nothing if it is already closed
|
||||
if (controller.isClosed) {
|
||||
return;
|
||||
@ -25,7 +25,7 @@ extension StreamExtension on Stream {
|
||||
// method to send out an update!
|
||||
timer = null;
|
||||
if (gotMessage) {
|
||||
_onMessage?.call();
|
||||
onMessage?.call();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
@ -33,7 +33,7 @@ extension StreamExtension on Stream {
|
||||
gotMessage = true;
|
||||
}
|
||||
};
|
||||
final subscription = listen((_) => _onMessage?.call(),
|
||||
final subscription = listen((_) => onMessage?.call(),
|
||||
onDone: () => controller.close(),
|
||||
onError: (e, s) => controller.addError(e, s));
|
||||
// add proper cleanup to the subscription and the controller, to not memory leak
|
||||
|
@ -80,8 +80,8 @@ extension UiaRequestManager on MatrixState {
|
||||
),
|
||||
);
|
||||
default:
|
||||
final url = Uri.parse(client.homeserver.toString() +
|
||||
'/_matrix/client/r0/auth/$stage/fallback/web?session=${uiaRequest.session}');
|
||||
final url = Uri.parse(
|
||||
'${client.homeserver}/_matrix/client/r0/auth/$stage/fallback/web?session=${uiaRequest.session}');
|
||||
launch(
|
||||
url.toString(),
|
||||
forceSafariVC: true,
|
||||
|
@ -82,7 +82,7 @@ class UpdateCheckerNoStore {
|
||||
final dir = await getTemporaryDirectory();
|
||||
final response = await get(downloadUri(metadata));
|
||||
if (response.statusCode == 200) {
|
||||
final file = File(dir.path + '/fluffychat.msix');
|
||||
final file = File('${dir.path}/fluffychat.msix');
|
||||
await file.writeAsBytes(response.bodyBytes);
|
||||
Process.start(file.path, [], runInShell: true);
|
||||
} else {
|
||||
|
@ -80,7 +80,7 @@ class UrlLauncher {
|
||||
final newHost = uri.host.split('.').map((hostPartEncoded) {
|
||||
final hostPart = Uri.decodeComponent(hostPartEncoded);
|
||||
final hostPartPunycode = punycodeEncode(hostPart);
|
||||
return hostPartPunycode != hostPart + '-'
|
||||
return hostPartPunycode != '$hostPart-'
|
||||
? 'xn--$hostPartPunycode'
|
||||
: hostPart;
|
||||
}).join('.');
|
||||
|
@ -24,10 +24,10 @@ class ChatSettingsPopupMenu extends StatefulWidget {
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
_ChatSettingsPopupMenuState createState() => _ChatSettingsPopupMenuState();
|
||||
ChatSettingsPopupMenuState createState() => ChatSettingsPopupMenuState();
|
||||
}
|
||||
|
||||
class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
|
||||
class ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
|
||||
StreamSubscription? notificationChangeSub;
|
||||
|
||||
@override
|
||||
@ -108,22 +108,22 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
KeyBoardShortcuts(
|
||||
child: Container(),
|
||||
keysToPress: {
|
||||
LogicalKeyboardKey.controlLeft,
|
||||
LogicalKeyboardKey.keyI
|
||||
},
|
||||
helpLabel: L10n.of(context)!.chatDetails,
|
||||
onKeysPressed: _showChatDetails,
|
||||
child: Container(),
|
||||
),
|
||||
KeyBoardShortcuts(
|
||||
child: Container(),
|
||||
keysToPress: {
|
||||
LogicalKeyboardKey.controlLeft,
|
||||
LogicalKeyboardKey.keyW
|
||||
},
|
||||
helpLabel: L10n.of(context)!.matrixWidgets,
|
||||
onKeysPressed: _showWidgets,
|
||||
child: Container(),
|
||||
),
|
||||
PopupMenuButton(
|
||||
onSelected: (String choice) async {
|
||||
|
@ -12,10 +12,10 @@ class ConnectionStatusHeader extends StatefulWidget {
|
||||
const ConnectionStatusHeader({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_ConnectionStatusHeaderState createState() => _ConnectionStatusHeaderState();
|
||||
ConnectionStatusHeaderState createState() => ConnectionStatusHeaderState();
|
||||
}
|
||||
|
||||
class _ConnectionStatusHeaderState extends State<ConnectionStatusHeader> {
|
||||
class ConnectionStatusHeaderState extends State<ConnectionStatusHeader> {
|
||||
late final StreamSubscription _onSyncSub;
|
||||
|
||||
@override
|
||||
|
@ -8,7 +8,7 @@ class EmptyPage extends StatelessWidget {
|
||||
const EmptyPage({this.loading = false, Key? key}) : super(key: key);
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final _width = min(MediaQuery.of(context).size.width, EmptyPage._width);
|
||||
final width = min(MediaQuery.of(context).size.width, EmptyPage._width);
|
||||
return Scaffold(
|
||||
// Add invisible appbar to make status bar on Android tablets bright.
|
||||
appBar: AppBar(
|
||||
@ -25,15 +25,15 @@ class EmptyPage extends StatelessWidget {
|
||||
tag: 'info-logo',
|
||||
child: Image.asset(
|
||||
'assets/info-logo.png',
|
||||
width: _width,
|
||||
height: _width,
|
||||
width: width,
|
||||
height: width,
|
||||
),
|
||||
),
|
||||
),
|
||||
if (loading)
|
||||
Center(
|
||||
child: SizedBox(
|
||||
width: _width,
|
||||
width: width,
|
||||
child: const LinearProgressIndicator(),
|
||||
),
|
||||
),
|
||||
|
@ -15,10 +15,10 @@ class LockScreen extends StatefulWidget {
|
||||
const LockScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_LockScreenState createState() => _LockScreenState();
|
||||
LockScreenState createState() => LockScreenState();
|
||||
}
|
||||
|
||||
class _LockScreenState extends State<LockScreen> {
|
||||
class LockScreenState extends State<LockScreen> {
|
||||
final TextEditingController _textEditingController = TextEditingController();
|
||||
final FocusNode _focusNode = FocusNode();
|
||||
bool _wrongInput = false;
|
||||
|
@ -6,10 +6,10 @@ class LogViewer extends StatefulWidget {
|
||||
const LogViewer({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_LogViewerState createState() => _LogViewerState();
|
||||
LogViewerState createState() => LogViewerState();
|
||||
}
|
||||
|
||||
class _LogViewerState extends State<LogViewer> {
|
||||
class LogViewerState extends State<LogViewer> {
|
||||
Level logLevel = Level.debug;
|
||||
double fontSize = 14;
|
||||
@override
|
||||
|
@ -17,10 +17,10 @@ class SettingsSwitchListTile extends StatefulWidget {
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_SettingsSwitchListTileState createState() => _SettingsSwitchListTileState();
|
||||
SettingsSwitchListTileState createState() => SettingsSwitchListTileState();
|
||||
}
|
||||
|
||||
class _SettingsSwitchListTileState extends State<SettingsSwitchListTile> {
|
||||
class SettingsSwitchListTileState extends State<SettingsSwitchListTile> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return FutureBuilder<bool>(
|
||||
|
22
pubspec.lock
22
pubspec.lock
@ -579,7 +579,7 @@ packages:
|
||||
name: flutter_lints
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
version: "2.0.1"
|
||||
flutter_local_notifications:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -612,7 +612,7 @@ packages:
|
||||
name: flutter_map
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
version: "2.2.0"
|
||||
flutter_math_fork:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -712,7 +712,7 @@ packages:
|
||||
name: flutter_slidable
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
version: "2.0.0"
|
||||
flutter_svg:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -750,7 +750,7 @@ packages:
|
||||
name: flutter_webrtc
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.8.7"
|
||||
version: "0.9.2"
|
||||
frontend_server_client:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -834,12 +834,12 @@ packages:
|
||||
source: hosted
|
||||
version: "0.7.0"
|
||||
hive:
|
||||
dependency: transitive
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: hive
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.2.1"
|
||||
version: "2.2.3"
|
||||
hive_flutter:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -988,7 +988,7 @@ packages:
|
||||
source: git
|
||||
version: "0.1.4"
|
||||
latlong2:
|
||||
dependency: transitive
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: latlong2
|
||||
url: "https://pub.dartlang.org"
|
||||
@ -1000,7 +1000,7 @@ packages:
|
||||
name: lints
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
version: "2.0.0"
|
||||
lists:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -1912,7 +1912,7 @@ packages:
|
||||
source: hosted
|
||||
version: "0.2.0"
|
||||
uuid:
|
||||
dependency: transitive
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: uuid
|
||||
url: "https://pub.dartlang.org"
|
||||
@ -2059,12 +2059,12 @@ packages:
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
webrtc_interface:
|
||||
dependency: transitive
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: webrtc_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
version: "1.0.7"
|
||||
win32:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
12
pubspec.yaml
12
pubspec.yaml
@ -38,20 +38,21 @@ dependencies:
|
||||
flutter_local_notifications: ^9.7.0
|
||||
flutter_localizations:
|
||||
sdk: flutter
|
||||
flutter_map: ^1.1.0
|
||||
flutter_map: ^2.2.0
|
||||
flutter_matrix_html: ^1.1.0
|
||||
flutter_olm: ^1.2.0
|
||||
flutter_openssl_crypto: ^0.1.0
|
||||
flutter_ringtone_player: ^3.1.1
|
||||
flutter_secure_storage: ^5.1.0
|
||||
flutter_slidable: ^1.2.0
|
||||
flutter_slidable: ^2.0.0
|
||||
flutter_svg: ^0.22.0
|
||||
flutter_typeahead: ^4.0.0
|
||||
flutter_web_auth: ^0.4.0
|
||||
flutter_webrtc: ^0.8.7
|
||||
flutter_webrtc: ^0.9.2
|
||||
future_loading_dialog: ^0.2.3
|
||||
geolocator: ^7.6.2
|
||||
handy_window: ^0.1.6
|
||||
hive: ^2.2.3
|
||||
hive_flutter: ^1.1.0
|
||||
http: ^0.13.4
|
||||
image: ^3.1.1
|
||||
@ -59,6 +60,7 @@ dependencies:
|
||||
intl: any
|
||||
just_audio: ^0.9.20
|
||||
keyboard_shortcuts: ^0.1.4
|
||||
latlong2: ^0.8.1
|
||||
localstorage: ^4.0.0+1
|
||||
lottie: ^1.2.2
|
||||
matrix: ^0.11.2
|
||||
@ -85,14 +87,16 @@ dependencies:
|
||||
unifiedpush: ^4.0.0
|
||||
universal_html: ^2.0.8
|
||||
url_launcher: ^6.0.20
|
||||
uuid: ^3.0.6
|
||||
video_compress: ^3.1.1
|
||||
video_player: ^2.2.18
|
||||
vrouter: ^1.2.0+21
|
||||
wakelock: ^0.6.1+1
|
||||
webrtc_interface: ^1.0.7
|
||||
|
||||
dev_dependencies:
|
||||
dart_code_metrics: ^4.10.1
|
||||
flutter_lints: ^1.0.4
|
||||
flutter_lints: ^2.0.1
|
||||
flutter_native_splash: ^2.0.3+1
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
|
@ -16,8 +16,7 @@ void main() async {
|
||||
final missing = commands.where((c) => !translated.contains(c)).toList();
|
||||
|
||||
expect(0, missing.length,
|
||||
reason: 'missing hints for ' +
|
||||
missing.toString() +
|
||||
'\nAdding hints? See scripts/generate_command_hints_glue.sh');
|
||||
reason:
|
||||
'missing hints for $missing\nAdding hints? See scripts/generate_command_hints_glue.sh');
|
||||
});
|
||||
}
|
||||
|
@ -1,3 +1,5 @@
|
||||
// ignore_for_file: depend_on_referenced_packages
|
||||
|
||||
import 'package:matrix/encryption/utils/key_verification.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:matrix_api_lite/fake_matrix_api.dart';
|
||||
|
Loading…
Reference in New Issue
Block a user