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