chore: Update dependencies

This commit is contained in:
Christian Pauly 2022-08-14 16:59:21 +02:00
parent 84c81382fb
commit 4edbb13e75
52 changed files with 163 additions and 175 deletions

View File

@ -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

View File

@ -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;

View File

@ -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 = {};

View File

@ -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();

View File

@ -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 &&

View File

@ -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),
),
],
);

View File

@ -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 {

View File

@ -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();

View File

@ -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(

View File

@ -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

View File

@ -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;

View File

@ -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(

View File

@ -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;

View File

@ -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)'),
),
],
)

View File

@ -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);
}

View File

@ -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,
)),
],

View File

@ -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),
);
}

View File

@ -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) {

View File

@ -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(),
],

View File

@ -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;
}

View File

@ -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,
),

View File

@ -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,
),
],
),

View File

@ -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),

View File

@ -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,

View File

@ -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(

View File

@ -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(

View File

@ -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;

View File

@ -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 ?? '';

View File

@ -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;

View File

@ -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;

View File

@ -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 =

View File

@ -29,15 +29,14 @@ 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(
useRootNavigator: false,
context: context,
title: L10n.of(context)!.areYouSure,
okLabel: L10n.of(context)!.yes,
cancelLabel: L10n.of(context)!.no,
) ==
OkCancelResult.ok);
final Function askConfirmation = () async => (await showOkCancelAlertDialog(
useRootNavigator: false,
context: context,
title: L10n.of(context)!.areYouSure,
okLabel: L10n.of(context)!.yes,
cancelLabel: L10n.of(context)!.no,
) ==
OkCancelResult.ok);
switch (action) {
case 'report':
final event = widget.user;
@ -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: () =>

View File

@ -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();

View File

@ -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(

View File

@ -1,3 +1,5 @@
// ignore_for_file: depend_on_referenced_packages
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';

View File

@ -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,

View File

@ -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);
}

View File

@ -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();
}
}

View File

@ -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

View File

@ -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,

View File

@ -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 {

View File

@ -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('.');

View File

@ -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 {

View File

@ -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

View File

@ -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(),
),
),

View File

@ -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;

View File

@ -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

View File

@ -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>(

View File

@ -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:

View File

@ -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

View File

@ -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');
});
}

View File

@ -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';